Saltar al contenido

¿Cómo configurar el proxy con autenticación en selenium chromedriver python?

No olvides que en las ciencias informáticas un error casi siempre tiene diversas soluciones, de igual modo nosotros aquí te mostraremos lo más óptimo y eficiente.

Solución:

Autenticación de proxy de Selenium Chrome

Configurar el proxy de chromedriver con Selenium usando Python

Si necesita usar un proxy con python y la biblioteca Selenium con chromedriver, generalmente usa el siguiente código (sin ningún nombre de usuario y contraseña:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % hostname + ":" + port)
driver = webdriver.Chrome(chrome_options=chrome_options)

Funciona bien a menos que el proxy requiera autenticación. si el proxy requiere que inicie sesión con un nombre de usuario y contraseña, no funcionará. En este caso, debe utilizar una solución más complicada que se explica a continuación. Por cierto, si incluyes la dirección IP de tu servidor en la lista blanca del proveedor de proxy o del servidor, no debería pedirte credenciales de proxy.

Autenticación de proxy HTTP con Chromedriver en Selenium

Para configurar la autenticación de proxy, generaremos un archivo especial y lo cargaremos en chromedriver dinámicamente usando el siguiente código a continuación. Este código configura selenium con chromedriver para usar un proxy HTTP que requiere autenticación con un par de usuario / contraseña.

import os
import zipfile

from selenium import webdriver

PROXY_HOST = '192.168.3.2'  # rotating proxy or host
PROXY_PORT = 8080 # port
PROXY_USER = 'proxy-user' # username
PROXY_PASS = 'proxy-password' # password


manifest_json = """

    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": 
        "scripts": ["background.js"]
    ,
    "minimum_chrome_version":"22.0.0"

"""

background_js = """
var config = 
        mode: "fixed_servers",
        rules: 
        singleProxy: 
            scheme: "http",
            host: "%s",
            port: parseInt(%s)
        ,
        bypassList: ["localhost"]
        
    ;

chrome.proxy.settings.set(value: config, scope: "regular", function() );

function callbackFn(details) 
    return 
        authCredentials: 
            username: "%s",
            password: "%s"
        
    ;


chrome.webRequest.onAuthRequired.addListener(
            callbackFn,
            urls: [""],
            ['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)


def get_chromedriver(use_proxy=False, user_agent=None):
    path = os.path.dirname(os.path.abspath(__file__))
    chrome_options = webdriver.ChromeOptions()
    if use_proxy:
        pluginfile = 'proxy_auth_plugin.zip'

        with zipfile.ZipFile(pluginfile, 'w') as zp:
            zp.writestr("manifest.json", manifest_json)
            zp.writestr("background.js", background_js)
        chrome_options.add_extension(pluginfile)
    if user_agent:
        chrome_options.add_argument('--user-agent=%s' % user_agent)
    driver = webdriver.Chrome(
        os.path.join(path, 'chromedriver'),
        chrome_options=chrome_options)
    return driver

def main():
    driver = get_chromedriver(use_proxy=True)
    #driver.get('https://www.google.com/search?q=my+ip+address')
    driver.get('https://httpbin.org/ip')

if __name__ == '__main__':
    main()

La función get_chromedriver devuelve el controlador web selenium configurado que puede usar en su aplicación. Este código está probado y funciona bien.

Más información sobre el evento onAuthRequired en Chrome.

Aquí hay una solución rápida y creativa que no requiere modificar las Opciones de selenium o cargar un archivo en chromedriver. Hace uso de pyautogui (puede usar cualquier paquete de Python que simule key presiona) para ingresar los detalles de autenticación del proxy. También utiliza subprocesos para tener en cuenta la ventana emergente de autenticación de Chrome que, de lo contrario, pausaría el script.

import time
from threading import Thread
import pyautogui
from selenium.webdriver.chrome.options import Options
from selenium import webdriver

hostname = "HOST_NAME"
port = "PORT"
proxy_username = "USERNAME"
proxy_password = "PASSWORD"

chrome_options = Options()
chrome_options.add_argument('--proxy-server='.format(hostname + ":" + port))
driver = webdriver.Chrome(options=chrome_options)


def enter_proxy_auth(proxy_username, proxy_password):
    time.sleep(1)
    pyautogui.typewrite(proxy_username)
    pyautogui.press('tab')
    pyautogui.typewrite(proxy_password)
    pyautogui.press('enter')


def open_a_page(driver, url):
    driver.get(url)


Thread(target=open_a_page, args=(driver, "http://www.example.com/")).start()
Thread(target=enter_proxy_auth, args=(proxy_username, proxy_password)).start()

NOTA: Para cualquier proyecto serio o conjunto de pruebas, recomendaría optar por una solución más sólida. Sin embargo, si solo está experimentando y necesita una solución rápida y eficaz, esta es una opción.

Después de horas de investigar con el mismo problema que tuviste, encontré este sitio web https://botproxy.net/docs/how-to/setting-chromedriver-proxy-auth-with-selenium-using-python/. Lo probé y funcionó perfectamente para mí.

import os
import zipfile

from selenium import webdriver

PROXY_HOST = 'x.botproxy.net'  # rotating proxy
PROXY_PORT = 8080
PROXY_USER = 'proxy-user'
PROXY_PASS = 'proxy-password'


manifest_json = """

    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": 
        "scripts": ["background.js"]
    ,
    "minimum_chrome_version":"22.0.0"

"""

background_js = """
var config = 
        mode: "fixed_servers",
        rules: 
          singleProxy: 
            scheme: "http",
            host: "%s",
            port: parseInt(%s)
          ,
          bypassList: ["localhost"]
        
      ;

chrome.proxy.settings.set(value: config, scope: "regular", function() );

function callbackFn(details) 
    return 
        authCredentials: 
            username: "%s",
            password: "%s"
        
    ;


chrome.webRequest.onAuthRequired.addListener(
            callbackFn,
            urls: [""],
            ['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)


def get_chromedriver(use_proxy=False, user_agent=None):
    path = os.path.dirname(os.path.abspath(__file__))
    chrome_options = webdriver.ChromeOptions()
    if use_proxy:
        pluginfile = 'proxy_auth_plugin.zip'

        with zipfile.ZipFile(pluginfile, 'w') as zp:
            zp.writestr("manifest.json", manifest_json)
            zp.writestr("background.js", background_js)
        chrome_options.add_extension(pluginfile)
    if user_agent:
        chrome_options.add_argument('--user-agent=%s' % user_agent)
    driver = webdriver.Chrome(
        os.path.join(path, 'chromedriver'),
        chrome_options=chrome_options)
    return driver

def main():
    driver = get_chromedriver(use_proxy=True)
    #driver.get('https://www.google.com/search?q=my+ip+address')
    driver.get('https://httpbin.org/ip')

if __name__ == '__main__':
    main()

Tienes la opción de añadir valor a nuestro contenido informacional tributando tu experiencia en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *