it-swarm.com.de

Wie setze ich einen Proxy für Phantomjs/Ghostdriver in Python-Webdriver

Ich versuche herauszufinden, wie ich meine Anfragen über einen HTTP-Proxy weiterleiten kann.

Ich initialisiere den Webtreiber so:

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

Ich habe die Dokumente und die Quelle durchgesehen und kann anscheinend keinen Weg finden, einen Proxy-Server mit Phantomjs für Web-Treiber zu verwenden.

Irgendwelche Vorschläge?

24
erikcw

Nachfolgend finden Sie ein Beispiel zum Festlegen eines Proxy für PhantomJs in Python. Sie können den Proxy-Typ ändern: 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

Ich habe ein wenig gegraben und festgestellt, dass die Funktionalität vorhanden ist, aber nicht sichtbar ist. Daher ist ein praktischer Schraubenschlüssel erforderlich, um ihn zu reparieren. Hier ist die Lösung, die für mich funktioniert, bis diese Funktionalität im Webdriver-Aufruf vollständig zur Verfügung steht.

BEARBEITEN: Es scheint, dass die service_args jetzt offengelegt sind. Sie müssen nicht mehr den Selenium-Patch reparieren, um den Proxy zu verwenden ... siehe @ alex-czech answer.

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

Hilfreich sind auch die folgenden Einstellungen, insbesondere wenn Sie einen Proxy verwenden, dessen Laden sehr lange dauern kann.

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

Im Folgenden wird beschrieben, wie Sie mit dem Web-Treiber in Ruby dasselbe tun. Ich konnte das nirgendwo online finden, bis ich mich mit dem Quellcode befasst habe:

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

Am Ende musste ich die Anmeldeinformationen in service_args & als Proxy-Auth-Header übergeben. Ich glaube nicht, dass phantomjs die Proxy-Berechtigung korrekt weitergibt.

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")

Wenn die Struktur des Proxys als http://username:[email protected]:port definiert ist

Ich gehe davon aus, dass die ersten Auth-Parameter nicht als Header an den Proxy übergeben werden. Sie müssen also beide manuell ausführen.

0
Tom