Web に少しでも時間を費やしたことがあれば、間違いなく恐ろしい「503 Service Unavailable」エラーに遭遇したことがあるはずです。平均的なインターネット ユーザーにとって、それは些細な煩わしさです。しかし、Web スクレイパーにとって、これは必要なデータを収集する上で大きな障害となる可能性があります。
Pingdom のデータによると、503 エラーは 5 番目に一般的な 25xx ステータス コードであり、すべてのサーバー エラー応答のほぼ 1,000% を占めています。また、38 人を超える開発者を対象とした調査では、503% が XNUMX エラーのトラブルシューティングと解決が仕事の中で最もイライラする部分の XNUMX つであると回答しました。
プロの Web スクレイパーとして、503 エラーによってプロジェクトが台無しになるわけにはいきません。この詳細なガイドでは、503 ステータス コードの意味、その原因、そして最も重要なことに、ステータス コードを回避して克服するための実証済みの戦略を正確に説明します。飛び込んでみましょう!
503 エラーの分解: 概要
503 エラーの回避について話す前に、XNUMX エラーの実際の意味を理解することが重要です。
503 ステータス コードは、サーバーが一時的にリクエストを処理できないことを示す HTTP 応答ステータス コードです。これは通常、サーバーが過負荷になっているか、メンテナンスのために停止しているために発生します。
公式には、503 ステータス コードの説明は「サービスが利用できません」です。これは、次のようなメッセージとともにエラー ページに表示されることがよくあります。
- 「メンテナンスのダウンタイムまたは容量の問題により、サーバーは一時的にリクエストを処理できません。後でもう一度お試しください。」
- 「サービスが利用できません。しばらくしてからもう一度お試しください。」
- 「このサイトのトラフィックは通常よりも多くなっています。しばらくお待ちください。すぐに戻ってきます!」
注意すべき重要な点の 503 つは、5 エラーは、サーバー自体は適切に機能しているものの、何らかの理由で現在のリクエストを処理できないことを具体的に意味することです。これは、実際のサーバー障害を示す他の XNUMXxx エラーとは異なります。
ステータスコード | 名前 | 説明 |
---|---|---|
500 | 内部サーバーエラー | サーバー上の予期しない状態を示す一般的なエラー |
501 | 実装されていません | サーバーはリクエストを満たす機能をサポートしていません |
502 | 不正なゲートウェイ | プロキシ/ゲートウェイとして機能するサーバーがオリジンから無効な応答を受け取りました |
503 | サービスは利用できません | サーバーが過負荷になっているか、メンテナンスのために停止しています |
504 | ゲートウェイタイムアウト | ゲートウェイ サーバーがオリジン サーバーからの応答を時間内に受信しませんでした |
ご覧のとおり、503 エラーは灰色の領域に分類されます。サーバー自体が壊れているわけではなく、その時点で応答できないだけです。これは重要な違いです。後で説明します。
503エラーの原因を分析する
では、実際にサーバーが 503 エラーを返す原因は何でしょうか?一般的なシナリオがいくつかあります。
過負荷のサーバーリソース
すべてのサーバーには、CPU、メモリ、ディスク I/O、ネットワーク帯域幅などの有限なリソースがあります。受信リクエストの量がそれらのリソースが処理できる量を超えると、サーバーは完全なクラッシュを避けるために新しい接続を拒否し始めることがあります。 503 で応答して、現在ビジーすぎてリクエストを実行できないことを示します。定期メンテナンス
多くの Web サイトには定期的なメンテナンス期間があり、更新の展開、バックアップの実行、その他の維持が行われます。この間、サイトは部分的または完全に利用できなくなる可能性があります。メンテナンスが完了してサーバーが再起動されるまで、リクエストは 503 で失敗します。DDoS攻撃の軽減
Web サイトが分散型サービス拒否 (DDoS) 攻撃を受けた場合、緊急のレート制限またはブロック ルールが有効になり、悪意のあるトラフィックを回避することができます。これにより、正当なリクエストが集中攻撃に巻き込まれ、503 エラーで拒否される可能性があります。Web アプリケーション ファイアウォールのブロック
多くの Web サイトは、SQL インジェクションやクロスサイト スクリプティングなどの一般的な攻撃から保護するために、Web アプリケーション ファイアウォール (WAF) 経由でリクエストをルーティングします。リクエストが疑わしいと思われる場合、WAF はリクエストをブロックし、503 エラーを返すことがあります。アンチボット サービスの CAPTCHA
一部の Web サイトでは、CAPTCHA やその他のチャレンジ/レスポンス テストを使用して、人間になりすましたボットを除外しようとしています。自動 Web スクレイパーはこれらの罠にかかり、503 エラーが発生する可能性があります。
Imperva の 2022 Bad Bot Report によると、全 Web サイト トラフィックの 27.7% がボットから来ており、そのボット トラフィックの 30.2% が悪意のあるものです。 Web スクレーパーにとって残念なことに、これまで以上に多くのサイトが取り締まりを行っているのも不思議ではありません。
503 エラーの根本原因を特定する
Web スクレイパーが 503 エラーのみを返し始めても、パニックにならないでください。最初のステップは、根本的な原因を特定することです。主に次の XNUMX つの可能性があります。
- ウェブサイトが完全にダウンしているか、誰でも利用できません
- Web サイトは利用可能ですが、特定のスクレイパーがブロックされています
どのシナリオに対処しているのかを確認するには、通常の Web ブラウザーで、または地理的に異なる地域のプロキシから、503 エラーを返す URL を参照してみてください。サイトに正常にアクセスできる場合、503 エラーはスクレイピング IP アドレスに固有のものであることを意味します。
サードパーティの Web サイト監視ツールを使用して、サイトの全体的なステータスを確認することもできます。
- DownDetector は、人気のある Web サイトに関してユーザーから報告された問題を追跡します
- UptimeRobot と Pingdom は、世界中の複数の場所から URL を監視します
- IsItDownRightNow と PresentDown により、ステータスを簡単にチェックできます
これらのいずれかで Web サイトが全員にダウンしていると表示された場合は、問題が解決されるまで待つ必要があります。どんなに賢いコーディングを行っても、完全にオフラインの Web サイトをスクレイピングすることはできません。
しかし、サイトが他の世界にとって問題がないように見える場合は、スクレーパーを通常のユーザーをよりよく模倣することに集中する必要があることを意味します。
503 エラーを回避するための実証済みの戦術
この時点で、スクレイパーのリクエストが選り分けられ、503 エラーでブロックされていると判断しました。何ができるでしょうか? Web スクレイパーを Web サイトの正常な状態に戻すための実証済みのテクニックをいくつか紹介します。
ロールを遅くする
Web サイトがスクレイパーをブロックする最も一般的な理由は、スクレイパーがあまりにも多くのリクエストを迅速に実行するためです。人間が閲覧できるよりも早くサイトを攻撃することは、非常に疑わしいことです。防御の第一線は、最大でも 10 ~ 15 秒ごとに XNUMX ページのみをリクエストするようにスクレイパーを調整することです。また、タイミングをより有機的に見せるために、リクエスト間にランダムな遅延を追加することも検討してください。負荷を分散する
遅延が追加されたとしても、単一の IP アドレスから短期間に数百または数千のリクエストを行うことは依然として大きな危険信号です。回転するプロキシのプール全体にリクエストを分散すると、トラフィックがさまざまな場所のさまざまな正規ユーザーから送信されているように見えます。異なるサブネットや異なるプロバイダーのプロキシを使用すると、カモフラージュがさらに強化されます。人間に溶け込む
スクレイパーのリクエストに関するすべては、通常のブラウザを使用する通常のユーザーを模倣する必要があります。これは、Web サイトの典型的な訪問者に一致する共通の User-Agent ヘッダーを設定することを意味します。これは、Accept-Language や Referer などの通常のヘッダーを含めることも意味します。サイトが発行する Cookie も保存して送り返すように、必ず Cookie 瓶を設定してください。一般的なボット トラップを回避する
すべてのページのすべてのリンクを迅速にクロールするなど、人間にとっては非常に非効率的だがボットにとっては一般的なクロール パターンは避けてください。代わりに、ターゲット ページの中央キューの周りにスクレーパーを編成します。行儀の良いボットに近づかないように指示する robots.txt ルールを尊重します。また、同じ数ページを何度も延々と読み進めないでください。
不可避の 503 からの回復
場合によっては、適切な予防措置をすべて講じていても、スクレイパーで 503 エラーが発生することがあります。おそらく、サイトで正規のトラフィックが突然急増したか、あるいはリクエストの一部が偶然過負荷のサーバーを介してルーティングされた可能性があります。
リクエストが失敗した場合、すぐに再試行しないでください。大量の再試行はボットの大きなシグナルであり、IP が禁止される可能性があります。代わりに、指数バックオフを使用します。
- 1 秒待ってから再試行してください
- 再度失敗した場合は、2 秒待ってから再試行してください
- 再度失敗した場合は、4 秒待ってから再試行してください
- 再度失敗した場合は、8 秒待ってから再試行してください
- など、最大 5 回まで再試行可能
これを実装する Python 関数は次のとおりです。
import time
import random
def retry_with_exp_backoff(func, max_retries=5):
for n in range(max_retries):
try:
return func()
except Exception:
if n == max_retries - 1:
raise
sleep_seconds = 2 ** n + random.uniform(0, 1)
time.sleep(sleep_seconds)
ランダムな小数遅延は、再試行をずらすのに役立ち、多数のスクレイパーがすべてまったく同じ秒に再試行することを防ぎます。
503 回再試行してもまだ 5 が発生する場合は、とりあえず先に進み、後で再試行することをお勧めします。しばらくサイトの別のセクションにアクセスするか、スクレイパーを完全に一時停止してください。あまりしつこいと思われたくないですよね。
核のオプション: ヘッドレス ブラウザの使用
特に強力なボット対策が施されている Web サイトの場合、503 エラーを回避する唯一の方法が、ヘッドレス ブラウザーで完全なステルス モードに移行することである場合があります。
Puppeteer や Playwright などのツールを使用すると、実際のブラウザをプログラムで制御できます。 Selenium とは異なり、デフォルトでヘッドレスで実行されるように設計されており、人間の動作をエミュレートするための追加のトリックがあります。
- 偽のマウスの動きとクリックを生成する
- ビューポート サイズとデバイス パラメータのランダム化
- リクエスト/レスポンスの傍受と変更
これは、スクレーパーを実際のユーザーと区別できないようにするために最も近い方法です。欠点は、単純なリクエストを送信する場合に比べて、かなりリソースを大量に消費することです。ただし、ボットに敵意のあるサイト上のミッションクリティカルなデータの場合は、トレードオフの価値があります。
法的および倫理的なスクレイピングのグレーゾーン
Web サイトのボット対策を回避することによる潜在的な法的および倫理的影響を認めないのは不謹慎です。
一般に、裁判所は、公的にアクセス可能な情報をスクレイピングすることはコンピュータ詐欺および悪用法に違反しないとの判決を下しています。 2019 年に画期的な HiQ Labs 対 LinkedIn 訴訟において、米国第 9 巡回区控訴裁判所は、LinkedIn の公開プロフィールのスクレイピングは、そのデータがログインの背後にあるものではないため「不正アクセス」ではないとの判決を下しました。
しかし、一部の企業は、著作権侵害、動産への侵入、契約違反、その他の訴訟原因をウェブスクレイパーに対して提起し、成功しています。停止通知書を受け取った後に技術的制限を回避してサイトにアクセスすることは、特に法的なリスクを伴います。
また、503 レート制限エラーを意図的に回避して Web サイトへの攻撃を続けることは、インターネットの社会規範に反し、サイト所有者のリソースを無駄にしているという議論もあります。できるからといって、必ずしもそうすべきであるとは限りません。
倫理的な Web スクレイパーとして、常に robots.txt のルールに従い、サイトの利用規約の暗黙の契約を尊重し、サーバーに過度の負担をかけないようにする必要があります。場合によっては、サイト所有者と直接協力して、API やデータ ダンプなどの承認された手段を通じて必要なデータを取得する方が良い場合があります。
Web スクレイピングとボット対策の未来
Web スクレイパーと、それをブロックしようとする Web サイト運営者との間のいたちごっこは、減速する兆しがありません。
Web データの価値を認識する企業が増えるにつれ、洗練されたスクレーパーを構築する動機はかつてないほど高まっています。同時に、多くの Web サイトは、悪意のある攻撃者から身を守るために、より厳格なボット対策措置を採用しています。
機械学習モデルは、人間の閲覧パターンを学習するスクレーパーと、ボットのようなリクエスト パターンを学習する Web サイトの両方で使用されています。ボットが人間を模倣しようとし、ボット検出器がその偽装を暴こうとすることで、この AI 軍拡競争が激化するのを目にすることになるでしょう。
Web スクレイピングをめぐる法的状況も依然として進化しており、スクレイピングがどこで不正アクセスの一線を越えるのかについては多くの未解決の疑問が残っています。 HiQ Labs 対 LinkedIn のような CFAA 判決がさらに増えることは間違いなく、Web スクレイピング コミュニティにより明確な情報が提供されることが期待されます。
今のところ、503 エラーは依然として多くのスクレーパーの存在の悩みの種です。しかし、その意味を理解し、賢いスロットル手法を使用し、卑劣なボットからいくつかのトリックを借用することで、それを克服してデータの流れを維持することができます。
503 エラーを回避するための重要なポイント
503 Service Unavailable エラーについては、この詳細な説明で多くの内容を取り上げてきました。覚えておくべき重要なポイントは次のとおりです。
503 エラーは、Web サイトのサーバーが正常に機能しているものの、過負荷になっているか、その時点でリクエストを処理できないことを意味します。
さらに診断する前に、503 が自分だけのものなのか、サイト全体のものなのかを必ず判断してください。
503 エラーの最も一般的な原因は、リクエストが多すぎて速すぎること、サーバーのメンテナンス、DDoS 保護、Web アプリケーションのファイアウォール ルール、およびボット対策 CAPTCHA です。
遅延を追加したり、プロキシ ローテーションを使用したり、人間のようなリクエスト ヘッダーを偽装したり、さまざまなクローリング パターンを使用したりすると、スクレイパーを目立たないようにすることができます。
指数関数的バックオフを使用して失敗したリクエストを再試行し、ボットのように見えすぎずに一時的な 503 を処理します。
Puppeteer や Playwright のようなヘッドレス ブラウザは、最も洗練されたアンチボット システムに対する最後の防御線です。
503 エラーと利用規約の回避に関しては、法的にグレーゾーンが存在する可能性があることに注意してください。
Webスクレイパーとボット対策の間の技術軍拡競争は加速する一方だろう。
これらの推奨事項に従い、ある程度の自制心と常識を働かせることで、503 エラーを克服し、アプリケーションを強化するために必要なデータを取得できます。ハッピースクレイピング!