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?
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)
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)
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)
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.