特定のURLに対して、ステータスコードを取得し、有効性を判断します。
例えば、リストからURLへ逐次アクセスする場合、アクセス先が有効かどうかを確認しておけばアクセスエラーをあらかじめ回避できます。
URLの有効性の判定はHTTPレスポンスのステータスコードを確認します。
ステータスコード200が取得できれば、そのURLは一応正常という形です。
さらに、200以外のステータスコードでも対応方法を選ぶことができます。
問題の判定に利用しているのは以下のようになります。
ステータスコード | 不具合 | 対応方法 |
---|---|---|
404 | URLが間違っている 無効になった可能性が高い |
URLのチェック |
429 | リダイレクト(phpか.htaccess)が設定されている可能性が高い | 個別に確認 seleniumを利用してリダイレクト先を再取得する |
30x | httpリダイレクトが設定されている | meta情報にリダイレクト先が記載されているのでURLを書き換える |
5xx | サーバーエラー | 時間をおいてアクセス |
実際に判定に利用しているコードです。
.py
import requests
def isCheckURL(url):
try:
response = requests.head(url, timeout=10)
if response.status_code == 200:
return True
elif response.status_code == 405: # Method Not Allowed
allowed_methods = response.headers.get('Allow', '')
if 'GET' in allowed_methods:
response = requests.get(url, timeout=10)
if response.status_code == 200:
return True
else:
print(f"URL is not valid. HTTP status code: {response.status_code}")
return False
else:
print(f"URL is not valid. Neither HEAD nor GET requests are allowed.")
return False
else:
print(f"URL is not valid. HTTP status code: {response.status_code}")
return False
except requests.exceptions.RequestException as e:
print(f"URL is not valid. Error: {e}")
return False
url = "https://example.com"
if isCheckURL(url):
print("The URL is valid.")
else:
print("The URL is not valid.")
#個人的な感想
これを使い始めてから、スクレイピングやクローラーの設計・メンテナンスがとても楽になりました。
アクセスの可否を事前判定できますし、動かしながら問題箇所を個別に判定できます。