リダイレクトURLのhttpステータスコード3XX/302をキャプチャしようとしています。しかし、ステータスコードが200になるため、取得できません。
これがコードです:
import requests
r = requests.get('http://goo.gl/NZek5')
print r.status_code
別のページにリダイレクトされるため、これは301または302のいずれかを発行するはずです。私はいくつかのリダイレクトURL(例: http://fb.com )を試しましたが、再び200を発行しています。リダイレクトコードを正しくキャプチャするにはどうすればよいですか?
requests
はリダイレクトを処理します、 リダイレクトと履歴 を参照してください。
requests
でリダイレクトを処理しない場合は、allow_redirects=False
を設定します。または、r.history
リストに含まれるリダイレクト応答を検査できます。
デモ:
>>> import requests
>>> r = requests.get('http://goo.gl/NZek5')
>>> r.history
(<Response [301]>,)
>>> r.history[0].status_code
301
>>> r.history[0].headers['Location']
'http://docs.python-requests.org/en/latest/user/quickstart/'
>>> r.url
u'http://docs.python-requests.org/en/latest/user/quickstart/'
>>> r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
>>> r.status_code
301
>>> r.url
u'http://goo.gl/NZek5'
したがって、allow_redirects
がTrue
の場合、リダイレクトが追跡され、返される最終応答はリダイレクト後の最終ページです。 allow_redirects
がFalse
の場合、リダイレクトであっても、最初の応答が返されます。
requests.get
では、オプションのキーワード引数allow_redirects
を使用できます。デフォルトはTrue
です。 allow_redirects
をFalse
に設定すると、次のようにリダイレクト後の自動リダイレクトが無効になります。
In [1]: import requests
In [2]: r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
In [3]: print r.status_code
301
このソリューションはリダイレクトを識別し、リダイレクトの履歴を表示し、一般的なエラーを処理します。これにより、コンソールでURLが要求されます。
import requests
def init():
console = input("Type the URL: ")
get_status_code_from_request_url(console)
def get_status_code_from_request_url(url, do_restart=True):
try:
r = requests.get(url)
if len(r.history) < 1:
print("Status Code: " + str(r.status_code))
else:
print("Status Code: 301. Below are the redirects")
h = r.history
i = 0
for resp in h:
print(" " + str(i) + " - URL " + resp.url + " \n")
i += 1
if do_restart:
init()
except requests.exceptions.MissingSchema:
print("You forgot the protocol. http://, https://, ftp://")
except requests.exceptions.ConnectionError:
print("Sorry, but I couldn't connect. There was a connection problem.")
except requests.exceptions.Timeout:
print("Sorry, but I couldn't connect. I timed out.")
except requests.exceptions.TooManyRedirects:
print("There were too many redirects. I can't count that high.")
init()