25

我试图弄清楚如何通过 HTTP 代理路由我的请求。

我正在像这样初始化 webdriver:

user_agent = 'my user agent 1.0'
DesiredCapabilities.PHANTOMJS['phantomjs.page.settings.userAgent'] = user_agent
driver = webdriver.PhantomJS()

我已经浏览了文档和源代码,似乎找不到通过 webdriver 使用带有 phantomjs 的代理服务器的方法。

有什么建议么?

4

5 回答 5

74

下面是如何在 Python 中为 PhantomJs 设置代理的示例。您可以更改代理类型:socks5/http。

service_args = [
    '--proxy=127.0.0.1:9999',
    '--proxy-type=socks5',
    ]
browser = webdriver.PhantomJS('../path_to/phantomjs',service_args=service_args)
于 2013-05-03T07:13:34.877 回答
6

我挖了一点,发现功能在那里,但没有暴露出来。所以它需要一个方便的活动扳手来修补它。这是适用于我的解决方案,直到此功能在 webdriver 调用中完全公开。

编辑:似乎 service_args 现在暴露了,你不再需要修补 selenium 来使用代理......请参阅@alex-czech 答案以了解如何使用。

from selenium import webdriver
from selenium.webdriver.phantomjs.service import Service as PhantomJSService

phantomjs_path = '/usr/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs'
# monkey patch Service temporarily to include desired args
class NewService(PhantomJSService):
    def __init__(self, *args, **kwargs):
        service_args = kwargs.setdefault('service_args', [])
        service_args += [
            '--proxy=localhost:8080',
            '--proxy-type=http',
        ]
        super(NewService, self).__init__(*args, **kwargs)
webdriver.phantomjs.webdriver.Service = NewService
# init the webdriver
self.driver = webdriver.PhantomJS(phantomjs_path)
# undo monkey patch
webdriver.phantomjs.webdriver.Service = PhantomJSService

以下设置也很有用,尤其是在使用可能需要很长时间才能加载的代理时。

max_wait = 60
self.driver.set_window_size(1024, 768)
self.driver.set_page_load_timeout(max_wait)
self.driver.set_script_timeout(max_wait)
于 2013-03-29T08:01:12.813 回答
5

以下是如何在 Ruby 中对 Webdriver 执行相同操作。在我深入研究源代码之前,我无法在网上任何地方找到它:

phantomjs_args = [ '--proxy=127.0.0.1:9999', '--proxy-type=socks5']
phantomjs_caps = { "phantomjs.cli.args" => phantomjs_args }
driver = Selenium::WebDriver.for(:phantomjs, :desired_capabilities => phantomjs_caps)
于 2015-03-21T13:40:57.217 回答
0

PhantomJS 更新了 CLI 参数而不更新文档。代理类型必须包含在代理地址中,如下所示:

service_args = ['--proxy=http://0.0.0.0:0']
driver = webdriver.PhantomJS(service_args=service_args)
于 2021-01-19T20:07:10.883 回答
0

我最终需要在 service_args 和作为代理身份验证标头中传递凭据。我不相信 phantomjs 正确地传递代理身份验证。

service_args = [
    "--ignore-ssl-errors=true",
    "--ssl-protocol=any",
    "--proxy={}".format(proxy),
    "--proxy-type=http",
]

caps = DesiredCapabilities.PHANTOMJS

authentication_token = "Basic " + base64.b64encode(b'{}:{}'.format(username, password))

caps['phantomjs.page.customHeaders.Proxy-Authorization'] = authentication_token

self.driver = webdriver.PhantomJS(
        service_args=service_args,
        desired_capabilities=caps,
        executable_path="./phantomjs-2.1.1-linux-x86_64/bin/phantomjs")

代理的结构定义为http://username:password@domain:port

我冒昧地猜测第一个身份验证参数没有作为标头传递给代理,因此您需要手动执行这两项操作。

于 2017-10-19T16:48:49.353 回答