Python Selenium Webdriver - 动态更改代理设置

时间:2015-04-21 15:26:36

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

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

3 个答案:

答案 0 :(得分:5)

这是一个稍微陈旧的问题。 但实际上可以通过“ hacky方式 ”动态更改代理 我将使用 Selenium JS与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 :(得分:1)

要使用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 :(得分:1)

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