更改chromedriver中的代理以进行抓取

时间:2019-06-01 11:51:50

标签: python-3.x selenium-webdriver proxy

我正在用硒和Chrome抓取Bet365,这可能是我遇到过的最棘手的网站之一。 此页面的问题是,即使我的抓取器入睡,也绝不会以任何方式更快地运行人类,有时甚至会在随机的时间内(半小时到两个小时之间)阻止我的ip

因此,我正在寻找代理来更改我的IP并继续进行抓取。而这正是我试图决定如何解决这个问题的地方

我使用了以下两种不同的免费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)

aa,我没有答案。找不到404错误。现在可以了,我的坏

我的第二种方法是通过另一个网站sslproxy

通过此操作,您刮了一下页面,然后获得了100个IP的列表,这些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会比没有代理的原始webdriver慢得多。

所以,我的问题是,是否期望使用代理进行抓取会更慢,还是取决于所使用的代理?如果是这样,是否有人建议采用其他(或更确切地说是更好)的方法?

1 个答案:

答案 0 :(得分:0)

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

作为解决方案,您可以编写脚本来获取所有可用的代理,并在每次初始化程序时动态创建 List 。以下程序将逐个调用 Proxy List 中的代理,直到建立成功的代理连接并通过https://www.bet365.es Page Title 进行验证,以包含文字 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