Socks5Proxy

Konfiguracja proxy w Selenium, łączenie SOCKS5 i HTTP proxy w Chrome i Firefox

Ten przewodnik pokazuje, jak w Selenium 4 podłączyć HTTP i SOCKS5 proxy Socks5Proxy do Chrome i Firefox oraz jak użyć IP authorization, gdy ChromeOptions nie przyjmuje hasła proxy.

Dlaczego autoryzacja proxy jest trudna w Selenium?

Chrome przyjmuje adres proxy jako argument --proxy-server, ale nie przyjmuje nazwy użytkownika i hasła zawartych w tym adresie. Jeśli podłączysz się do proxy wymagającego nazwy użytkownika i hasła, przeglądarka wyświetli okno uwierzytelniania, do którego trudno jest wprowadzić wartości za pomocą Selenium.

Najczystszym rozwiązaniem jest autoryzacja IP. Zarejestruj IPv4 serwera z Selenium w dashboardzie, a proxy zaakceptuje połączenia bez loginu i hasła. W Chrome wystarczy wpisać ip:port. Możesz zarejestrować do 10 IP dla wielu serwerów.

Przykładowe dane: IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080.

pip install selenium

Jak podłączyć HTTP proxy do Chrome?

Po zarejestrowaniu uwierzytelniania IP dodaj adres jako argument --proxy-server w ChromeOptions. Selenium 4.6+ automatycznie pobiera odpowiedni chromedriver przez Selenium Manager, więc nie musisz go instalować osobno.

Te same parametry działają również w trybie headless. Aby sprawdzić połączenie, otwórz stronę sprawdzającą IP i upewnij się, że wyświetlany IP to Twój proxy.

from selenium import webdriver
from selenium.webdriver.common.by import By

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

Jak używać SOCKS5 proxy w Chrome?

Wprowadź adres socks5:// w --proxy-server. Chrome używa SOCKS5 do rozpoznawania nazw domen po stronie proxy, ale w niektórych środowiskach może pozostać lokalne rozpoznawanie DNS, dlatego często używa się argumentu --host-resolver-rules, aby zablokować lokalne rozpoznawanie nazw.

SOCKS5 również używa autoryzacji IP. Dzieje się tak, ponieważ Chrome nie obsługuje autoryzacji za pomocą nazwy użytkownika i hasła dla proxy SOCKS.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Jak połączyć się z Firefox?

Firefox określa proxy za pomocą wartości konfiguracyjnych. Ustaw network.proxy.type na 1 (ręcznie) i wprowadź adres HTTP lub SOCKS oraz port. Dla SOCKS5 ustaw network.proxy.socks_version na 5 i network.proxy.socks_remote_dns na True, aby nazwy były rozwiązywane po stronie proxy.

Firefox również nie ma metody wprowadzenia hasła proxy w ustawieniach uruchamiania, więc najprościej jest użyć autoryzacji IP.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Jak uruchomić wiele przeglądarek z różnymi IP jednocześnie?

Możesz uruchomić przeglądarki z różnymi adresami proxy. Poniższy kod pokazuje, jak pobrać listę ip:port z API i uruchomić 3 przeglądarki z różnymi IP. Ponieważ jedna przeglądarka zużywa dużo pamięci, dostosuj liczbę jednocześnie uruchomionych przeglądarek do rozmiaru serwera.

W przypadku długotrwałych zadań w przeglądarce, takich jak utrzymywanie sesji logowania, zaleca się przypisanie jednego IP do jednej przeglądarki i niezmienianie go aż do zakończenia zadania.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

Co zrobić, jeśli konieczne jest użycie uwierzytelniania za pomocą nazwy użytkownika i hasła?

Jeśli nie możesz użyć uwierzytelniania IP, np. gdy wychodzący IP ciągle się zmienia, są dwa sposoby. Pierwszy to użycie bibliotek pośredniczących, takich jak selenium-wire, aby wstawić dane uwierzytelniające. Drugi to uruchomienie lokalnego proxy bez uwierzytelniania na tym samym serwerze, aby Chrome łączył się z lokalnym adresem, a lokalne proxy z Socks5Proxy za pomocą nazwy użytkownika i hasła.

Obie metody wymagają dodatkowego elementu konfiguracji. Jeśli to możliwe, użycie autoryzacji IP z serwera o stałym adresie jest najprostszym i najszybszym rozwiązaniem.

Jak dostosować środowisko przeglądarki do danego kraju?

Dopasuj argument --lang w Chrome i ustawienie Accept-Language do kraju IP, aby strony otwierały się w języku tego kraju. Jeśli strefa czasowa jest ważna, możesz ją również dostosować za pomocą polecenia CDP Emulation.setTimezoneOverride.

Rozmiar okna można ustawić za pomocą argumentu --window-size, a jeśli potrzebujesz ekranu telefonu, użyj ustawień symulacji urządzenia mobilnego. Możesz zapisać te wartości jako zestaw ustawień dla każdego kraju, aby przeprowadzać testy w różnych krajach w sposób spójny.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

Czy te same ustawienia są używane w Selenium Grid i zdalnych przeglądarkach?

Tak. ChromeOptions i FirefoxOptions działają również w zdalnym wykonaniu. Przekazując te same opcje do webdriver.Remote, przeglądarki w węzłach Grid łączą się przez wybrane proxy. W autoryzacji IP należy zarejestrować IP węzła Grid, a nie komputera uruchamiającego kod.

Jeśli masz wiele węzłów, zarejestruj wszystkie ich adresy IP. Możesz dodać maksymalnie 10 adresów. W środowiskach, gdzie węzły chmurowe często się zmieniają, przypisanie stałego adresu IP ułatwi zarządzanie.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Co sprawdzić, gdy nie można się połączyć?

ERR_PROXY_CONNECTION_FAILED często występuje, gdy adres lub port są nieprawidłowe. Sprawdź, czy nie wpisałeś portu SOCKS5 w adresie HTTP. Jeśli pojawia się ERR_TUNNEL_CONNECTION_FAILED lub okno uwierzytelniania, może to oznaczać, że IP zarejestrowane w autoryzacji IP różni się od rzeczywistego IP wychodzącego. Sprawdź wychodzące IP na serwerze za pomocą cURL bez proxy na api.ipify.org i zarejestruj tę wartość.

Serwery w chmurze mogą zmieniać wychodzące IP po restarcie. Używaj stałych IP lub aktualizuj listę zarejestrowanych IP w dashboardzie, gdy IP się zmienia.

Konfiguracja proxy w Selenium, metody łączenia Chrome i Firefox | Socks5Proxy