Comment définir un proxy pour phantomjs / ghostdriver en Python webdriver?

j'essaie de trouver comment acheminer mes requêtes 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 la source et ne semble pas pouvoir trouver un moyen d'utiliser un serveur proxy avec phantomjs pour VIA webdriver.

des suggestions?

24
demandé sur erikcw 2013-02-05 07:30:20

4 réponses

ci-dessous est l'exemple de la façon de définir proxy pour 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
répondu Alex Nik 2013-05-03 10:52:47

j'ai creusé un peu et j'ai trouvé que la fonctionnalité est là, mais il n'est pas exposé. Il faut donc une clé à molette pour la réparer. Voici la solution qui fonctionne pour moi jusqu'à ce que cette fonctionnalité soit pleinement exposée dans l'appel webdriver.

EDIT: il semble que le service_args soit maintenant exposé, vous n'avez plus besoin de patch 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

également utiles sont les les réglages suivants, en particulier lorsque vous utilisez un proxy qui peut prendre beaucoup de temps à charger.

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
répondu Pykler 2013-05-28 17:23:19

ce qui suit est la façon de faire la même chose avec le Webdriver dans Ruby. Je n'ai pas pu trouver ça en ligne jusqu'à ce que je creuse 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
répondu Chiedo 2015-08-15 02:11:46

j'ai fini par avoir besoin de passer les références dans les deux en-têtes service_args & as a proxy-auth. Je ne crois pas que phantomjs passe l'auth proxy correctement.

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 de procuration est définie comme http://username:password@domain:port

je suppose que les premiers paramètres auth ne sont pas passés comme en-tête au proxy, donc vous devez faire les deux manuellement.

0
répondu Tom 2017-10-19 16:48:49