【ITニュース解説】Python Web Scraping: Practical Ways to Bypass Anti-Bot Protection (Proxy Rotation, CAPTCHA Services)
2025年09月18日に「Dev.to」が公開したITニュース「Python Web Scraping: Practical Ways to Bypass Anti-Bot Protection (Proxy Rotation, CAPTCHA Services)」について初心者にもわかりやすく解説しています。
ITニュース概要
PythonでWebスクレイピングをする際、サイトのブロックや画像認証を回避する方法を解説する。IPブロック対策には複数のプロキシを使い、画像認証(CAPTCHA)は専門の外部サービスで解決する。これにより、効率よく安定してデータを収集できる。
ITニュース解説
Webスクレイピングは、インターネット上のウェブサイトからプログラムを用いて自動的に情報を収集する技術だ。Pythonでは通常、「requests」ライブラリでHTTP通信を行い、「BeautifulSoup」などのパーサーでHTMLを解析し、必要なデータを取り出す。しかし、多くのウェブサイトは自動化されたアクセス、つまり「ボット」からのアクセスを防ぐための対策を講じており、スクレイピング作業はこれらの防御策に直面することが頻繁にある。
最も一般的な問題は、同じIPアドレスから短期間に大量のアクセスがあった場合に、ウェブサイト側からアクセスがブロックされることだ。これは、「429 Too Many Requests」というエラーコードや、アクセス拒否という形で現れる。もう一つの大きな障害は「CAPTCHA(キャプチャ)」である。これは、ユーザーが人間であることを証明するためのテストで、歪んだ文字の読み取り、特定の画像の選択、あるいはチェックボックスをクリックするだけで裏で行動が監視される場合もある。これらの対策によって、スクレイピングプログラムが期待したデータを受け取れず、空のデータが返ってくることも少なくない。
これらのブロックを回避し、継続的にデータを収集するためには、いくつかの実用的な方法がある。その一つが「プロキシローテーション」だ。プロxyとは、ウェブサイトと自分のコンピューターの間に立つ中継サーバーのことで、これを使うと、ウェブサイトからはプロキシサーバーのIPアドレスが見えるようになる。一つのIPアドレスから大量のアクセスを行うと、それは自動化されたボットの活動として検出され、ブロックされやすい。そこで、複数のプロキシサーバーを「プール」として用意し、リクエストごとに異なるプロキシを経由させることで、ウェブサイト側からはあたかも異なる複数のユーザーがアクセスしているように見せかけることができる。これにより、IPアドレスベースのアクセス制限を回避し、ブロックの可能性を大幅に減らす。
プロキシにはいくつかの種類がある。無料で利用できるプロキシリストも存在するが、これらは安定性に欠けたり、すでにブロック対象になっている場合も多いため、本格的なスクレイピングプロジェクトには不向きなことが多い。有料のプロキシサービスは、安定性や速度、匿名性において優れており、用途に応じて「データセンタープロキシ」「レジデンシャルプロキシ」「モバイルプロキシ」などを選択できる。データセンタープロキシは速度が速く比較的安価だが、ウェブサイト側からプロキシだと認識されやすい側面がある。レジデンシャルプロキシやモバイルプロキシは、一般家庭や携帯電話回線のIPアドレスを利用するため、より人間らしいアクセスに見せかけることができ、検出されにくいという利点があるが、費用は高くなる。Pythonのrequestsライブラリでは、リクエストを送る際にプロキシ情報を辞書形式で渡すだけで簡単に利用できる。複数のプロキシを用意し、それを順番に切り替えて使うことで、効率的なローテーションを実現する。ただし、プロキシも時間とともに使えなくなったり、ブロックされたりすることがあるため、常に使えるプロキシを監視し、健全性をチェックする仕組みが必要となる。プロキシの利用は、CAPTCHAの表示頻度を減らす効果も期待できる。
CAPTCHAについては、その種類と対策方法が多岐にわたる。古典的なテキストCAPTCHAは、画像に表示された歪んだ文字を読み取るもので、シンプルなものであればOCRで解決できる場合もあるが、複雑になると難易度が上がる。GoogleのreCAPTCHA v2は、おなじみの「私はロボットではありません」チェックボックスや、画像の中から特定のオブジェクトを選択させるパズル形式が主流だ。reCAPTCHA v3はさらに進化しており、画面上にパズルは表示されず、ユーザーの行動に基づいて0.0から1.0までのスコアを裏側で算出し、スコアが低いとアクセスを拒否したり、追加の課題を提示したりする。hCaptchaやFunCaptchaもreCAPTCHAと同様に、特定のオブジェクトを探したり、パズルを解いたりする形式で、主にCloudflareなどのセキュリティサービスで利用されている。他にも、スライダーを動かすGeeTestなど、多様なCAPTCHAが存在する。
これらのCAPTCHAを回避する方法は二つに分けられる。一つは、CAPTCHAが表示されないように予防策を講じることだ。これは、スクレイパーの挙動をできるだけ人間に近づけることを意味する。具体的には、リクエストを送る間隔をランダムにしたり、異なるUser-Agent(ウェブブラウザの種類を示す情報)を頻繁に切り替えたり、Cookieを適切に管理して同じセッションのユーザーとして認識させることなどが含まれる。また、robots.txtでウェブサイトがスクレイピングを許可している範囲を尊重することも重要だ。これらの工夫により、ウェブサイト側からボットと判断されるのを防ぎ、CAPTCHAの表示頻度を減らすことができる。
もう一つの方法は、CAPTCHAが表示された際に、それを解決するための専門サービスを利用することである。このようなサービスは、AIと人間の労働力を組み合わせてCAPTCHAを解決する。「2Captcha」や「SolveCaptcha」といったサービスが有名だ。これらのサービスに、表示されたCAPTCHAの画像や、reCAPTCHAなどの場合はウェブサイトの「サイトキー」とURLを送信すると、数秒から数十秒で解決済みのテキストやトークンを返してくれる。このトークンをスクレイパーがウェブサイトのフォームに挿入して送信することで、人間として認証されたかのように振る舞うことができる。古典的なテキストCAPTCHAであれば画像を送りテキストを受け取る。reCAPTCHA v2では、ウェブページから取得したサイトキーとターゲットURLをサービスに送ると、解決されたトークンが返される。このトークンをウェブサイトの適切なフィールドに挿入してリクエストを続行する。reCAPTCHA v3やCloudflare Turnstile、hCaptcha、FunCaptchaなども同様に、サイトキーや特定の情報と共にサービスに送り、返ってきたトークンをウェブサイトに提示する。
ただし、CAPTCHA解決サービスを利用する際にはいくつかの注意点がある。まず、解決には必ず時間的な遅延と費用が発生する。すべてのCAPTCHA解決は、スクレイピングのプロセスに数秒の遅延と少額のコストを追加するため、できるだけCAPTCHAの表示を回避する工夫をすることが予算の節約につながる。また、GoogleのreCAPTCHAなどでは、CAPTCHAを解決したIPアドレスと、その後にウェブサイトにアクセスする際のIPアドレスの一貫性がチェックされる場合がある。そのため、プロキシを使用している場合は、CAPTCHA解決サービスにも同じプロキシ情報を提供し、解決元とアクセス元のIPアドレスを一致させる設定が必要となることがある。
これらのCAPTCHA解決を支援するPythonライブラリも多数提供されている。「2captcha-python」や「solvecaptcha-python」はその公式クライアントであり、主要なCAPTCHAタイプに対応し、プロキシ設定や非同期処理などもサポートする。他にも、複数のプロバイダーを統合し、自動フェイルオーバー機能を持つ「captchatools」のような便利なライブラリもある。これらのライブラリを活用することで、API経由で簡単にCAPTCHA解決サービスと連携し、スクレイピングワークフローに組み込むことができる。
まとめると、ウェブサイトのアンチボット対策を突破し、持続的にデータをスクレイピングするためには、スクレイパーが人間らしい振る舞いをするよう工夫することが第一歩だ。具体的には、プロキシを定期的に切り替える「プロキシローテーション」によってIPアドレスのブロックを回避し、User-Agentの変更、リクエスト間のランダムな遅延、Cookieの適切な利用などでボット判定を避ける。それでもCAPTCHAに直面した場合は、信頼できる専門の解決サービスにそのタスクを渡し、返ってきたトークンやテキストをスクレイピングのプロセスに組み込むことが効果的だ。これらの対策には、解決ごとの遅延と費用が発生するため、計画的な利用が求められる。このような技術と忍耐をもって臨めば、防御されたウェブサイトからも必要なデータを大規模に、そして継続的に収集することが可能となる。