Python Selenium Webdriver - 即时更改代理设置
Python Selenium Webdriver - Changing proxy settings on the fly
我目前成功地使用下面的代码将代理与 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)
这是一个有点老的问题。
但实际上可以通过“hacky way”动态更改代理
我打算将 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 是一个 string 包含要运行的脚本,用 ``)
括起来
第 3 步::访问您的网站
driver.get("https://whatismyip.com");
说明:以上代码利用 Firefox 的 API 来使用 JavaScript 代码更改首选项。
要使用 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://....")
使用 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)
p.s。 selenium.webdriver.common.proxy.Proxy
.add_to_capabilities()
也可以在指定代理时使用(因此您不需要使用上面的 c
dict。)
我目前成功地使用下面的代码将代理与 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)
这是一个有点老的问题。 但实际上可以通过“hacky way”动态更改代理 我打算将 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 是一个 string 包含要运行的脚本,用 ``)
括起来第 3 步::访问您的网站
driver.get("https://whatismyip.com");
说明:以上代码利用 Firefox 的 API 来使用 JavaScript 代码更改首选项。
要使用 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://....")
使用 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)
p.s。 selenium.webdriver.common.proxy.Proxy
.add_to_capabilities()
也可以在指定代理时使用(因此您不需要使用上面的 c
dict。)