Porównaj ceny domen i usług IT, sprzedawców z całego świata

Uruchamianie Selenium Webdriver z proxy w Pythonie


Próbuję uruchomić skrypt Selenium Webdriver w Pythonie, aby wykonać kilka podstawowych zadań. Mogę sprawić, by robot działał idealnie, gdy przepuszczę go przez interfejs Selenium IDE (tj. Gdy po prostu sprawię, że GUI powtórzy moje działania). Jednak gdy wyeksportuję kod jako skrypt Pythona i spróbuję wykonać go z wiersza poleceń, przeglądarka Firefox otworzy się, ale nigdy nie będzie w stanie uzyskać dostępu do początkowego adresu URL (błąd wraca do wiersza poleceń i program zatrzymuje się). Zdarza mi się to bez względu na witrynę itp. Próbuję uzyskać dostęp.
Dołączyłem tutaj bardzo prosty kod do celów demonstracyjnych. Wydaje mi się, że sekcja proxy nie została poprawnie dołączona, ponieważ zwrócony błąd wydaje się być generowany przez proxy.
Każda pomoc byłaby bardzo mile widziana.
Poniższy kod ma po prostu otworzyć stronę www.google.ie i wyszukać słowo „selen”. Dla mnie otwiera pustą przeglądarkę Firefox i zatrzymuje się.
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 = "[url=http://149.215.113.110:70"]http://149.215.113.110:70"[/url] 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 = "[url=https://www.google.ie/"]https://www.google.ie/"[/url]
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()

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

U mnie działa tak (podobnie do kodu @ Amey i @ user4642224, ale trochę krócej):
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyTypeprox = 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)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Co powiesz na coś takiego
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("[url=http://localhost:4444/wd/hub"]http://localhost:4444/wd/hub"[/url], webdriver.DesiredCapabilities.FIREFOX)

Możesz przeczytać więcej na ten temat

tutaj
http://docs.seleniumhq.org/doc ... proxy
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Moja decyzja:
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)

Następnie zadzwoń pod swój kod:
my_proxy(PROXY_HOST,PROXY_PORT)

Miałem problemy z tym kodem, ponieważ przekazywałem ciąg jako port #:
PROXY_PORT="31280"

To jest bardzo ważne:
int("31280")

Musisz podać liczbę całkowitą zamiast ciągu, w przeciwnym razie Twój profil Firefoksa nie zostanie ustawiony na prawidłowy port, a połączenie proxy nie będzie działać.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj również skonfigurować serwer proxy sock5. Napotkałem ten sam problem i został rozwiązany za pomocą proxy skarpet
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)

Następnie zadzwoń do
install_proxy (ip, port)
ze swojego programu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli ktoś szuka rozwiązania, oto jak:
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/')
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pełnomocnictwo z walidacją. To jest zupełnie nowy skrypt Pythona w odsyłaczu do przykładowego skryptu Michaiła Martsinyuka.
# 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("[url=http://www.whatsmyip.org/"]http://www.whatsmyip.org/"[/url];)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj dostosować 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("[url=http://whatismyipaddress.com"]http://whatismyipaddress.com"[/url];)time.sleep(5)driver = FixProxy()
driver.get("[url=http://whatismyipaddress.com"]http://whatismyipaddress.com"[/url];)

Ten program

przetestowany

na Windows 8 i Mac OSX. Jeśli używasz Mac OSX i nie zaktualizowałeś selenu, możesz napotkać
selenium.common.exceptions.WebDriverException
. Jeśli tak, spróbuj ponownie po aktualizacji selenu
pip install -U selenium
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Powyższy wynik może być poprawny, ale nie działa z najnowszym webdriverem.
Oto moje rozwiązanie na powyższe pytanie. Proste i słodkie
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()


OR

http_proxy = "[url=http://ip:port"]http://ip:port"[/url]
https_proxy = "[url=https://ip:port"]https://ip:port"[/url] proxyDict = {
"http" : http_proxy,
"https" : https_proxy,
} driver = webdriver.Firefox(proxy=proxyDict)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Odpowiedzi powyżej i dalej

to pytanie
https://coderoad.ru/17988821/
albo nie działały dla mnie z Selenium 3.14 i Firefox 68.9 w Linuksie, albo są niepotrzebnie skomplikowane. Musiałem użyć konfiguracji WPAD, czasami za serwerem proxy (w sieci VPN), a czasami nie. Po lekkim przestudiowaniu kodu doszedłem do wniosku:
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.firefox.firefox_profile import FirefoxProfileproxy = Proxy({'proxyAutoconfigUrl': 'http://wpad/wpad.dat'})
profile = FirefoxProfile()
profile.set_proxy(proxy)
driver = webdriver.Firefox(firefox_profile=profile)

Inicjalizacja proxy ustawia proxyType na ProxyType.PAC (autokonfiguracja z adresu URL) jako efekt uboczny.
Działał również z autodetekcją przeglądarki Firefox przy użyciu:
from selenium.webdriver.common.proxy import ProxyTypeproxy = Proxy({'proxyType': ProxyType.AUTODETECT})

Ale nie sądzę, żeby to zadziałało zarówno z wewnętrznymi adresami URL (bez proxy), jak iz zewnętrznym (przez proxy) sposobem WPAD. Podobne ustawienia proxy powinny działać również w przypadku konfiguracji ręcznej. Możliwe ustawienia proxy można zobaczyć w kodzie

tutaj
https://www.selenium.dev/selen ... .html
.
Zauważ, że bezpośrednie przekazanie obiektu proxy jako
proxy = proxy
do sterownika nie działa - jest akceptowane, ale ignorowane (powinno być ostrzeżenie o wycofaniu, ale w moim przypadku myślę, że Behavior go połyka).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak zauważył @Dugini, niektóre

zapisy konfiguracji
https://github.com/SeleniumHQ/ ... ities
Zostało usunięte. Maksymalny:
webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
"httpProxy":PROXY,
"ftpProxy":PROXY,
"sslProxy":PROXY,
"noProxy":[],
"proxyType":"MANUAL"
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To zadziałało dla mnie i pozwoliło na przeglądarkę bezgłową, wystarczy zadzwonić do metody transferu serwera 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)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

spróbuj uruchomić usługę Tor, dodaj następującą funkcję do swojego kodu.
def connect_tor(port):socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', port, True)
socket.socket = socks.socksocketdef main():connect_tor()
driver = webdriver.Firefox()

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się