Shifter verwenden mit Selenium
Integrieren Sie Shifters Residential- und ISP-Proxys in Selenium WebDriver für Python, Java, JavaScript, C# und Ruby. Funktioniert mit Chrome, Firefox und Edge — kombinieren Sie es mit selenium-wire für vollständige Benutzername-Passwort-Authentifizierung im Headless-Modus.
Schnellstart
Installieren
pip install selenium selenium-wire Grundlegende Nutzung
# selenium-wire is a drop-in replacement for selenium that adds first-class
# support for authenticated proxies in headless mode.
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless=new")
seleniumwire_options = {
"proxy": {
"http": "customer-USERNAME-country-us-sid-123ABC:PASSWORD@p.shifter.io:443",
"https": "customer-USERNAME-country-us-sid-123ABC:PASSWORD@p.shifter.io:443",
"no_proxy": "localhost,127.0.0.1",
}
}
driver = webdriver.Chrome(
options=options,
seleniumwire_options=seleniumwire_options,
)
driver.get("https://ipinfo.io/json")
print(driver.find_element("tag name", "body").text)
# {"ip": "154.16.xxx.xxx", "city": "New York", "country": "US", ...}
driver.quit() Funktionen
Beispiele
Python + selenium-wire (Sticky Session)
selenium-wire leitet den Datenverkehr über einen prozessinternen MITM, wodurch Benutzername-Passwort-Proxys im Headless-Chrome problemlos funktionieren. Fügen Sie eine `sid` hinzu, um eine feste Residential IP für die gesamte Sitzung zu verwenden.
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import secrets
sid = secrets.token_hex(4)
options = Options()
options.add_argument("--headless=new")
options.add_argument(
"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
proxy_url = (
f"customer-USERNAME-country-uk-city-london-sid-{sid}-ttl-300:"
f"PASSWORD@p.shifter.io:443"
)
driver = webdriver.Chrome(
options=options,
seleniumwire_options={"proxy": {"http": proxy_url, "https": proxy_url}},
)
# Multi-step flow — same residential IP across every navigation.
driver.get("https://example.co.uk/login")
driver.find_element(By.ID, "email").send_keys("user@example.com")
driver.find_element(By.ID, "password").send_keys("secret")
driver.find_element(By.CSS_SELECTOR, "button[type=submit]").click()
WebDriverWait(driver, 10).until(EC.url_contains("/dashboard"))
rows = driver.find_elements(By.CSS_SELECTOR, ".order-row")
print(f"Found {len(rows)} orders on dashboard")
driver.quit() Vanilla Selenium (ohne Extras) — IP-Whitelist
Wenn Sie selenium-wire nicht als Abhängigkeit möchten, verwenden Sie Shifters IP-Whitelist-Authentifizierung und konfigurieren Sie den Proxy über die Standard-ChromeOptions. Weniger Abhängigkeiten, aber Sie müssen Ihren Scraping-Host auf die Whitelist setzen.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--proxy-server=http://p.shifter.io:443")
options.add_argument(
"--user-agent=Mozilla/5.0 (Macintosh) AppleWebKit/537.36"
)
# When using IP-whitelist auth, your scrape host's outbound IP is
# pre-authorized — no username/password needed in the URL.
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
print(driver.title)
products = driver.find_elements(By.CSS_SELECTOR, ".product")
for p in products[:5]:
title = p.find_element(By.CSS_SELECTOR, "h2").text
price = p.find_element(By.CSS_SELECTOR, ".price").text
print(title, price)
driver.quit() Java mit selenium-wire-Äquivalent (BrowserMob)
Java verfügt nicht über selenium-wire, aber BrowserMob Proxy erfüllt dieselbe Aufgabe — starten Sie einen lokalen Proxy, der Basic-Auth-Header hinzufügt, und verweisen Sie Selenium dann darauf.
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.net.InetSocketAddress;
public class SeleniumShifter {
public static void main(String[] args) {
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.setChainedProxy(new InetSocketAddress("p.shifter.io", 443));
proxy.chainedProxyAuthorization(
"customer-USERNAME-country-de-sid-456DEF", "PASSWORD",
net.lightbody.bmp.proxy.auth.AuthType.BASIC);
proxy.start(0);
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
ChromeOptions options = new ChromeOptions();
options.setProxy(seleniumProxy);
options.addArguments("--headless=new");
WebDriver driver = new ChromeDriver(options);
try {
driver.get("https://example.de");
System.out.println(driver.getTitle());
} finally {
driver.quit();
proxy.stop();
}
}
} Selenium Grid (parallele Browser)
Wenn Sie auf einen Grid-Hub mit mehreren Nodes skalieren, konfigurieren Sie Shifter einmalig auf Capabilities-Ebene — jeder Node leitet den Datenverkehr über Shifter, ohne dass eine knotenspezifische Konfiguration erforderlich ist.
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.chrome.options import Options
# Use selenium-wire-equivalent or Shifter IP whitelist for auth.
proxy_str = "p.shifter.io:443"
shared_proxy = Proxy()
shared_proxy.proxy_type = ProxyType.MANUAL
shared_proxy.http_proxy = proxy_str
shared_proxy.ssl_proxy = proxy_str
options = Options()
options.proxy = shared_proxy
options.add_argument("--headless=new")
# Grid hub
HUB_URL = "http://selenium-hub.internal:4444/wd/hub"
driver = webdriver.Remote(command_executor=HUB_URL, options=options)
try:
driver.get("https://example.com")
print(driver.title, len(driver.page_source), "bytes")
finally:
driver.quit() Häufig gestellte Fragen
Häufige Fragen zur Verwendung von Shifter mit Selenium.
Verwenden Sie selenium-wire (Python) oder BrowserMob Proxy (Java). Beide betreiben einen lokalen MITM-Proxy, der Basic-Auth-Header einfügt — Chrome und Firefox akzeptieren den inneren Proxy, ohne nach Zugangsdaten zu fragen, auch im Headless-Modus. Alternativ können Sie Shifters IP-Whitelist-Authentifizierung verwenden und Zugangsdaten vollständig weglassen.
Chrome zeigt im Headless-Modus keine Proxy-Authentifizierungsdialoge an, und es gibt keine integrierte Möglichkeit, Zugangsdaten über die Befehlszeile zu übergeben. selenium-wire umgeht dies, indem es einen lokalen Proxy betreibt, der die Authentifizierung selbst übernimmt. Die andere Option ist Shifters IP-Whitelist-Modus — die ausgehende IP Ihres Scraping-Hosts ist vorautorisiert, sodass keine Zugangsdaten benötigt werden.
Pass --proxy-server=http://p.shifter.io:443 in ChromeOptions. For username-password auth in headless mode, use selenium-wire (Python) or BrowserMob (Java). For visible Chrome, page.authenticate() in the underlying CDP works, but most scrapers use selenium-wire as the cleanest option.
Fügen Sie dem Proxy-Benutzernamen eine Sitzungs-ID hinzu — zum Beispiel `customer-USERNAME-country-us-sid-123ABC`. Jede Anfrage über dieselbe WebDriver-Sitzung verwendet dieselbe Residential IP. Fügen Sie `ttl-N` hinzu, um die IP für bis zu N Sekunden festzuhalten.
Ja. Konfigurieren Sie den Proxy auf Capabilities- oder ChromeOptions-Ebene beim Erstellen des Remote WebDrivers — jeder Grid-Node leitet den Datenverkehr über Shifter. Kombinieren Sie dies mit eindeutigen sids pro Worker, um paralleles Scraping zu skalieren, ohne IPs zu teilen.
Wenn Sie neu anfangen, ist Playwright in der Regel einfacher — Proxy-Authentifizierung funktioniert nativ, Multi-Browser-Unterstützung ist integriert und die API ist übersichtlicher. Selenium bleibt die richtige Wahl für bestehende Test-Suites, Mobile (Appium) oder wenn Ihr Team bereits darauf standardisiert ist. Shifter funktioniert mit beiden gleich gut.
Shifter verwenden mit Selenium
Steuern Sie den Selenium WebDriver über Shifters 205M+ Residential- und ISP-Proxys in Python, Java und weiteren Sprachen. Nativer --proxy-server-Flag, selenium-wire für headless-Authentifizierung und vollständige Selenium Grid-Unterstützung.