使用和随机代理

14

我在想如何为每个请求设置特定的代理?!

以下引用块是文档中唯一提到这点的内容。此外,文档仅提供Java的示例...

Firefox版本48及更高版本 - GeckoDriver
Firefox将其代理配置保存在配置文件中。您可以预置Firefox配置文件中的代理,也可以在即时创建的配置文件上设置它,如下面的示例所示。使用GeckoDriver,代理必须通过所需的能力传递。

感谢任何建议!


@NaveenKumarRB 嗯...这是firefox 47.0.1及以下版本的语法。 - oldboy
它对我来说在Firefox 48及以上版本上也有效。我在Firefox 61上尝试过。 - Naveen Kumar R B
@NaveenKumarRB 我会尝试一下,但我不确定为什么如果这是针对 Firefox 47 及以上版本的实现方式,他们不会将其放入文档中。 - oldboy
以上的代码有什么进展了吗? - Naveen Kumar R B
@NaveenKumarRB还没有实现它。我只是在为时机成熟时做好准备!如果您一个月后再来看一下,我希望到那时已经实现了!我现在被卡在另一个错误上 - oldboy
显示剩余5条评论
3个回答

1

我通过在Firefox的about:config页面上设置代理来解决这个问题。以下是您需要使用的代码:

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规则集即可。

有趣。下次使用代理并遇到此问题时,我将尝试它。 - oldboy

1
通常情况下,如果我在使用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都会在其上运行,如果被阻止了,则可以选择其他几个。我通过抓取这些网站来获取代理并将它们存储在计算机上的文件中,这样下次需要工作代理时就不必再回到该网站了。

0

我以前使用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


1
嗯...你是第二个提到那段代码的人。那段代码正是Selenium官方文档所说的过时代码,“适用于Firefox 47.0.1版本以下”。而当前最新的Firefox版本是61... :/ - oldboy

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