集成

将Shifter与以下工具配合使用 Selenium

通过 Python、Java、JavaScript、C# 和 Ruby,将 Shifter 的住宅代理和 ISP 代理接入 Selenium WebDriver。支持 Chrome、Firefox 和 Edge——搭配 selenium-wire 可在无头模式下实现完整的用户名密码认证。

快速入门

安装

pip install selenium selenium-wire

基本用法

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

功能特性

全面支持 Python、Java、JavaScript、C# 和 Ruby 的 Selenium 客户端
通过 selenium-wire(Python)或 BrowserMob(Java)在无头模式下实现认证代理
标准 --proxy-server 标志与 IP 白名单认证配合,支持 Chrome、Edge 和 Firefox
通过用户名参数在 195+ 个国家/地区进行地理定向 — country、region、city、ASN
默认按请求轮换,使用`sid`实现粘性会话,使用`ttl-N`实现N秒定时固定
兼容 Selenium Grid、GitHub Actions Runner 及任何基于容器的抓取管道

示例

Python + selenium-wire(粘性会话)

selenium-wire 通过进程内 MITM 转发流量,这意味着用户名密码代理在无头 Chrome 中可直接使用。添加 `sid` 可在整个会话中保持粘性住宅 IP。

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

原生 Selenium(无额外依赖)——IP 白名单

如果不想依赖 selenium-wire,可使用 Shifter 的 IP 白名单认证,并通过标准 ChromeOptions 配置代理。依赖更简洁,但需要将抓取主机加入白名单。

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 配合 selenium-wire 等效方案(BrowserMob)

Java 没有 selenium-wire,但 BrowserMob Proxy 可填补同等角色——启动一个添加 Basic 认证头的本地代理,然后将 Selenium 指向它。

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(并行浏览器)

当扩展到具有多个节点的 Grid Hub 时,在 Capabilities 级别统一配置 Shifter——每个节点无需单独配置即可通过 Shifter 路由。

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()
常见问题

常见问题

关于将 Shifter 与 Selenium 搭配使用的常见问题。

使用 selenium-wire(Python)或 BrowserMob Proxy(Java)。两者均运行本地 MITM 代理并注入 Basic 认证头——Chrome 和 Firefox 无需提示凭据即可接受内部代理,即使在无头模式下也如此。或者,使用 Shifter 的 IP 白名单认证,完全跳过凭据。

立即开始

开始将Shifter与以下工具配合使用 Selenium

通过 Shifter 的 205M+ 住宅和 ISP 代理在 Python、Java 等语言中驱动 Selenium WebDriver。支持原生 --proxy-server 标志、selenium-wire 无头认证以及完整的 Selenium Grid。

免费试用 Shifter几分钟内完成设置,随时可取消。