¿Cómo configuro un proxy para phantomjs/ghostdriver en python webdriver?
(4)
A continuación se muestra el ejemplo de cómo configurar proxy para PhantomJs en Python. Puede cambiar el tipo de proxy: calcetines5 / http.
service_args = [
''--proxy=127.0.0.1:9999'',
''--proxy-type=socks5'',
]
browser = webdriver.PhantomJS(''../path_to/phantomjs'',service_args=service_args)
Estoy tratando de encontrar la manera de enrutar mis solicitudes a través de un proxy HTTP.
Estoy inicializando el controlador de web así:
user_agent = ''my user agent 1.0''
DesiredCapabilities.PHANTOMJS[''phantomjs.page.settings.userAgent''] = user_agent
driver = webdriver.PhantomJS()
He revisado los documentos y la fuente y parece que no puedo encontrar la manera de usar un servidor proxy con phantomjs a través de webdriver.
¿Alguna sugerencia?
A continuación, se muestra cómo hacer lo mismo con el Webdriver en Ruby. No pude encontrar esto en ninguna parte en línea hasta que busqué en el código fuente:
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)
Cavé un poco y descubrí que la funcionalidad está ahí, pero no está expuesta. Por lo tanto, se necesita una práctica llave inglesa para repararlo. Aquí está la solución que funciona para mí hasta que esta funcionalidad quede totalmente expuesta en la llamada a webdriver.
EDITAR: parece que los service_args ahora están expuestos, ya no es necesario usar el parche de selenio para usar el proxy ... ver @ alex-checo para saber cómo usarlo.
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
También son útiles las siguientes configuraciones, especialmente cuando se usa un proxy que puede llevar mucho tiempo cargar.
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)
Terminé necesitando pasar las credenciales en service_args y como encabezado proxy-auth. No creo que phantomjs apruebe la autenticación proxy en adelante correctamente.
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")
Donde la estructura del proxy se define como http://username:password@domain:port
Me arriesgaría a adivinar que los primeros parámetros de autenticación no se pasan como un encabezado al proxy, por lo que debe hacer ambos manualmente.