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.