はじめに
今日webスクレイピング関係の処理が失敗しているのを見つけ、その原因を探していました。
ログを確認するとステータスコードは200であったため、ページの構造でも変わったのかな?と過去のページ構造に思いを馳せていましたが、結果としてはページ構造は何も変わっておらず、実はリクエストが失敗していたという状況でした。
原因特定に時間がかかってしまった要因の一つとして、requestsの仕様を知らなかったことが挙げられるため備忘録としてまとめておきます。
※ 最終的な原因はサイトのURLが一部変わっていたことでした。
httpレスポンスについて
httpレスポンスはステータス行、ヘッダー、本体(ボディ)の3つに分かれています。
このときステータスコードはヘッダーの1行目にあります。
私はこのステータスコードだけを見て「リクエストは正しく通っている」と判断をしてしまいました。
HTTP/1.1 200 OK
requestsの仕様
httpリクエストを送り、responseを受け取るためのコードはざっくり以下のようになっています。
session = requests.session()
url = "~~~"
response = session.get(url)
このとき、session.get
ではallow_redirects=True
がデフォルトとなっており、このオプションがTrue
だと300番台のステータスコードが返ってきた際に、自動でリダイレクトを行います。
そのため、response.status_code
だけ確認してしまうと、リクエストが正しく処理されていると私のように勘違いし、他のエラー要因に思いを馳せる可能性があります。
レスポンスが通っているか否かを先に把握することで原因の探索時間は大幅に減少すると思います。
まとめ
- 自分が使っているライブラリの仕様については公式ドキュメントを確認しよう!