Ejecutando Selenium Webdriver con un proxy en Python

84

Estoy tratando de ejecutar un script de Selenium Webdriver en Python para realizar algunas tareas básicas. Puedo hacer que el robot funcione perfectamente cuando lo ejecuto a través de la interfaz de Selenium IDE (es decir, cuando simplemente obtengo la GUI para repetir mis acciones). Sin embargo, cuando exporto el código como una secuencia de comandos de Python e intento ejecutarlo desde la línea de comando, el navegador Firefox se abrirá pero nunca podrá acceder a la URL de inicio (se devuelve un error a la línea de comando y el programa se detiene). Esto me está sucediendo independientemente del sitio web, etc., al que intento acceder.

He incluido un código muy básico aquí para fines de demostración. No creo que haya incluido la sección de proxy del código correctamente ya que el error que se devuelve parece ser generado por el proxy.

Cualquier ayuda sería muy apreciada.

El siguiente código está destinado simplemente a abrir www.google.es y buscar la palabra "selenio". Para mí, abre un navegador Firefox en blanco y se detiene.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re
from selenium.webdriver.common.proxy import *

class Testrobot2(unittest.TestCase):
    def setUp(self):

        myProxy = "http://149.215.113.110:70"

        proxy = Proxy({
        'proxyType': ProxyType.MANUAL,
        'httpProxy': myProxy,
        'ftpProxy': myProxy,
        'sslProxy': myProxy,
        'noProxy':''})

        self.driver = webdriver.Firefox(proxy=proxy)
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.google.ie/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_robot2(self):
        driver = self.driver
        driver.get(self.base_url + "/#gs_rn=17&gs_ri=psy-ab&suggest=p&cp=6&gs_id=ix&xhr=t&q=selenium&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=seleni&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47883778,d.ZGU&fp=7c0d9024de9ac6ab&biw=592&bih=665")
        driver.find_element_by_id("gbqfq").clear()
        driver.find_element_by_id("gbqfq").send_keys("selenium")

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()
usuario2479813
fuente

Respuestas:

41

Funciona para mí de esta manera (similar al código @Amey y @ user4642224, pero un poco más corto):

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

prox = Proxy()
prox.proxy_type = ProxyType.MANUAL
prox.http_proxy = "ip_addr:port"
prox.socks_proxy = "ip_addr:port"
prox.ssl_proxy = "ip_addr:port"

capabilities = webdriver.DesiredCapabilities.CHROME
prox.add_to_capabilities(capabilities)

driver = webdriver.Chrome(desired_capabilities=capabilities)
Mykhail Martsyniuk
fuente
2
esto funciona, gracias. Es extraño que los documentos digan que necesita usar el controlador remoto.
Mans
driver = webdriver.Firefox (capacidades_deseadas = capacidades) TypeError: __init __ () obtuvo un argumento de palabra clave inesperado 'capacidades_deseadas' ¿por qué?
Rimo
33

Qué tal algo como esto

PROXY = "149.215.113.110:70"

webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":None,
    "proxyType":"MANUAL",
    "class":"org.openqa.selenium.Proxy",
    "autodetect":False
}

# you have to use remote, otherwise you'll have to code it yourself in python to 
driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.FIREFOX)

Puedes leer más sobre esto aquí .

Amey
fuente
Esta respuesta funcionó bien para mí. En caso de que alguien más intente hacer esto con Edge, webdriver.DesiredCapabilities.EDGE['proxy']no tiene ningún efecto porque Microsoft Edge actualmente no tiene una configuración para configurar un servidor proxy (para usar Edge con un proxy, debe configurar el proxy en la configuración de conexión de red de Windows) .
Steve HHH
1
Para obtener un documento completo y detallado, consulte: github.com/SeleniumHQ/selenium/wiki/…
LeckieNi
14

Mi solución:

def my_proxy(PROXY_HOST,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
        print PROXY_PORT
        print PROXY_HOST
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_HOST)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("general.useragent.override","whater_useragent")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)

Luego llame a su código:

my_proxy(PROXY_HOST,PROXY_PORT)

Tuve problemas con este código porque estaba pasando una cadena como puerto #:

 PROXY_PORT="31280"

Esto es importante:

int("31280")

Debe pasar un número entero en lugar de una cadena o su perfil de Firefox no se configurará en un puerto adecuado y la conexión a través de proxy no funcionará.

mrki
fuente
1
¿El puerto debe convertirse a int? Eso haría que el ejemplo de proxy de Firefox en la página oficial sea incorrecto: seleniumhq.org/docs/04_webdriver_advanced.jsp En su ejemplo, PROXYHOST: PROXYPORT se pasa como una cadena.
Pyderman
@Pyderman, estás confundiendo Proxy()clase con FirefoxProfile()clase. Al usar las preferencias de perfil, debe pasar ip y puerto por separado, y transmitir portaint() . En Proxy()clase simplemente pasas la cadena que contiene "IP: PORT", y seguramente hace el resto del trabajo por ti.
m3nda
7

Intente configurar también el proxy sock5. Estaba enfrentando el mismo problema y se resuelve usando el proxy de calcetines

def install_proxy(PROXY_HOST,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        print PROXY_PORT
        print PROXY_HOST
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_HOST)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("network.proxy.https",PROXY_HOST)
        fp.set_preference("network.proxy.https_port",int(PROXY_PORT))
        fp.set_preference("network.proxy.ssl",PROXY_HOST)
        fp.set_preference("network.proxy.ssl_port",int(PROXY_PORT))  
        fp.set_preference("network.proxy.ftp",PROXY_HOST)
        fp.set_preference("network.proxy.ftp_port",int(PROXY_PORT))   
        fp.set_preference("network.proxy.socks",PROXY_HOST)
        fp.set_preference("network.proxy.socks_port",int(PROXY_PORT))   
        fp.set_preference("general.useragent.override","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)

Luego llame install_proxy ( ip , port ) desde su programa.

chowmean
fuente
¿Cómo modificaría esto para aceptar credenciales de proxy?
nomaam
6

Si alguien está buscando una solución, aquí le explicamos cómo:

from selenium import webdriver
PROXY = "YOUR_PROXY_ADDRESS_HERE"
webdriver.DesiredCapabilities.FIREFOX['proxy']={
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":None,
    "proxyType":"MANUAL",
    "autodetect":False
}
driver = webdriver.Firefox()
driver.get('http://www.whatsmyip.org/')
usuario4642224
fuente
6

Proxy con verificación. Esta es una secuencia de comandos de Python completamente nueva en referencia a una secuencia de comandos de muestra de Mykhail Martsyniuk.

# Load webdriver
from selenium import webdriver

# Load proxy option
from selenium.webdriver.common.proxy import Proxy, ProxyType

# Configure Proxy Option
prox = Proxy()
prox.proxy_type = ProxyType.MANUAL

# Proxy IP & Port
prox.http_proxy = “0.0.0.0:00000”
prox.socks_proxy = “0.0.0.0:00000”
prox.ssl_proxy = “0.0.0.0:00000# Configure capabilities 
capabilities = webdriver.DesiredCapabilities.CHROME
prox.add_to_capabilities(capabilities)

# Configure ChromeOptions
driver = webdriver.Chrome(executable_path='/usr/local/share chromedriver',desired_capabilities=capabilities)

# Verify proxy ip
driver.get("http://www.whatsmyip.org/")
Mario Uvera
fuente
4

Pruebe configurando FirefoxProfile

from selenium import webdriver
import time


"Define Both ProxyHost and ProxyPort as String"
ProxyHost = "54.84.95.51" 
ProxyPort = "8083"



def ChangeProxy(ProxyHost ,ProxyPort):
    "Define Firefox Profile with you ProxyHost and ProxyPort"
    profile = webdriver.FirefoxProfile()
    profile.set_preference("network.proxy.type", 1)
    profile.set_preference("network.proxy.http", ProxyHost )
    profile.set_preference("network.proxy.http_port", int(ProxyPort))
    profile.update_preferences()
    return webdriver.Firefox(firefox_profile=profile)


def FixProxy():
    ""Reset Firefox Profile""
    profile = webdriver.FirefoxProfile()
    profile.set_preference("network.proxy.type", 0)
    return webdriver.Firefox(firefox_profile=profile)


driver = ChangeProxy(ProxyHost ,ProxyPort)
driver.get("http://whatismyipaddress.com")

time.sleep(5)

driver = FixProxy()
driver.get("http://whatismyipaddress.com")

Este programa probado tanto en Windows 8 como en Mac OSX. Si está utilizando Mac OSX y no tiene selenio actualizado, puede enfrentarlo selenium.common.exceptions.WebDriverException. Si es así, intente nuevamente después de actualizar su selenium

pip install -U selenium
Rafayet Ullah
fuente
4

El resultado indicado anteriormente puede ser correcto, pero no funciona con el controlador web más reciente. Aquí está mi solución para la pregunta anterior. Simple y dulce


        http_proxy  = "ip_addr:port"
        https_proxy = "ip_addr:port"

        webdriver.DesiredCapabilities.FIREFOX['proxy']={
            "httpProxy":http_proxy,
            "sslProxy":https_proxy,
            "proxyType":"MANUAL"
        }

        driver = webdriver.Firefox()

O

    http_proxy  = "http://ip:port"
    https_proxy = "https://ip:port"

    proxyDict = {
                    "http"  : http_proxy,
                    "https" : https_proxy,
                }

    driver = webdriver.Firefox(proxy=proxyDict)
Dugini Vijay
fuente
2

Las respuestas anteriores y sobre esta pregunta no me funcionaron con Selenium 3.14 y Firefox 68.9 en Linux, o son innecesariamente complejas. Necesitaba usar una configuración WPAD, a veces detrás de un proxy (en una VPN) y otras no. Después de estudiar un poco el código, se me ocurrió:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

proxy = Proxy({'proxyAutoconfigUrl': 'http://wpad/wpad.dat'})
profile = FirefoxProfile()
profile.set_proxy(proxy)
driver = webdriver.Firefox(firefox_profile=profile)

La inicialización de Proxy establece proxyType en ProxyType.PAC (autoconfiguración desde una URL) como efecto secundario.

También funcionó con la detección automática de Firefox, usando:

from selenium.webdriver.common.proxy import ProxyType

proxy = Proxy({'proxyType': ProxyType.AUTODETECT})

Pero no creo que esto funcione tanto con URL internas (no proxy) como externas (proxy) como lo hace WPAD. Las configuraciones de proxy similares también deberían funcionar para la configuración manual. Las posibles configuraciones de proxy se pueden ver en el código aquí .

Tenga en cuenta que pasar directamente el objeto Proxy proxy=proxyal controlador NO funciona; se acepta pero se ignora (debería haber una advertencia de desaprobación, pero en mi caso creo que Behave se lo está tragando).

Ron HD
fuente
0

Como lo indicó @Dugini, se han eliminado algunas entradas de configuración . Máximo:

webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":[],
    "proxyType":"MANUAL"
 }
serv-inc
fuente
0

Esto funcionó para mí y me permitió usar un navegador sin cabeza, solo necesita llamar al método que pasa su proxy.

def setProxy(proxy):
        options = Options()
        options.headless = True
        #options.add_argument("--window-size=1920,1200")
        options.add_argument("--disable-dev-shm-usage")
        options.add_argument("--no-sandbox")
        prox = Proxy()
        prox.proxy_type = ProxyType.MANUAL
        prox.http_proxy = proxy
        prox.ssl_proxy = proxy
        capabilities = webdriver.DesiredCapabilities.CHROME
        prox.add_to_capabilities(capabilities)
        return webdriver.Chrome(desired_capabilities=capabilities, options=options, executable_path=DRIVER_PATH)
0x3l
fuente
-1

intente ejecutar el servicio tor, agregue la siguiente función a su código.

def connect_tor(port):

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', port, True)
socket.socket = socks.socksocket

def main():

connect_tor()
driver = webdriver.Firefox()
o.awajan
fuente
Esta publicación carece de información, las funciones connect_tor () y main () no tienen sangría correcta, y en la llamada connect_tor () falta el argumento obligatorio "puerto" en el ejemplo. ¿Qué puerto tor debo utilizar? ¿Dónde puedo obtener la información del puerto de Tor?
Karl