首页 > 解决方案 > 更改 chromedriver 中的代理以进行抓取

问题描述

我正在使用 selenium 和 Chrome 抓取 Bet365,这可能是我遇到的最棘手的网站之一。这个页面的问题是,即使我的刮板处于睡眠状态,所以它的运行速度绝不会比人类更快,有时,它会在随机时间(半到 2 小时之间)阻止我的 ip .

所以,我正在寻找代理来更改我的 IP 并恢复我的抓取。这就是我试图决定如何解决这个问题的地方

我使用了 2 个不同的免费 IP 提供商,如下所示

https://gimmeproxy.com

我无法完成这项工作,我正在通过电子邮件发送他们的支持,但我所拥有的应该可以工作如下

import requests

api="MY_API_KEY"  #with the free plan I can ask 240 times a day for an IP
adder="&post=true&supportsHttps=true&maxCheckPeriod=3600"

url="https://gimmeproxy.com/api/getProxy?"
r=requests.get(url=url,params=adder)

THIS IS EDITED
apik="api_key={}".format(api)
r=requests.get(url=url,params=apik+adder)

我没有得到任何答复。未找到 404 错误。现在工作,我的坏

我的第二种方法是通过这个其他站点sslproxy

有了这个,你抓取页面,你会得到一个 100 个 IP 的列表,理论上检查和工作。因此,我设置了一个循环,在其中尝试从该列表中随机获取一个 IP,如果它不起作用,则将其从列表中删除并重试。这种方法适用于尝试打开 Bet365。

for n in range(1, 100):
  proxy_index=random.randint(0, len(proxies) - 1)
  proxi=proxies[proxy_index]

  PROXY=proxi['ip']+':'+proxi['port']
  chrome_options = webdriver.ChromeOptions()
  chrome_options.add_argument('--proxy-server={}'.format(PROXY))

  url="https://www.bet365.es"

  try:    
     browser=webdriver.Chrome(path,options=chrome_options)
     browser.get(url)
     WebDriverWait(browser,10)..... #no need to post the whole condition
     break

  except:
     del proxies[proxy_index]
     browser.quit()

好吧,有了这个我成功地尝试打开 Bet365,我仍在检查,但我认为这个 webdriver 会比我原来的慢得多,没有代理。

所以,我的问题是,预计使用代理抓取会慢得多,还是取决于使用的代理?如果是这样,有没有人推荐不同的(或更好的,当然)方法?

标签: python-3.xseleniumgoogle-chromeproxyselenium-chromedriver

解决方案


我在您的方法或代码块中都没有看到任何重大问题。但是,另一种方法是使用Last Checked列中标记的所有代理,这些代理会在Free Proxy List中更新。

作为一种解决方案,您可以编写一个脚本来获取所有可用的代理并在每次初始化程序时动态创建一个列表。下面的程序会从Proxy List中一一调用一个代理,直到成功建立代理连接,并通过Page Title of验证https://www.bet365.es包含文本bet365。可能会出现异常,因为您的程序抓取的免费代理因用户试图通过其代理流量而过载。

  • 代码块:

    driver.get("https://sslproxies.org/")
    driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//th[contains(., 'IP Address')]"))))
    ips = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//tbody//tr[@role='row']/td[position() = 1]")))]
    ports = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//tbody//tr[@role='row']/td[position() = 2]")))]
    driver.quit()
    proxies = []
    for i in range(0, len(ips)):
        proxies.append(ips[i]+':'+ports[i])
    print(proxies)
    for i in range(0, len(proxies)):
        try:
            print("Proxy selected: {}".format(proxies[i]))
            options = webdriver.ChromeOptions()
            options.add_argument('--proxy-server={}'.format(proxies[i]))
            driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
            driver.get("https://www.bet365.es")
            if "Proxy Type" in WebDriverWait(driver, 20).until(EC.title_contains("bet365")):
                # Do your scrapping here
                break
        except Exception:
            driver.quit()
    print("Proxy was Invoked")
    
  • 控制台输出:

    ['190.7.158.58:39871', '175.139.179.65:54980', '186.225.45.146:45672', '185.41.99.100:41258', '43.230.157.153:52986', '182.23.32.66:30898', '36.37.160.253:31450', '93.170.15.214:56305', '36.67.223.67:43628', '78.26.172.44:52490', '36.83.135.183:3128', '34.74.180.144:3128', '206.189.122.177:3128', '103.194.192.42:55546', '70.102.86.204:8080', '117.254.216.97:23500', '171.100.221.137:8080', '125.166.176.153:8080', '185.146.112.24:8080', '35.237.104.97:3128']
    
    Proxy selected: 190.7.158.58:39871
    
    Proxy selected: 175.139.179.65:54980
    
    Proxy selected: 186.225.45.146:45672
    
    Proxy selected: 185.41.99.100:41258
    

推荐阅读