Selenium プロキシ認証: 実際に機能する4つのセットアップ

Chrome が Selenium では操作できない認証ダイアログを表示し、URL に埋め込んだ認証情報は静かに失敗します。ここでは、Selenium でプロキシを実際に認証する4つのセットアップを、影響の少ない順に紹介します。

Selenium プロキシ認証は、ワンライナーに見せかけた罠です。--proxy-server Chrome フラグはプロキシアドレスを受け入れますが、埋め込んだユーザー名とパスワードは静かに無視されます。その後、Chrome は WebDriver が見えないネイティブの認証ダイアログを表示し、スクリプトは停止します。113票以上のトップの Stack Overflow の回答は、現代の Chrome では読み込まれない Manifest V2 拡張機能で解決しています。このガイドでは、Selenium でプロキシを認証する4つのセットアップを紹介します — IP ホワイトリスト化、Manifest V3 拡張機能、selenium-wire、そしてブラウザの問題を API に任せるタイミングを知ることです。

なぜ基本的な Selenium プロキシ認証が失敗するのか

失敗した試みを説明する3つの事実。まず、Chromium は --proxy-server=http://user:pass@host:port から認証情報を削除します — フラグ形式には認証情報のサポートがありません。次に、プロキシの 407 Proxy Authentication Required チャレンジは DOM 外のネイティブダイアログとして表示され、send_keys では届きません。最後に、古い DesiredCapabilities 経路 (socksUsername / socksPassword) は SOCKS プロキシにのみ適用され、HTTP プロキシでは機能しません — 見た目は正しいが何もしない設定です。したがって、実際のオプションはすべてダイアログを完全に回避します。

方法1: IP ホワイトリスト化 — コードなし、ダイアログなし

スクレイパーが安定したパブリック IP を持つマシンから実行される場合、認証情報を完全にスキップします: プロキシプロバイダーのダッシュボードにその IP を登録し、ゲートウェイが送信元アドレスで認証します。すべての QuantumProxies プランは、user:pass と並行して IP ホワイトリスト化をサポートしています。Selenium 側は、常に認証なしでうまく機能していたプレーンフラグになります:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://gate.quantumproxies.io:PORT")
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
driver.get("https://httpbin.org/ip")
print(driver.find_element("tag name", "body").text)  # proxy exit IP
driver.quit()

実行を信頼する前に必ず出口を確認してください: IP エコーエンドポイントをロードし、アドレスがプロキシに属していることを確認します。誤ったフラグ設定は静かに失敗し、Chrome は直接接続します。ホワイトリスト化の限界はトポロジーです: マシンを認証しますが、スクリプトは認証しません。エフェメラルなクラウドランナー、NAT の背後にあるコンテナ、IP が変わる CI マシンは、以下の方法のいずれかが必要です。

方法2: Manifest V3 Chrome 拡張機能

クラシックな修正方法は、プロキシを設定し、chrome.webRequest.onAuthRequired を介して認証チャレンジに応答する小さな Chrome 拡張機能を生成します。有名な2019年のスニペットは Manifest V2 を使用していますが、Chrome はこれを廃止しました — 現代版は manifest_version: 3、サービスワーカー、および webRequestAuthProvider 権限が必要です。これを実行時に構築してロードします:

import json, os, tempfile
from selenium import webdriver

HOST, PORT = "gate.quantumproxies.io", "PORT"
USER, PASS = "USER", "PASS"

manifest = {
    "name": "Proxy Auth", "version": "1.0", "manifest_version": 3,
    "permissions": ["proxy", "webRequest", "webRequestAuthProvider"],
    "host_permissions": ["<all_urls>"],
    "background": {"service_worker": "worker.js"},
}

worker = """
chrome.proxy.settings.set({
  value: { mode: "fixed_servers", rules: {
    singleProxy: { scheme: "http", host: "%s", port: parseInt("%s") },
    bypassList: ["localhost"] } },
  scope: "regular"
}, function() {});
chrome.webRequest.onAuthRequired.addListener(
  function(details) {
    return { authCredentials: { username: "%s", password: "%s" } };
  },
  { urls: ["<all_urls>"] },
  ["blocking"]
);
""" % (HOST, PORT, USER, PASS)

ext_dir = tempfile.mkdtemp()
with open(os.path.join(ext_dir, "manifest.json"), "w") as f:
    json.dump(manifest, f)
with open(os.path.join(ext_dir, "worker.js"), "w") as f:
    f.write(worker)

options = webdriver.ChromeOptions()
options.add_argument("--load-extension=" + ext_dir)
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
driver.get("https://httpbin.org/ip")

2つの落とし穴。拡張機能は 新しい ヘッドレスモードでのみロードされます — プレーン --headless は「拡張機能のバックグラウンドページの待機に失敗しました」という難解なエラーで失敗するため、--headless=new が必須です。また、--load-extension を介して未パックのディレクトリをロードする方が、Chrome のバージョン間でより信頼性があります。これを維持したくない場合、PyPI の selenium-authenticated-proxy パッケージは、単一のプロキシ URL から拡張機能を生成します。

4つの Selenium プロキシ認証方法の比較: IP ホワイトリスト化、Manifest V3 拡張機能、selenium-wire、スクレイピング API
ホワイトリスト化は出口 IP が固定されている場合に勝利します; MV3 拡張機能はエフェメラルなマシンで勝利します; selenium-wire は便利さを MITM フィンガープリントと交換します。

方法3: selenium-wire とそのトレードオフ

selenium-wire は WebDriver をローカルの中間者プロキシでラップし、認証された上流プロキシ — SOCKS5 を含む — をプレーンなオプション辞書にします:

# pip install selenium-wire
from seleniumwire import webdriver

options = {
    "proxy": {
        "http": "http://USER:PASS@gate.quantumproxies.io:PORT",
        "https": "http://USER:PASS@gate.quantumproxies.io:PORT",
        "no_proxy": "localhost,127.0.0.1",
    }
}

driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://httpbin.org/ip")

購入するものを知っておいてください。プロジェクトは2024年初頭にメンテナーによってアーカイブされ、更新は受けていません。また、ローカルでトラフィックを復号化するため、ターゲットは Chrome ではなく selenium-wire の TLS ハンドシェイクを確認します — IP が完璧でも JA3/JA4 フィンガープリンティング システムがフラグを立てます。開発中のリクエスト検査や、拡張機能のトリックが存在しない Firefox では本当に役立ちます。保護されたサイトでの本番スクレイピングには、方法1-2を優先するか、レイヤーを上げてください。

Firefox と認証ギャップ

Firefox はプロファイル設定 (network.proxy.type = 1 とホストおよびポート設定) を通じて認証されていないプロキシをクリーンに受け入れますが、WebDriver からの認証ダイアログに応答する Chrome の拡張機能のようなものはありません。実際には、Firefox ユーザーは IP ホワイトリスト化または selenium-wire を選びます。Firefox の唯一の理由がプロキシ処理だった場合、その理由はもはや有効ではありません。

Selenium の修正をやめて API に切り替えるタイミング

認証は最初のコストであり、最後ではありません。Chrome インスタンスは数百 MB の RAM を消費するため、数十の同時セッションでサーバーが飽和します; ChromeDriver のバージョンは Chrome のリリースを追いかけます; そして、アンチボットベンダーは、IP に関係なくバニラ Selenium を検出します — navigator.webdriver と CDP アーティファクトがそれを暴露します。2つのアップグレードが経済性を変えます。まず、ブラウザを 住宅プロキシ 経由で実行し、IP 評判がブロックされる理由でなくなるようにします — 90M+ の家庭用 IP がリクエストごとの回転やログインフローのためのスティッキーセッションを提供します。次に、ブラウザの維持が価値を失ったとき、Scraper API が全スタックを1つの HTTP コールに圧縮します: JavaScript をオンデマンドでレンダリングし、IP とリトライを内部で管理し、HTML、markdown、または構造化された JSON を返します。同じトレードオフが Selenium の親戚にも適用されます — フレームワークの切り替えが検出問題を解決すると思う前に、Playwright プロキシ統合Puppeteer プロキシ設定 のガイドを参照してください。

Selenium プロキシホワイトリスト化から Manifest V3 拡張機能、住宅プロキシ、スクレイピング API へのエスカレーションラダー
ターゲットが強制する範囲までのみ登ってください: フラグ、拡張機能、より良い IP、次に API にブラウザを実行させます。

よくある質問

Selenium ChromeDriver で認証付きプロキシを設定するにはどうすればよいですか?

プロキシプロバイダーでマシンの IP をホワイトリストに登録し、プレーンな --proxy-server フラグを渡すか、プロキシを設定し、chrome.webRequest.onAuthRequired を通じて認証情報を提供する小さな Manifest V3 拡張機能をロードします。フラグに user:pass@ を埋め込んでも機能しません — Chromium はそれを無視します。

なぜ Chrome は Selenium でプロキシログインポップアップを表示するのですか?

プロキシが 407 で応答し、Chrome が人間に認証情報を求めています。ダイアログはネイティブ UI であり、WebDriver には見えないため、セレクターや send_keys 呼び出しでは入力できません。ダイアログが表示される前に認証することが修正です: IP ホワイトリスト化、認証拡張機能、または selenium-wire のような MITM レイヤー。

selenium-wire は2026年でも機能しますか?

多くのワークロードでまだインストールされて機能しますが、プロジェクトは2024年初頭にアーカイブされ、メンテナンスは行われていません。その MITM 設計により、Chrome の TLS フィンガープリントが Python のものに置き換えられ、現代のアンチボットシステムが検出します。デバッグツールとして扱い、本番スクレイパーの基盤にはしないでください。

Selenium で Firefox を使用して認証付きプロキシを使用するにはどうすればよいですか?

Firefox プロファイル設定はプロキシアドレスを構成しますが、認証プロンプトに応答できず、Chrome のような拡張機能の回避策はありません。認証情報が不要になるように IP ホワイトリスト化を使用するか、Firefox を selenium-wire 経由でルーティングし、上流の認証をローカルで処理します。

Java と C# でも同じように機能しますか?

はい — メカニズムは Chrome にあり、言語バインディングにはありません。IP ホワイトリスト化と --proxy-server はどこでも同じであり、Manifest V3 拡張機能のアプローチは、同じ2つのファイルを書き、ChromeOptions に --load-extension を追加することで、Java や C# からも機能します。selenium-wire のみが Python 固有であり、他の言語は BrowserMob などのローカル MITM プロキシを代替します。

短いバージョン: 認証ダイアログと戦わないでください。IP が安定している場合はホワイトリスト化し、そうでない場合は MV3 拡張機能を生成し、インスペクション作業には selenium-wire を保持し、ブラウザのメンテナンスが生成するデータを超えたときは、ジョブを API に昇格させ、夜を取り戻してください。

住宅 IP で Selenium を実行する