web-dev-qa-db-ja.com

pythonリクエストのHttpリダイレクトコード3XX

リダイレクト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を発行しています。リダイレクトコードを正しくキャプチャするにはどうすればよいですか?

26
Bishwash

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_redirectsTrueの場合、リダイレクトが追跡され、返される最終応答はリダイレクト後の最終ページです。 allow_redirectsFalseの場合、リダイレクトであっても、最初の応答が返されます。

50
Martijn Pieters

requests.getでは、オプションのキーワード引数allow_redirectsを使用できます。デフォルトはTrueです。 allow_redirectsFalseに設定すると、次のようにリダイレクト後の自動リダイレクトが無効になります。

In [1]: import requests
In [2]: r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
In [3]: print r.status_code
301
10
George Bahij

このソリューションはリダイレクトを識別し、リダイレクトの履歴を表示し、一般的なエラーを処理します。これにより、コンソールで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()
0
Wes