python-3.x - 更改 chromedriver 中的代理以进行抓取
问题描述
我正在使用 selenium 和 Chrome 抓取 Bet365,这可能是我遇到的最棘手的网站之一。这个页面的问题是,即使我的刮板处于睡眠状态,所以它的运行速度绝不会比人类更快,有时,它会在随机时间(半到 2 小时之间)阻止我的 ip .
所以,我正在寻找代理来更改我的 IP 并恢复我的抓取。这就是我试图决定如何解决这个问题的地方
我使用了 2 个不同的免费 IP 提供商,如下所示
我无法完成这项工作,我正在通过电子邮件发送他们的支持,但我所拥有的应该可以工作如下
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 会比我原来的慢得多,没有代理。
所以,我的问题是,预计使用代理抓取会慢得多,还是取决于使用的代理?如果是这样,有没有人推荐不同的(或更好的,当然)方法?
解决方案
我在您的方法或代码块中都没有看到任何重大问题。但是,另一种方法是使用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
推荐阅读
- c# - 无法在 HtmlAgilityPack C# 中使用 X-Path 获取 html 元素
- python - 是否可以在 pymysql 驱动程序上使用 selectinload 和 yield_per?
- angular - 为 Angular Material 表选择每页的所有当前页面
- javascript - 动态生成的元素上的 Jquery Click 事件不起作用
- php - 如何将php变量设置为输入文本html的值
- amazon-web-services - 用于自动缩放组 terraform 的弹性 IP
- php - 赋值在二维数组内不生效
- google-bigquery - 如何使用 sql 在 google bigquery 中获取字段名称的模式?
- php - 服务器端 dataTable 下拉过滤器仅显示第一页中的数据 | PHP, SQL 服务器
- swift - 如何使 ViewController 类符合协议并将其设置为“self”