Python Selenium Webdriver - 在运行过程中更改代理设置

19

目前我正在成功地使用下面的代码与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)

创建一个本地代理,它可以链接到您的代理。必要时请请求您的本地代理更改“出口”。 - user37203
1
这似乎过于复杂了。希望有更简单的方法来完成这个任务。 - tobloef
实际上听起来就像是10行代码,Python库几乎涵盖了所有领域。 - user37203
你是否偶然找到了解决这个问题的方法?或者有没有像@user37203描述的那样解决该问题的Python库?只是问一下,在我自己实现之前... - stylesuxx
@stylesuxx 没有。我从来没有找到一个能做到这一点的库,而且我放弃了这个项目,所以我也没有解决这个问题。 - tobloef
谢谢您的快速回复,我会寻找替代方案,也许proxychains有一些进程间通信的方法... - stylesuxx
4个回答

12

这是一个略旧的问题。 但实际上可以通过“hacky方式”动态更改代理。 我将使用Selenium JS with Firefox,但你可以使用你想要的语言跟进。

步骤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 代码来更改首选项。


1
我承认我没有测试过这个解决方案,而且这个项目很久以前就被放弃了,但是我仍然会接受这个答案。谢谢! - tobloef
2
我已经测试了这个解决方案,它完美地运行。 - Tarun Lalwani
1
你能提供一个Python版本吗? - erotavlas
你能提供一个 Chrome 版本吗?谢谢。 - wataru
@wataru 很遗憾我不知道如何在Chrome中实现它。 - Bob Kimani
显示剩余2条评论

5

在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://....")

2
我正在尝试使用您的解决方案,但是一直出现“KeyError:'SET_CONTEXT'”错误,我无法弄清楚自己做错了什么。甚至找不到这些函数的文档。非常感谢任何帮助。谢谢! - Mike Vlad
一个更简单的临时进入 Chrome 上下文的方法是 with driver.context(driver.CONTEXT_CHROME): <...> - ivan_pozdeev

4

使用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 字典)。


0
另一个在Selenium中不更改代理的选项是连接到一个旋转代理IP。大多数代理提供商都提供这个功能,每个请求发送到相同的静态代理IP时都会分配一个新的IP。
不过,您需要向旋转IP发送一个实际的请求,所以仅仅使用webdriver.get()打开一个新页面是行不通的,但是您可以通过Python的request模块发送一个普通的get请求,然后Selenium的流量也会被路由到新的IP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接