Pythonの『requests』でリダイレクト時、履歴情報の取得や無効設定
- 公開日:2019/01/24
- 更新日:2019/01/24
- 投稿者:n bit
通常Pythonの『requests』でURLをgetした時にリダイレクトされる場合、Responseで取得出来るURLやstatus_codeはリダイレクト先の情報です。リダイレクト元情報の取得やリダイレクト時の履歴情報の取得、get時のリダイレクト無効設定方法などを解説します。
この記事は約 分で読めます。(文字)
Pythonの『requests.get』はリダイレクト後の情報を取得する
Pythonの『requests』でURLをgetした時にリダイレクトされる場合、デフォルトの設定ではリダイレクト後、最終的にアクセスしたページのURLやstatus_codeが情報として取得されます。
本来であればリクエストでURLをgetしたときにリダイレクトされた場合、期待するステータスコードは『301』です。しかし実際には、ステータスコードを取得してみるとリダイレクトで最終的にアクセスが成功していれば『200』が返されます。
import requests
url = 'http://dot-blog.jp/'
res = requests.get(url)
response_status_code = res.status_code
print('response_status_code:', response_status_code)
出力結果
response_status_code: 200
上記はサンプルで当サイトのURLを取得したものです。当サイトはSSL化しているため正しくは『https://dot-blog.jp/』ですが、リダイレクトさせるためあえて『http://dot-blog.jp/』にしています。
- http://dot-blog.jp/
- ↓:リダイレクト
- https://dot-blog.jp/
『http://dot-blog.jp/』でアクセスしても、リダイレクト後『https://dot-blog.jp/』に正しくアクセスできたため、ステータスコードは『200』が出力されました。
本来『requests.get』でサイトのデータを取得したいため動作としてはこれで正しいといえます。
『requests.get』でステータスコード『301』を取得するには
しかしながら、通常ステータスコードを取得する場合はリクエストしたURLがどのように扱われたかを知りたいと言う用途が多いと思いますので、できれば『301』を取得したいところです。
実際私もリクエストでgetしたURLが正しくレスポンスされているのか、もしくはリダイレクトされたのか判別したかったので、ステータスコード『301』を取得するための設定に変更しました。
対応方法は大きく分けて二通りあります。
1つ目はリクエストgetで返されるレスポンスから履歴データを取得する方法。もう一つはリクエストgetしにそもそもリダイレクトさせない方法。
- requests.get(url) で返されるレスポンスから履歴データを取得
- requests.get(url) 時、リダイレクトを無効化
それぞれの方法を分けて解説していきましょう。
『requests』でリダイレクト時、履歴情報の取得方法
requestsで指定URLをgetしたときにリダイレクトされる場合、履歴情報を取得するには『history』を利用します。使用方法は他の属性情報の取得と同じでレスポンスの後に『history』属性をつけて情報を取得しましょう。
import requests
url = 'http://dot-blog.jp/'
res = requests.get(url)
history = res.history
print('history:', history)
出力結果
history: [<Response [301]>]
リダイレクトの履歴情報は古いものから順にリスト形式で格納されています。アクセスするにはインデックス番号を利用しましょう。
個別の履歴情報にはリダイレクト元URLとステータスコードが格納されています。インデックス番号の後に属性をつけて取得しましょう。『url』と『status_code』属性をつけることでアクセスできます。
import requests
url = 'http://dot-blog.jp/'
res = requests.get(url)
history = res.history
print('history:', history)
print('history_url:', history[0].url)
print('history_status_code:', history[0].status_code)
出力結果
history: [<Response [301]>]
history_url: http://dot-blog.jp/
history_status_code: 301
指定URLがリダイレクトしない場合(正常アクセス)の処理
リダイレクトされない正常アクセス時と比較して処理方法をまとめておきましょう。
ダイレクトにアクセスした場合はレスポンスのURLとステータスコードを取得するだけです。
- リダイレクトしないように『https://dot-blog.jp/』でリクエストしています。
import requests
url = 'https://dot-blog.jp/'
res = requests.get(url)
response_url = res.url
print('response_url:', response_url)
response_status_code = res.status_code
print('response_status_code:', response_status_code)
出力結果
response_url: https://dot-blog.jp/
response_status_code: 200
指定URLがリダイレクトする場合の処理
リダイレクトされたかどうかを判定しリダイレクトされた場合は『history』ヒストリーのURLとステータスコード、そしてレスポンスされたURLとステータスコードを取得することでリダイレクト元の情報とリダイレクト先の情報を合わせて取得することができます。
- リダイレクトするように『http://dot-blog.jp/』でリクエストしています。
if で分岐しておくと使い勝手が良いでしょう。
import requests
url = 'http://dot-blog.jp/'
res = requests.get(url)
print('request_url:', url)
history = res.history
if history:
print('history:', history)
print('history_url:', history[0].url)
print('history_status_code:', history[0].status_code)
response_url = res.url
print('response_url:', response_url)
response_status_code = res.status_code
print('response_status_code:', response_status_code)
出力結果
request_url: http://dot-blog.jp/
history: [<Response [301]>]
history_url: http://dot-blog.jp/
history_status_code: 301
response_url: https://dot-blog.jp/
response_status_code: 200
『requests』でリダイレクトの無効設定
リダイレクト先の情報が必要ない場合、リクエスト時に最初からリダイレクトを無効にしておくと後の処理が簡単です。
リクエスト時、リダイレクトを無効にするには『allow_redirects』パラメータ設定を『False』にします。
- requests.get(url,allow_redirects=False)
import requests
url = 'http://dot-blog.jp/'
res = requests.get(url, allow_redirects=False)
print('request_url:', url)
history = res.history
if history:
print('history:', history)
print('history_url:', history[0].url)
print('history_status_code:', history[0].status_code)
response_url = res.url
print('response_url:', response_url)
response_status_code = res.status_code
print('response_status_code:', response_status_code)
出力結果
request_url: http://dot-blog.jp/
response_url: http://dot-blog.jp/
response_status_code: 301
今日のdot
リクエストでリダイレクト時の履歴情報を取得するには『history』を使用します。
res = requests.get(url, allow_redirects=False)
history = res.history
print('history:', history)
print('history_url:', history[0].url)
print('history_status_code:', history[0].status_code)
リクエスト時、リダイレクト動作を無効にするには『allow_redirects』パラメータ設定を『False』にしましょう。
res = requests.get(url, allow_redirects=False)
【フリーランス向けの完全無料Pythonプログラミング講座】
dot blogではこの記事以外にも完全無料でフリーランス向けのPythonプログラミング講座を公開中です。フリーランスとして活躍し稼ぐための強力な武器となりますよ。
Python入門講座【無料のプログラミング学習講座】
最近特に注目度が高くなってきているプログラミング言語Python。転職、フリーランス、独立・起業を検討中、日々の業務が忙しい社会人等は今こそ身に付けておきたいスキルの1つ。初心者向けにやさしいプログラミング学習内容のPython入門講座を無料で公開。