実際にアクセスしてリダイレクト先までアクセスするのではなく、リダイレクト先にはアクセスしないけど、リダイレクト先URLだけ取得したいときに、Pythonで実現する方法を調べたので残しておきます。今回URLのアクセスにはrequestsモジュールを使用します。
事前準備
requestsモジュールのインストールはpipコマンドで実施できます。
$ pip install requests
下記コマンドでインストールされたrequestsのバージョンが確認できます。
$ pip list | grep requests requests 2.28.1
筆者の環境にはバージョン2.28.1がインストールされました。
使用方法
実際にリダイレクト先URLのURLをリダイレクトせずに取得してみたいと思います。
今回は http://www.yahoo.co.jp
を例使わせてもらおうと思います。
http://www.yahoo.co.jp
に実際にアクセスすると、リダイレクトが行われてhttps://www.yahoo.co.jp
に転送されます。
requestsモジュールで実際にアクセスしてみましょう。
import requests url = "http://www.yahoo.co.jp" res = requests.get(url) print(res.status_code) # 最終アクセス先のステータスコード print(res.url) # 最終アクセス先のURL print(res.history) # リダイレクトしたときの履歴
実行結果は以下の通り。
200 https://www.yahoo.co.jp:443/ [<Response [301]>]
http://www.yahoo.co.jp
にアクセスしたときにリダイレクトされて、 https://www.yahoo.co.jp:443/
にアクセスし、アクセスしたときのステータスコードが 200
リダイレクト先がhttps://www.yahoo.co.jp:443/
、1回リダイレクトされているので、ステータスコードコード301がres.historyに格納されています。
上記をリダイレクトさせないようにするには、requests.getにallow_redirectsオプションをFalseで与えましょう。
import requests url = "http://www.yahoo.co.jp" res = requests.get(url, allow_redirects=False) print(res.status_code) # 最終アクセス先のステータスコード print(res.url) # 最終アクセス先のURL print(res.history) # リダイレクトしたときの履歴
すると実行結果は以下の通りに変わります。
301 http://www.yahoo.co.jp/ []
上記は、http://www.yahoo.co.jp
にアクセスしたときのステータスコード。リダイレクトされるので301が帰ってきますが、 allow_redirectsオプションをFalseにしているので、リダイレクト先に遷移しません。
res.urlで取得できる値もアクセスしたhttp://www.yahoo.co.jp
になり、res.historyもリダイレクトの履歴がないので空になります。
上記だけではリダイレクト先がわからないのですが、headersのlocationの中にあります。
print(res.headers)
とすると
{'Date': 'Fri, 06 Jan 2023 05:11:39 GMT', 'Connection': 'keep-alive', 'Server': 'ATS', 'Cache-Control': 'no-store', 'Location': 'https://www.yahoo.co.jp:443/', 'Content-Type': 'text/html', 'Content-Language': 'en', 'Content-Length': '1'}
というようにrequests.getしたときの情報が取得できます。中のjsonを見てみるとどうやらLocation
キーの値がリダイレクト先のURLのようなので
print(res.headers["Location"])
とすると
https://www.yahoo.co.jp:443/
リダイレクト先だけが取得できます。
短縮URLやダイナミックDNSなど、アクセスした先に別のサイトが存在するが、アクセスはしたくない、というときに有用だと思います。