web-dev-qa-db-fra.com

Comment définir un proxy pour phantomjs/ghostdriver dans un pilote Web python?

J'essaie de comprendre comment acheminer mes demandes via un proxy HTTP.

J'initialise WebDriver comme ceci:

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

J'ai parcouru les docs et les sources et je n'arrive pas à trouver le moyen d'utiliser un serveur proxy avec phantomjs pour WebDriver.

Aucune suggestion?

24
erikcw

Vous trouverez ci-dessous un exemple de configuration du proxy pour les PhantomJs en Python. Vous pouvez changer le type de proxy: 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

J'ai creusé un peu et j'ai trouvé que la fonctionnalité est là, mais elle n'est pas exposée. Donc, il faut une clé à molette maniable pour le réparer. Voici la solution qui me convient jusqu'à ce que cette fonctionnalité soit entièrement exposée dans l'appel WebDriver.

EDIT: il semble que les services_args sont maintenant exposés, vous n'avez plus besoin de patch monkey Selenium pour utiliser le proxy ... voir la réponse de @ alex-czech pour savoir comment l'utiliser.

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

Les paramètres suivants sont également utiles, en particulier lorsque vous utilisez un proxy dont le chargement peut prendre un temps très long.

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

Voici comment procéder de la même façon avec Webdriver dans Ruby. Je ne pouvais le trouver nulle part en ligne tant que je n'avais pas creusé dans le code source:

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

J'ai fini par avoir besoin de transmettre les informations d'identification à la fois dans service_args et en-tête proxy-auth. Je ne crois pas que Phantomjs transmette correctement l’autorisation du proxy.

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

Où la structure du proxy est définie comme http://username:password@domain:port

Je suppose que les premiers paramètres d'authentification ne sont pas transmis en tant qu'en-tête au proxy, vous devez donc faire les deux manuellement.

0
Tom