TSUBOCK★LABO-ツボックラボ-

とあるセキュリティエンジニアの技術メモブログ

MENU

Pythonのrequestsモジュールを使ってリダイレクト先のURLだけ取得する

実際にアクセスしてリダイレクト先までアクセスするのではなく、リダイレクト先にはアクセスしないけど、リダイレクト先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など、アクセスした先に別のサイトが存在するが、アクセスはしたくない、というときに有用だと思います。