Ausführen von Selenium Webdriver mit einem Proxy in Python


84

Ich versuche, ein Selenium Webdriver-Skript in Python auszuführen, um einige grundlegende Aufgaben auszuführen. Ich kann den Roboter zum Funktionieren bringen, wenn er über die Selenium IDE-Schnittstelle ausgeführt wird (dh wenn einfach die GUI meine Aktionen wiederholt). Wenn ich den Code jedoch als Python-Skript exportiere und versuche, ihn über die Befehlszeile auszuführen, wird der Firefox-Browser geöffnet, kann jedoch nie auf die Start-URL zugreifen (ein Fehler wird an die Befehlszeile zurückgegeben und das Programm stoppt). Dies passiert mir unabhängig davon, auf welche Website usw. ich zugreifen möchte.

Ich habe hier zu Demonstrationszwecken einen sehr einfachen Code eingefügt. Ich glaube nicht, dass ich den Proxy-Abschnitt des Codes korrekt eingefügt habe, da der zurückgegebene Fehler vom Proxy generiert zu werden scheint.

Jede Hilfe wäre sehr dankbar.

Der folgende Code soll lediglich www.google.ie öffnen und nach dem Wort "Selen" suchen. Für mich öffnet es einen leeren Firefox-Browser und stoppt.

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()

Antworten:


41

Funktioniert bei mir so (ähnlich wie bei @Amey und @ user4642224, jedoch etwas kürzer):

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)

2
das funktioniert, danke. seltsam, dass die Dokumente sagen, dass Sie den Remote-Treiber verwenden müssen.
Mans

driver = webdriver.Firefox (gewünschte_Fähigkeiten = Fähigkeiten) TypeError: __init __ () hat ein unerwartetes Schlüsselwortargument 'gewünschte_Fähigkeiten' erhalten warum?
Rimo

33

Wie wäre es mit so etwas

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)

Sie können mehr darüber lesen Sie hier .


Diese Antwort hat bei mir gut funktioniert. Falls jemand anderes versucht, dies mit Edge zu tun, webdriver.DesiredCapabilities.EDGE['proxy']hat dies keine Auswirkung, da Microsoft Edge derzeit keine Einstellung zum Konfigurieren eines Proxyservers hat (um Edge mit einem Proxy zu verwenden, müssen Sie den Proxy unter den Windows-Netzwerkverbindungseinstellungen konfigurieren). .
Steve HHH

1
Ein ausführliches Dokument finden Sie unter: github.com/SeleniumHQ/selenium/wiki/…
LeckieNi

14

Meine Lösung:

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)

Dann rufen Sie Ihren Code an:

my_proxy(PROXY_HOST,PROXY_PORT)

Ich hatte Probleme mit diesem Code, weil ich eine Zeichenfolge als Portnummer übergeben habe:

 PROXY_PORT="31280"

Das ist wichtig:

int("31280")

Sie müssen eine Ganzzahl anstelle einer Zeichenfolge übergeben, da sonst Ihr Firefox-Profil nicht auf einen ordnungsgemäßen Port eingestellt wird und die Verbindung über den Proxy nicht funktioniert.


1
Port muss in int konvertiert werden? Das würde das Firefox Proxy - Beispiel auf der offiziellen Seite falsch machen: seleniumhq.org/docs/04_webdriver_advanced.jsp In ihrem Beispiel Proxyhost: proxy wird als String übergeben.
Pyderman

@Pyderman, Sie verwechseln Proxy()Klasse mit FirefoxProfile()Klasse. Mit den Profileinstellungen müssen Sie IP und Port getrennt übergeben und portan übertragen int(). In der Proxy()Klasse übergeben Sie einfach die Zeichenfolge "IP: PORT" und erledigt den Rest der Arbeit für Sie.
m3nda

7

Versuchen Sie auch, den sock5-Proxy einzurichten. Ich hatte das gleiche Problem und es wird mit dem Socken-Proxy gelöst

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)

Rufen Sie dann install_proxy ( ip , port ) von Ihrem Programm aus auf.


Wie würden Sie dies ändern, um Proxy-Anmeldeinformationen zu akzeptieren?
Nomaam

6

Wenn jemand nach einer Lösung sucht, gehen Sie wie folgt vor:

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/')

6

Proxy mit Überprüfung. Dies ist ein völlig neues Python-Skript, das auf ein Mykhail Martsyniuk-Beispielskript verweist.

# 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/")

4

Versuchen Sie es, indem Sie FirefoxProfile einrichten

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")

Dieses Programm wurde sowohl unter Windows 8 als auch unter Mac OS X getestet . Wenn Sie Mac OSX verwenden und Selen nicht aktualisiert wurde, kann dies zu Problemen führen selenium.common.exceptions.WebDriverException. Wenn ja, versuchen Sie es nach dem Aufrüsten Ihres Selens erneut

pip install -U selenium

4

Das oben angegebene Ergebnis ist möglicherweise korrekt, funktioniert jedoch nicht mit dem neuesten Webdriver. Hier ist meine Lösung für die obige Frage. Einfach und süß


        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()

ODER

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

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

    driver = webdriver.Firefox(proxy=proxyDict)

2

Die obigen Antworten auf diese Frage haben bei Selenium 3.14 und Firefox 68.9 unter Linux entweder nicht funktioniert oder sind unnötig komplex. Ich musste eine WPAD-Konfiguration verwenden, manchmal hinter einem Proxy (in einem VPN) und manchmal nicht. Nachdem ich den Code ein wenig studiert hatte, kam ich auf:

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)

Die Proxy-Initialisierung setzt proxyType als Nebeneffekt auf ProxyType.PAC (Autokonfiguration über eine URL).

Es funktionierte auch mit der automatischen Erkennung von Firefox unter Verwendung von:

from selenium.webdriver.common.proxy import ProxyType

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

Ich denke jedoch nicht, dass dies sowohl mit internen URLs (nicht als Proxy) als auch mit externen (Proxy) funktionieren würde, wie dies bei WPAD der Fall ist. Ähnliche Proxy-Einstellungen sollten auch für die manuelle Konfiguration funktionieren. Die möglichen Proxy-Einstellungen finden Sie im Code hier .

Beachten Sie, dass die direkte Übergabe des Proxy-Objekts proxy=proxyan den Treiber NICHT funktioniert - es wird akzeptiert, aber ignoriert (es sollte eine Verfallswarnung geben, aber in meinem Fall denke ich, dass Behave es verschluckt).


0

Wie von @Dugini angegeben, wurden einige Konfigurationseinträge entfernt. Maximal:

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

0

Dies hat bei mir funktioniert und ermöglicht die Verwendung eines Headless-Browsers. Sie müssen nur die Methode aufrufen, die Ihren Proxy übergibt.

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)

-1

Versuchen Sie, den Dienst auszuführen, und fügen Sie Ihrem Code die folgende Funktion hinzu.

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()

In diesem Beitrag fehlen Informationen, die Funktionen connect_tor () und main () haben keinen korrekten Einzug, und beim Aufruf von connect_tor () fehlt das obligatorische Argument "port" im Beispiel. Welchen Tor-Port soll ich verwenden? Wo kann ich Tors Hafeninformationen erhalten?
Karl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.