我只是想知道您将如何为每个请求设置特定的代理?!
以下块引用是文档对此的唯一说明。此外,该文档仅提供了 Java 的示例......
Firefox 版本 48 及更高版本 - GeckoDriver
Firefox 在配置文件中维护其代理配置。您可以在配置文件中预设代理并使用该 Firefox 配置文件,或者您可以将其设置在动态创建的配置文件中,如以下示例所示。使用 GeckoDriver 代理必须通过所需的功能。
任何意见,将不胜感激!
通常,如果我使用带有 selenium 的代理,我更喜欢一些易于阅读和理解的东西
class Properties:
def __init__(self):
self.options = Options()
self.options.headless = True
self.options.add_argument("ignore-certificate-errors")
self.options.add_argument("--proxy-server=http://xxx.xxx.xx.54:xx28") #sets a proxy
self.driver = webdriver.Chrome(options=self.options)
我倾向于从“提供免费代理的站点”获取几个不同的代理并对其进行测试,那些不会引发错误的代理我将它们存储在列表或文件中,并在初始化 selenium 类时迭代它们。哪一个起作用的是一个 selenium 运行,如果它被阻塞,还有几个可供选择。我通过抓取这些站点并将它们存储在我的计算机上的文件中来提取代理,这样我下次想要一个工作代理时就不必回到该站点。
about:config
我通过在 Firefox 的页面上设置代理解决了这个问题。这是您执行此操作所需的代码:
devices = {
"mobile" : "Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0",
"desktop" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246"
}
scripts = 'var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); prefs.setIntPref("network.proxy.type", 1); prefs.setCharPref("network.proxy.socks", "' + proxy + '"); prefs.setIntPref("network.proxy.socks_port", port); prefs.setBoolPref("dom.webnotifications.enabled", false); prefs.setCharPref("general.useragent.override", "' + devices[device] + '");'
browser.execute_script(scripts)
如果您不想覆盖 UA,那么您不需要使用设备列表,只需删除脚本中的最后一个 js 规则集。
我之前使用 PhantomJS 设置了代理,但没有使用 Firefox 作为驱动程序。尽管如此,遵循此 SO 帖子的引导(在此处重新粘贴以方便使用):
from selenium.webdriver.common.proxy import Proxy, ProxyType
myProxy = "xx.xx.xx.xx:xxxx"
proxy = Proxy({
'proxyType': ProxyType.MANUAL,
'httpProxy': myProxy,
'ftpProxy': myProxy,
'sslProxy': myProxy,
'noProxy': '' # set this value as desired
})
driver = webdriver.Firefox(proxy=proxy)
driver.get("http://www.google.com")
我会尝试遍历指定代理的列表,并在每个请求上修改(或重新创建)代理变量。如果你想随机化它,只需调用random.choice
代理列表。