Python Selenium Webdriver - 动态更改代理设置
Posted
技术标签:
【中文标题】Python Selenium Webdriver - 动态更改代理设置【英文标题】:Python Selenium Webdriver - Changing proxy settings on the fly 【发布时间】:2015-06-28 20:58:24 【问题描述】:我目前正在成功地使用下面的代码来使用 Selenium webdriver 的代理。不幸的是,我似乎无法在不重新启动整个浏览器的情况下更改代理设置。我曾希望简单地更新代理设置,就像我设置代理开始时一样,会更改代理,但它似乎不起作用。对此主题的任何帮助将不胜感激。
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", proxyAddress)
profile.set_preference("network.proxy.http_port", proxyPort)
profile.update_preferences()
driver = webdriver.Firefox(firefox_profile=profile)
【问题讨论】:
创建一个链接到您的代理的本地代理。必要时请您的本地代理更改“退出”。 这似乎过于复杂。我希望有一种更简单的方法来做到这一点。 它实际上听起来像 10 行代码,那里有一个 Python 库可以解决任何问题.. 您有没有找到解决方案?或者像@user37203 描述的那样解决问题的python 库?只是问问,在我自己实施之前...... @stylesuxx 不。我从来没有找到这样做的库,所以我放弃了这个项目,所以我从来没有自己解决这个问题。 【参考方案1】:这是一个有点老的问题。 但实际上可以通过“hacky way”动态更改代理 我将在 Firefox 中使用 Selenium JS,但您可以使用您想要的语言进行操作。
第 1 步: 访问“about:config”
driver.get("about:config");
第 2 步:运行更改代理的脚本
var setupScript=`var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", "$proxyUsed.host");
prefs.setIntPref("network.proxy.http_port", "$proxyUsed.port");
prefs.setCharPref("network.proxy.ssl", "$proxyUsed.host");
prefs.setIntPref("network.proxy.ssl_port", "$proxyUsed.port");
prefs.setCharPref("network.proxy.ftp", "$proxyUsed.host");
prefs.setIntPref("network.proxy.ftp_port", "$proxyUsed.port");
`;
//running script below
driver.executeScript(setupScript);
//sleep for 1 sec
driver.sleep(1000);
使用 $abcd 是放置变量的位置,在上面的示例中,我使用的是 ES6,它处理如图所示的连接,您可以使用您选择的其他连接方法,具体取决于您的(SetupScript 是一个字符串,其中包含要运行的脚本,由 `` 括起来)
第 3 步::访问您的网站
driver.get("https://whatismyip.com");
说明:以上代码利用 Firefox 的 API 使用 javascript 代码更改首选项。
【讨论】:
我承认没有测试过这个解决方案,这个项目早就被放弃了,但无论如何我都会接受这个答案。谢谢! 我已经测试过这个解决方案,效果很好。 能提供python版本吗?谢谢 你能提供一个chrome版本吗?请。 对不起一个愚蠢的问题,但你在哪里运行这个脚本?你如何运行它?您可以在其中使用变量还是需要为每个代理创建一个脚本?我想将它与 Java 一起使用,如果这有影响的话。【参考方案2】:使用 Firefox 即时设置代理:
def set_proxy(driver, http_addr='', http_port=0, ssl_addr='', ssl_port=0, socks_addr='', socks_port=0):
driver.execute("SET_CONTEXT", "context": "chrome")
try:
driver.execute_script("""
Services.prefs.setIntPref('network.proxy.type', 1);
Services.prefs.setCharPref("network.proxy.http", arguments[0]);
Services.prefs.setIntPref("network.proxy.http_port", arguments[1]);
Services.prefs.setCharPref("network.proxy.ssl", arguments[2]);
Services.prefs.setIntPref("network.proxy.ssl_port", arguments[3]);
Services.prefs.setCharPref('network.proxy.socks', arguments[4]);
Services.prefs.setIntPref('network.proxy.socks_port', arguments[5]);
""", http_addr, http_port, ssl_addr, ssl_port, socks_addr, socks_port)
finally:
driver.execute("SET_CONTEXT", "context": "content")
用法:
driver = webdriver.Firefox()
set_proxy(driver, http_addr="212.35.56.21", http_port=8080)
driver.get("http://....")
set_proxy(driver, http_addr="212.35.56.22", http_port=8888)
driver.get("http://....")
【讨论】:
我正在尝试使用您的解决方案,但我不断收到KeyError: 'SET_CONTEXT'
,我不知道我做错了什么。甚至找不到有关这些功能的文档。任何帮助深表感谢。谢谢!
一个更简单的临时进入chrome上下文的方法是with driver.context(driver.CONTEXT_CHROME): <...>
【参考方案3】:
使用 Chrome 即时更改代理(在 selenium 3.141.0 上工作,关键点是 driver.start_session(cap)
):
proxy = get_new_proxy() # x.x.x.x:y
c =
"proxyType": "MANUAL",
"httpProxy": proxy,
"sslProxy": proxy
cap = webdriver.DesiredCapabilities.CHROME.copy()
cap['proxy'] = c
driver.start_session(cap)
try:
b.get('https://whatismyip.com')
except Exception as e:
print(e)
附言selenium.webdriver.common.proxy.Proxy
.add_to_capabilities()
也可以在指定代理时使用(因此您不需要使用上面的c
dict。)
【讨论】:
以上是关于Python Selenium Webdriver - 动态更改代理设置的主要内容,如果未能解决你的问题,请参考以下文章
[python] python+selenium+webdriver