指定されたURLが有効か無効かを調べるコードです。ステータスコードが200番のものを有効、それ以外を無効と判断するコードです。
コード
def check_URL(url):#URLの有効性をチェックする。戻り値はbool,ステータスコード(or Errorコード)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"}
try:
response = requests.head(url, timeout=10,headers=headers)
if response.status_code == 200:
return True , response.status_code
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,headers=headers)
if response.status_code == 200:
return True , response.status_code
else:
return False , response.status_code
else:
return False , response.status_code
else:
return False , response.status_code
except requests.exceptions.RequestException as e:
return False , str(e)
ここに記載
解説
pythonのresponseライブラリを使い、指定されたURLが有効かどうかを調べています。
200なら有効。それ以外は無効と判断し、ステータスコードを返します。
ポイント1 200のみチェック
今回必要なのはステータスコードだけなので、リクエストをhead依頼します。
ステータスコードを見て個別処理します。
ポイント2 転送先は調査しない
もう一つのポイントは、転送先の調査をしないというところです。
実際、URLの有効/無効を調べているのでそれ以外はステータスコードで個別処理します。
ポイント3 URL自体が有効か判断する
単純ですが、これらはtry,except Exceptionでキャッチします。
リストが古いとそもそもURLでないことも考えられます。実際、5%程度にURLでない文字列などがふくまれていました。
#背景
Excelに保存されている古いデータの調査で、記載されたURLが有効かどうかを確認する必要がありました。
データ数は2万件ぐらいでしたが、10年前の古いデータでしたので404が4割、300が3割、残りが200番台という結果でした。
2000件程度あったリストのうち、404が4割、300台が3割、200が2割、残りが500台とエラーでした。
リストが引き継がれていたため、途中で書き換わってしまったエラーも多く残っていました。####と入力されており確認出来ないものもありました。
Yahoo!ジオシティーズも多かったですね。時代の移り変わりを感じます。