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