web-dev-qa-db-ja.com

python webdriver?でphantomjs / ghostdriverのプロキシを設定するにはどうすればよいですか?

HTTPプロキシ経由でリクエストをルーティングする方法を見つけようとしています。

私はこのようなwebdriverを初期化しています:

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

私はドキュメントとソースを調べましたが、webdriverを介してphantomjsでプロキシサーバーを使用する方法を見つけることができないようです。

助言がありますか?

24
erikcw

以下は、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)
72
Alex Nik

少し掘り下げて、機能がそこにあることがわかりましたが、公開されていません。そのため、パッチを適用するには、便利なモンキーレンチが必要です。この機能が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)
6
Pykler

以下は、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)
5
Chiedo

最終的に、service_argsと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がヘッダーとしてプロキシに渡されないため、手動で両方を行う必要があると推測するのは危険です。

0
Tom