python proxy webdriver phantomjs ghostdriver

¿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.