統合

Shifterと一緒に使用する Selenium

ShifterのレジデンシャルおよびISP ProxiesをPython、Java、JavaScript、C#、Rubyの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+ か国での Geo ターゲティング -- 国、地域、都市、ASN
デフォルトはリクエストごとのローテーション。スティッキーセッションには`sid`、N秒間のタイムドピンには`ttl-N`を使用
Selenium Grid、GitHub Actions ランナー、およびあらゆるコンテナベースのスクレイピングパイプラインと互換性あり

Python + selenium-wire(スティッキーセッション)

selenium-wireはプロセス内MITMを通じてトラフィックを転送するため、ヘッドレスChromeでユーザー名・パスワードプロキシがそのまま動作します。セッション全体でスティッキーなレジデンシャルIPを使用するには`sid`を追加してください。

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

selenium-wire 相当品を使った Java(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ハブにスケールする場合は、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()
FAQ

よくある質問

Shifter と Selenium の併用に関するよくある質問。

selenium-wire(Python)またはBrowserMob Proxy(Java)を使用します。どちらもBasic認証ヘッダーを注入するローカルのMITMプロキシを実行します。ChromeとFirefoxはヘッドレスモードでも、内部プロキシに対して認証情報の入力を求めることなく受け入れます。あるいは、ShifterのIPホワイトリスト認証を使用して認証情報を省略することもできます。

Chrome はヘッドレスモードでプロキシ認証ダイアログを表示せず、コマンドラインで資格情報を渡す組み込みの方法もありません。selenium-wire は認証を自ら処理するローカルプロキシを実行することでこの問題を回避します。もう一つの選択肢は Shifter の IP ホワイトリストモードです。スクレイピングホストの送信 IP が事前に認証されるため、資格情報は不要です。

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.

プロキシのユーザー名にセッションIDを追加してください。例:`customer-USERNAME-country-us-sid-123ABC`。同じWebDriverセッションを通じたすべてのリクエストは同じレジデンシャルIPを再利用します。`ttl-N`を追加すると、そのIPをN秒まで固定できます。

はい。Remote WebDriverを作成する際に、CapabilitiesまたはChromeOptionsレベルでプロキシを設定すると、すべてのGridノードがShifter経由でルーティングされます。ワーカーごとに一意のsidを組み合わせることで、IPを共有せずに並列スクレイピングをスケールできます。

新規に始める場合、Playwright は通常より簡単です。プロキシ認証がネイティブに機能し、マルチブラウザ サポートが組み込まれており、API がシンプルです。Selenium は、レガシー テスト スイート、モバイル(Appium)、またはチームがすでに標準化している場合に適した選択肢です。Shifter はどちらでも同様に機能します。

始める

でShifterを使い始める Selenium

PythonやJavaなど、ShifterのレジデンシャルおよびISP Proxy 205M+を通じてSelenium WebDriverを操作できます。ネイティブの--proxy-serverフラグ、ヘッドレス認証用のselenium-wire、完全なSelenium Gridをサポートしています。

Shifterを無料で試す数分でセットアップ完了。いつでもキャンセル可能。