Pythonの『requests』でリダイレクト時、履歴情報の取得や無効設定

  • 公開日:2019/01/24
  • 更新日:2019/01/24
  • 投稿者:n bit

通常Pythonの『requests』でURLをgetした時にリダイレクトされる場合、Responseで取得出来るURLやstatus_codeはリダイレクト先の情報です。リダイレクト元情報の取得やリダイレクト時の履歴情報の取得、get時のリダイレクト無効設定方法などを解説します。

  • Python

この記事は約 分で読めます。(文字)

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)

▲ ページの先頭へ戻る

このページの目次

目次