クローリング中に目撃するステータスコードまとめ

# 初めまして
株式会社 Panta Rhei CEOのかずです。[Pandasista](https://x.com/sotsogprinciple)というハンネでツイッターをやっています。pandas大好きです。データも好き。

# Qiita Engineer Festaでマラソンを完走したい
[Qiita Engineer Festa](https://qiita.com/official-campaigns/engineer-festa/2024)という素敵なイベントがあります。

その中で<B>投稿マラソン</B>という素敵なコースが！！！
なんと「<B>38記事書けば素敵な景品がもらえる！！</B>」らしいです。

1日1記事でギリギリ達成みたいです。
頑張っていきましょう！

# クローリングでよく見るステータスコード
さて本題です。
![statuscode_404.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540865/f12f536f-8817-5f12-01d9-e2a7023a4363.jpeg)
弊社では、データを取り扱うという特性から、スクレイピング基盤がしっかりしています。
リクエスト先のサーバーに負荷をかけないスクレイピングなどのTipsが多くあり、
本記事ではそのうちよく見るステータスコードとそうでないものをまとめました。
定義されているほとんどのステータスコードを網羅しているので少しでも助けになれば幸いです。

# 本題

以下がステータスコード一覧表です

|ステータスコード|意味|説明|よく見るか|対応方法|
|---|--------------------------------------|-----------|----------|----------|
|100|Continue|リクエストの初めの部分を受け取り、クライアントが続行を継続できる状態。|全然見ない||
|101|SwitchingProtocols|プロトコルの切り替えが行われることを示す。|全然見ない||
|102|Processing|リクエストが受け入れられたが、完了までに時間がかかることを示す。|全然見ない||
|200|OK|リクエストが正常に成功したことを示す。|ほとんどこれ(だと嬉しい)|全件これを目指してクロールします|
|201|Created|リクエストが成功し、新しいリソースが作成されたことを示す。|たまーに見る||
|202|Accepted|リクエストは受け入れられたが、まだ処理されていないことを示す。|あんまり見ない||
|203|Non-AuthoritativeInformation|リクエストは成功したが、返される情報が他のソースから取得されたものであることを示す。|見る||
|204|NoContent|リクエストは成功したが、返すコンテンツがないことを示す。|全然見ない||
|205|ResetContent|リクエストは成功したが、クライアントがリセットを行う必要があることを示す。|全然見ない||
|206|PartialContent|リクエストの一部が成功したことを示す。|全然見ない||
|207|Multi-Status|複数のステータスが返される場合に使用される。|全然見ない||
|300|MultipleChoices|リクエストに対して複数の選択肢があることを示す。|全然見ない||
|301|MovedPermanently|リクエストしたリソースが恒久的に別のURLに移動したことを示す。|よく見る|ただのリダイレクト|
|302|Found|リクエストしたリソースが一時的に別のURLに移動したことを示す。|たまに見る|ただのリダイレクト|
|303|SeeOther|リクエストに対する応答が別のURIにあることを示す。|たまに見る||
|304|NotModified|リソースは変更されていないことを示し、キャッシュを使用してリソースを取得することを示す。|見ない||
|305|UseProxy|リクエストされたリソースはプロキシを経由してアクセスする必要があることを示す。|見ない|会社とか特殊なネットワークにいる環境ではあるのかも|
|307|TemporaryRedirect|リクエストされたリソースが一時的に別のURIにあることを示す。|見ない|基本的にURLベースでのクロールなので|
|308|PermanentRedirect|リクエストされたリソースが恒久的に別のURIにあることを示す。|見ない|基本的にURLベースでのクロールなので|
|400|BadRequest|クライアントのリクエストにエラーがあることを示す。|よく見る|headersとかcookie保持の設定とかを変える|
|401|Unauthorized|認証が必要であることを示す。|見ない|ログインや認証が必要なデータをスクレピングするのはあんまり良くない(個人的な感想)|
|402|PaymentRequired|将来の使用のために予約されている。|見たことがある||
|403|Forbidden|サーバーがリクエストを拒否していることを示す。|良く見る|原因が多種多様。IPBanの可能性もあればcookieやセッションベースでForbiddenしている場合もある|
|404|NotFound|リクエストしたリソースが見つからないことを示す。|良く見る|URLやサイトのディレクトリ構造が変わっているので再度xpath解析等を行おう|
|405|MethodNotAllowed|リクエストしたメソッドが許可されていないことを示す。|見ない|これが出てくるようであればPostリクエストとかにしてみるのも有りかもしれない。|
|406|NotAcceptable|リクエストしたリソースが、リクエストのヘッダで指定された条件に合致しないことを示す。|たまに見る|headersを修正する|
|407|ProxyAuthenticationRequired|プロキシ認証が必要であることを示す。|全然見ない|インターネットでクローリングしていたら多分大丈|
|408|RequestTimeout|サーバーがリクエストを待っている間にタイムアウトしたことを示す。|たまにある|結構クライアント側の問題だったりする|
|409|Conflict|リクエストが現在のサーバーの状態と矛盾していることを示す。|全然見ない||
|410|Gone|リクエストされたリソースが永久に利用できなくなったことを示す。|全然見ない||
|411|LengthRequired　|リクエストがContent-Lengthヘッダフィールドを含んでいないためにサーバーがリクエストを拒否していることを示す。|全然見ない|分かりやすいステータスですね。Content-Lengthを含めましょう|
|412|PreconditionFailed|リクエストがサーバーに対して指定した前提条件が失敗したことを示す。|全然見ない||
|413|PayloadTooLarge|リクエストペイロードがサーバーが処理できる限界を超えていることを示す。|全然見ない||
|414|URITooLong|リクエストURIがサーバーが処理できる限界を超えていることを示す。|全然見ない||
|415|UnsupportedMediaType|リクエストされたメディアタイプがサーバーでサポートされていないことを示す。|全然見ない||
|416|RangeNotSatisfiable|リクエストのRangeヘッダフィールドが無効であることを示す。|全然見ない||
|417|ExpectationFailed|Expectリクエストヘッダフィールドがサーバーで満たされなかったことを示す。|全然見ない||
|418|I'mateapot|エイプリルフールのジョークとして定義されたHTTPステータスコード。|見たい||
|421|MisdirectedRequest|リクエストがレスポンスを生成することができないサーバーに送信されたことを示す。|全然見ない||
|422|UnprocessableEntity|リクエストが適切に構文解析されたが、論理エラーが含まれていることを示す。|全然見ない|ただクローラデバック時はよく見そう|
|423|Locked|リクエストされたリソースがロックされていることを示す。|全然見ない||
|424|FailedDependency|以前のリクエストが失敗したため、現在のリクエストが失敗したことを示す。|全然見ない||
|425|TooEarly|リクエストがサーバーにとって時期尚早であることを示す。|全然見ない||
|426|UpgradeRequired|クライアントが異なるプロトコルにアップグレードする必要があることを示す。|全然見ない||
|428|PreconditionRequired|リクエストが条件付きで送信されなければならないことを示す。|||
|429|TooManyRequests|クライアントが短期間にあまりにも多くのリクエストを送信していることを示す。|良く見る|IPBanです。IP変えましょう。多分IP変えても多分またすぐ429になります。|
|431|RequestHeaderFieldsTooLarge|リクエストヘッダフィールドが大きすぎるためサーバーがリクエストを処理できないことを示す。|見たことある||
|451|UnavailableForLegalReasons|法的な理由によりリソースが利用できないことを示す。|見たことない||
|500|InternalServerError|サーバー内部でエラーが発生したことを示す。|良く見る|原因が多種多様すぎる、権限周りを見てみよう|
|501|NotImplemented|サーバーがリクエストを処理するための機能を実装していないことを示す。|良く見る|headersに問題がある|
|502|BadGateway|ゲートウェイまたはプロキシサーバーが上位サーバーから無効なレスポンスを受け取ったことを示す。|良く見る|時間を置くとよく解決する|
|503|ServiceUnavailable|サーバーが一時的に利用不可能であることを示す。|良く見る||
|504|GatewayTimeout|ゲートウェイまたはプロキシサーバーが上位サーバーからのレスポンスを待つ間にタイムアウトしたことを示す。|たまに見る|権限系の問題であることが多いです|
|505|HTTPVersionNotSupported|サーバーがリクエストで使用されたHTTPプロトコルバージョンをサポートしていないことを示す。|全然見ない||
|506|VariantAlsoNegotiates|サーバー内部の構成エラーを示す。|全然見ない||
|507|InsufficientStorage|サーバーがリクエストを処理するためのストレージを持っていないことを示す。|全然見ない||
|508|LoopDetected|サーバーが無限ループを検出したことを示す。|全然見ない||
|510|NotExtended|拡張が必要であることを示す。|全然見ない||
|511|NetworkAuthenticationRequired|ネットワークアクセスのために認証が必要であることを示す。|全然見ない||

# まとめ

## 1XX系
全然見ないです

## 2XX系
200以外はあんまり見ないです

## 3XX系
よく見ますがリダイレクト系なのでスルーで大丈夫です！

## 4XX系
エラーです。URLのタイポからheadersの内容書き換えまで全てを疑いましょう。
URLのタイポでは、例えば動的に```href```が生成されるようなJSゴリゴリのサイトだと結構発掘されます。

## 5XX系
調べると「サーバー側の問題です」「こちら側でなんとかできません」と出てきますが、結構こちら側でなんとかできます。
headersをどうにかいじってください。またcookieやセッションも監視しましょう。

# 終わりに
弊社は<B>Google Cloud for StartupsのAIスタートアップに認定されているAI企業です</B>。

有り余る技術力により、世のAI活用課題を解決致します。
クラウド基盤から内製化AI、一気通貫のデータ利活用基盤構築まで、何かお困りごとがありましたらぜひ弊社、
[株式会社 Panta Rhei](https://www.pantarhei.co.jp)にご相談ください！