我正试图弄清楚如何通过HTTP代理路由我的请求。
我正在初始化webdriver:
user_agent = 'my user agent 1.0'
DesiredCapabilities.PHANTOMJS['phantomjs.page.settings.userAgent'] = user_agent
driver = webdriver.PhantomJS()
我已经浏览了文档和源代码,似乎找不到通过webdriver使用带有phantomjs的代理服务器的方法。
有什么建议吗?
答案 0 :(得分:72)
以下是如何在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)
答案 1 :(得分: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)
答案 2 :(得分: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)
答案 3 :(得分:0)
我最终需要传递service_args和amp;中的凭据。作为proxy-auth标头。我不相信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
我猜测第一个auth-parameters没有作为标题传递给代理,所以你需要手动完成这两个参数。
答案 4 :(得分:0)
PhantomJS 在没有更新文档的情况下更新了 CLI 参数。代理类型必须包含在代理地址中,如下所示:
service_args = ['--proxy=http://0.0.0.0:0']
driver = webdriver.PhantomJS(service_args=service_args)