このSeleniumによるCAPTCHA回避チュートリアルでは、以下の内容を学びます:
- CAPTCHAとは何か、回避可能か否か
- SeleniumでCAPTCHAを回避する方法
- CAPTCHAが依然として表示される場合の対処法
それでは始めましょう!
CAPTCHAとは何か?回避は可能か?
CAPTCHA(完全自動化公開チューリングテスト:コンピュータと人間を区別するためのテスト)とは、人間ユーザーとボットを区別するために設計された仕組みです。人間には簡単だが機械には難しい課題を提示します。代表的なCAPTCHAプロバイダーにはGoogle reCAPTCHA、hCaptcha、BotDetectなどがあります。
代表的なCAPTCHAの種類:
- テキストベースの課題:歪んだ文字や数字の列を入力する必要があります。
- 画像ベースの課題:画像グリッド内の特定のオブジェクトを識別する必要がある。
- 音声ベースの課題:ユーザーは聞いた単語を入力する必要があります。
- パズル課題:迷路の探索など、簡単なパズルを解く課題。

CAPTCHAは特定のユーザーフローの一部として頻繁に利用されます。例えばフォーム送信プロセスの最終ステップなどです:

このような場合、CAPTCHAはボットがユーザーフローを完了しないようにするためのものです。これらの課題を自動化するには、CAPTCHAの解決ライブラリや、人間のオペレーターがリアルタイムで課題を解決するサービスを利用できます。ただし、ユーザー体験に悪影響を与えるため、ハードコードされたCAPTCHAは一般的ではありません。
より一般的なのは、WAF(Web アプリケーションファイアウォール)のような包括的なボット対策ソリューションの一部として導入されるケースです:

これらのシステムはボット活動を検知すると動的にCAPTCHAを表示します。この場合、ボットが実環境のブラウザで人間の行動を模倣すればCAPTCHAを回避可能です。ただし、新たなボット検知手法に対応するため、スクリプトの継続的な更新が不可欠です。
CAPTCHA回避のより効果的な解決策は、BrightDataのCAPTCHAの解決機能のような次世代ツールの使用です。このクラウドツールは常に最新の状態を保ち、多様なCAPTCHAタイプを処理できます。
SeleniumによるCAPTCHA処理:ステップバイステップチュートリアル
先ほど学んだように、CAPTCHAを回避する効果的な方法は、現実世界のフィンガープリントを持つブラウザを制御しながら、自動化されたスクリプトに人間の行動を模倣させることです。この目的に最適なツールの一つが、人気のブラウザ自動化ライブラリであるSeleniumです。
このチュートリアルセクションでは、Pythonスクリプトを使用してSeleniumでCAPTCHAを回避する方法を学びます。さっそく始めましょう!
ステップ #1: 新しいPythonプロジェクトを作成する
開始前に、ローカル環境にPython 3とChromeがインストールされていることを確認してください。
既存のSeleniumウェブスクレイピングまたはテストスクリプトをお持ちの場合は、最初の3ステップをスキップできます。そうでない場合は、Selenium CAPTCHA回避デモプロジェクト用のフォルダを作成し、ターミナルでそのフォルダに移動します:
mkdir selenium_demo
cd selenium_demo
次に、その中に新しいPython仮想環境を追加します:
python -m venv venv
お気に入りのPython IDEでプロジェクトフォルダを開き、script.pyという名前の新規ファイルを作成します。
素晴らしい!これでプロジェクトフォルダ内にPythonアプリケーションが作成されました。
ステップ #2: Selenium のインストール
以下のコマンドでPython仮想環境を有効化します:
venvScriptsactivate
LinuxまたはmacOSユーザーの場合は、同等の以下のコマンドを実行します:
source venv/bin/activate
次に、pipパッケージ管理ツールを使用してSeleniumをインストールします:
pip install selenium
インストールには時間がかかる場合がありますので、しばらくお待ちください。
完了!これでSeleniumスクリプトを初期化する準備が整いました。
ステップ #3: Seleniumスクリプトの設定
script.py に次の行を追加して Selenium をインポートします:
from selenium import webdriver
次に、Chromeをヘッドレスモードで起動するよう設定するChromeOptionsオブジェクトを作成します:
options = webdriver.ChromeOptions()
options.add_argument("--headless")
このオプションに慣れていない場合は、ヘッドレスブラウザに関するガイドで詳細を確認してください。
これらのオプションでChrome WebDriverインスタンスを初期化し、最後にquit()で終了します。現在のscript.pyファイルは次のようになります:
from selenium import webdriver
# Chromeをヘッドレスモードで起動するよう設定
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# Chromeインスタンスを起動
driver = webdriver.Chrome(options=options)
# ブラウザ自動化ロジック...
# ブラウザを閉じ、リソースを解放
driver.quit()
上記のスクリプトは、ブラウザを閉じる前にヘッドレスモードで新しいChromeインスタンスを起動します。素晴らしい!次はブラウザ自動化ロジックの実装です。
ステップ #4: ブラウザ自動化ロジックの追加
Selenium CAPTCHA バイパスロジックを評価するため、自動化スクリプトはbot.sannysoft.comに接続しスクリーンショットを撮影します。この特殊なウェブページは、ユーザーが人間かボットかを判断するためにブラウザ内で複数のテストを実行します。お気に入りのブラウザでこのページにアクセスすると、すべてのテストが合格していることが確認できます。
Chromeインスタンスにget()メソッドを使用して対象ページを訪問させる:
driver.get("https://bot.sannysoft.com/")
次に、ページ全体のスクリーンショットを撮影する必要があります。残念ながら、Seleniumにはこれを直接実現する機能がありません。回避策として、ブラウザウィンドウを<body>ノードの幅と高さに設定し、スクリーンショットを撮影できます:
# ボディの幅と高さを取得
full_width = driver.execute_script("return document.body.parentNode.scrollWidth")
full_height = driver.execute_script("return document.body.parentNode.scrollHeight")
# ブラウザウィンドウをボディの幅と高さに設定
driver.set_window_size(full_width, full_height)
# ページ全体のスクリーンショットを撮影
driver.save_screenshot("screenshot.png")
# 元のウィンドウサイズに戻す
driver.set_window_size(original_size["width"], original_size["height"])
上記の操作でスクリーンショットが取得でき、screenshot.pngにはページ全体のスクリーンショットが保存されます。
これらをまとめると、以下のロジックになります:
from selenium import webdriver
# Chromeをヘッドレスモードで起動するように設定
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# Chromeインスタンスを起動
driver = webdriver.Chrome(options=options)
# 対象ページに接続
driver.get("https://bot.sannysoft.com/")
# 現在のウィンドウサイズを取得
original_size = driver.get_window_size()
# ボディの幅と高さを取得
full_width = driver.execute_script("return document.body.parentNode.scrollWidth")
full_height = driver.execute_script("return document.body.parentNode.scrollHeight")
# ブラウザウィンドウをボディの幅と高さに設定
driver.set_window_size(full_width, full_height)
# ページ全体のスクリーンショットを保存
driver.save_screenshot("screenshot.png")
# 元のウィンドウサイズに戻す
driver.set_window_size(original_size["width"], original_size["height"])
# ブラウザを閉じてリソースを解放
driver.quit()
上記のスクリプト.pyファイルを以下のコマンドで実行:
python script.py
スクリプトはヘッドレスモードでChromiumインスタンスを起動し、対象ページに接続、スクリーンショットを撮影後ブラウザを終了します。スクリプト実行終了時、プロジェクトルートフォルダにscreenshot.pngファイルが生成されます。開くと以下が表示されます:

赤い枠で示されている通り、vanilla Selenium経由で制御されるヘッドレスモードのChromeは様々なテストを通過しません。これは、スクリプトがボットとして検出される可能性が高いことを意味します。その結果、アンチボット技術で保護されたサイトでは、操作時にCAPTCHAが表示される場合があります。SeleniumでCAPTCHAを回避する解決策?Stealthプラグインです!
ステップ #5: Selenium Stealth プラグインのインストール
Selenium Stealthは、Seleniumで制御されるChrome/Chromiumインスタンスがボットとして検知されにくくするためのPythonパッケージです。このプロジェクトの目的は、既知のボット検知戦略のほぼ全てを回避するようブラウザを設定することです。
具体的には、Selenium Stealthはブラウザのプロパティを変更し、自動化を露呈するあらゆる情報漏洩を防止します。アンチボット回避ソリューションに精通している方なら、このパッケージはPuppeteer Stealthの再実装と見なせます。
pipパッケージselenium-stealth経由でSelenium Stealthをインストール:
pip install selenium-stealth
次に、script.pyファイルに以下の行を追加してライブラリをインポートします:
from selenium_stealth import stealth
さあ、準備完了です!あとはステルス設定を構成するだけです。
ステップ #6: CAPTCHA回避のためのステルス設定
Selenium Stealthを登録し、Chrome WebDriverがCAPTCHAを回避するよう設定するには、stealth()関数を以下のように呼び出します:
stealth(
driver,
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
関数の引数は好みに応じて設定してください。ただし、上記の値はほとんどのボット対策回避に十分であることを覚えておいてください。
よくできました!これでSeleniumが制御するブラウザは、人間ユーザーが使用する実世界のブラウザとして認識されます。
ステップ #7: ボット検出テストを再実行
以下が最終的なscript.jsファイルです:
from selenium import webdriver
from selenium_stealth import stealth
# Chromeをヘッドレスモードで起動するよう設定
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# Chromeインスタンスを起動
driver = webdriver.Chrome(options=options)
# ボット検知回避のためWebDriverを設定
# Selenium Stealthを使用
stealth(
driver,
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
# ターゲットページに接続
driver.get("https://bot.sannysoft.com/")
# 現在のウィンドウサイズを取得
original_size = driver.get_window_size()
# ボディの幅と高さを取得
full_width = driver.execute_script("return document.body.parentNode.scrollWidth")
full_height = driver.execute_script("return document.body.parentNode.scrollHeight")
# ブラウザウィンドウをボディの幅と高さに設定
driver.set_window_size(full_width, full_height)
# ページ全体のスクリーンショットを撮影
driver.save_screenshot("screenshot.png")
# 元のウィンドウサイズに戻す
driver.set_window_size(original_size["width"], original_size["height"])
# ブラウザを閉じてリソースを解放
driver.quit()
バイパスCAPTCHA Selenium Pythonスクリプトを再度実行:
python script.py
screenshot.pngを確認すると、すべてのボット検出テストに合格していることがわかります:

これで完了! SeleniumでアンチボットCAPTCHAを回避するコツがわかりました。
上記のCAPTCHA回避Seleniumソリューションが機能しない場合の対処法
残念ながら、アンチボット対策が注目するのはブラウザ設定だけではありません。IPレピュテーションも重要な要素であり、無料ライブラリで信頼性の高いIPに変更することはできません。これにはSeleniumプロキシの統合が必要です!
つまり、ブラウザ設定を最適化してもCAPTCHAが表示される可能性があります。単一クリックで解決できる簡易CAPTCHAには、selenium-recaptcha-solverやselenium-recptchaのようなパッケージが有効です。ただし、これらはreCAPTCHA v2専用で、現在はメンテナンスされていません。
前章の手法やこれらのパッケージの主な問題は、基本的なCAPTCHAにしか対応していない点です。Cloudflareのようなより複雑なボット対策システムに対処するには、はるかに強力なソリューションが必要です。
真のSelenium CAPTCHAソリューションをお探しですか?Bright Dataのウェブスクレイピングソリューションをお試しください!
これらは優れたアンロック機能を備え、専用のCAPTCHAの解決機能によりreCAPTCHA、hCaptcha、px_captcha、SimpleCaptcha、GeeTest CAPTCHA、FunCaptcha、Cloudflare Turnstile、AWS WAF Captcha、KeyCAPTCHAなど多数を自動処理します。
Bright DataのCAPTCHAソルバーは、Seleniumを含むあらゆるHTTPクライアントやブラウザ自動化ツールと連携可能なため、スクリプトへの統合が容易です。
Bright DataのCAPTCHAソルバーの使用方法の詳細と、すべての設定詳細については、ドキュメントをご覧ください。
まとめ
本記事では、CAPTCHAが自動化ソフトウェアにとって課題となる理由と、Seleniumでこれを解決する方法について説明しました。Selenium Stealthライブラリを利用すれば、Chromeのデフォルト設定を上書きしてボット検知を制限できます。しかし、この手法は決定的な解決策ではありません。
SeleniumのCAPTCHA回避ロジックがどれほど洗練されていても、高度なボット検知ツールは依然としてブロック可能です。真の解決策は、あらゆるウェブページのCAPTCHAフリーHTMLを返すアンブロックAPI経由でターゲットサイトに接続することです。
そのAPIは夢物語ではありません。実際に存在し、Web Unlockerと呼ばれています。これはウェブスクレイピングAPIであり、プロキシ統合によりリクエストごとに退出IPを自動ローテーションし、ブラウザフィンガープリンティング、自動再試行、CAPTCHA解決を代行します。CAPTCHA処理がこれほど簡単になったことはありません!
今すぐ登録して無料トライアルを開始しましょう。