【问题标题】:Python Selenium Webdriver - Proxy: query parametersPython Selenium Webdriver - 代理:查询参数
【发布时间】:2020-03-31 07:01:51
【问题描述】:

我看到的挑战是,通过 selenium,我试图点击一个网站元素(一个 div 附加了一些 js)。 “按钮”将您导航到另一个页面。

如何将浏览器配置为通过代理自动路由请求?

我的代理设置如下: http://api.myproxy.com?key=AAA111BBB6&url=http://awebsitetobrowse.com

我正在尝试将 webdriver (chrome) 放在代理后面

from selenium import webdriver   
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(chrome_options=options)

到目前为止,其中的选项是浏览器窗口大小的一些基本配置。

我见过很多例子(ex1ex2ex3),但不知何故我找不到适合我需要的例子。


import os 
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
PROXY = "http://api.scraperapi.com?api_key=1234&render=true"

from selenium import webdriver   
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % PROXY)
driver = webdriver.Chrome(executable_path = dir_path, chrome_options=chrome_options)

driver.get("https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver")

【问题讨论】:

  • 是否有可能让它更具重现性?例如。你能分享这个代理提供商的名字吗?谢谢。
  • 我正在使用scraperapi.com
  • 你能描述一下当你使用stackoverflow.com/questions/11450158/…的例子时它是如何失败的吗?
  • 它不会失败。我找不到可以配置 webdriver 以构建上述请求的示例。我只能看到chrome_options.add_argument('--proxy-server=http://%s' % PROXY),在那里你有一个固定的http 地址和一个端口。就我而言,我如何将&url=something 放在一起,其中something 是我想查看的页面?

标签: python selenium-webdriver proxy


【解决方案1】:

虽然您使用的代理地址看起来不是一个实际的代理,但它是一个 API,它在处理代理、验证码或任何 IP 阻塞后返回页面本身的 HTML 内容。但是对于不同的场景仍然可以有不同的解决方案。其中一些如下。

场景 1

因此,根据我的说法,如果您以错误的方式使用此 API api 提供了通过代理返回您访问页面的响应的工具。

所以它应该直接在'driver.get()'中使用 地址="http://api.scraperapi.com/?api_key=YOURAPIKEY&url="+url_to_be_visited_via_api

示例代码如下所示:

import os
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
APIKEY=1234 #replace with your API Key
apiURL = "http://api.scraperapi.com/?api_key="+APIKEY+"&render=true&url="

visit_url = "https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver"

from selenium import webdriver
driver = webdriver.Chrome(executable_path = dir_path)
driver.get(apiURL+visit_url)

场景 2

但是如果你有一些提供代理地址和登录的 API 凭据作为响应,那么它可以在 chrome 选项中使用 它与铬本身。

如果 api 的响应类似于

  • “PROTOCOL://user:password@proxyserver:proxyport”(在认证的情况下)
  • “PROTOCOL://proxyserver:proxyport”(在 null 身份验证的情况下)

在这两种情况下,PROTOCOL 都可以像 HTTP、HTTPS、SOCKS4、SOCKS5 等。

该代码应如下所示:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
import requests
proxyapi = "http://api.scraperapi.com?api_key=1234&render=true" 
proxy=requests.get(proxyapi).text

visit_url = "https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver"

from selenium import webdriver   
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server='+proxy)
driver = webdriver.Chrome(executable_path = dir_path, chrome_options=chrome_options)
driver.get(visit_url)

场景 3

但是如果你有一些 API 本身是一个带有 null 身份验证的代理,那么它可以在 chrome 选项中使用 它与铬本身。

该代码应如下所示:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
proxyapi = "http://api.scraperapi.com?api_key=1234&render=true" 

visit_url = "https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver"

from selenium import webdriver   
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server='+proxyapi)
driver = webdriver.Chrome(executable_path = dir_path, chrome_options=chrome_options)
driver.get(visit_url)

因此可以根据不同的场景使用该解决方案。

【讨论】:

  • 这不起作用并且违背了整个目的。当您单击页面上的某些元素以触发导航到另一个页面 (JS) 时,Chrome 需要将请求连接到引擎盖下的代理。
【解决方案2】:

好吧,经过无数次实验,我发现这个东西可以用:

apiURL = "http://api.scraperapi.com/?api_key="+APIKEY+"&render=true&url="

虽然失败了

apiURL = "http://api.scraperapi.com?api_key="+APIKEY+"&render=true&url="

在这里我不得不承认我的无知:我认为两者应该是等价的

【讨论】:

  • 和我在回答中说的不一样
  • 好吧,我错过了我给你的示例代码中的“/”,还有一件事,你有没有设法使用这个 API 作为代理?
  • Avinash,您应该使用 chrome 或 firefox 选项设置代理,而不是手动伪造 url。如前所述,如果您不通过浏览器选项设置代理,您将不会将请求(例如:js 路由)路由到代理。不过,感谢您的帮助。
猜你喜欢
  • 2021-03-28
  • 2013-10-17
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2022-08-04
  • 1970-01-01
相关资源
最近更新 更多