Forbiddenに対応させたかった
HTTPステータスコードが
403:Forbidden:閲覧禁止だった場合、
ユーザーエージェントを偽装してアクセスするサンプル
#!/usr/bin/env python
# encoding: utf-8
import sys
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
def main():
url = "https://gihyo.jp/dp"
# url = "http://not_exist_site/"
res = throw_request(url)
html = gen_html(res)
save_file(html, "index.html")
def throw_request(url, req=None, recursive=False):
if req is None:
req = Request(url)
try:
res = urlopen(req)
except HTTPError as e:
print('raise HTTPError')
print('StatusCode: ' + str(e.code))
print('ErrorReason: ' + str(e.reason))
if e.code == 403 and recursive == False:
print("アクセスが禁止されています")
print("ユーザーエージェントを偽装して再接続します")
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
res = throw_request(url, req, True) # 再帰呼び出し
return res
else:
print('正常なレスポンスでないため、エラー終了します')
sys.exit(1)
except URLError as e:
print('raise URLError')
print('ErrorReason: ' + str(e.reason))
print('正常なレスポンスでないため、エラー終了します')
sys.exit(1)
else:
print("request was successful")
print('StatusCode: ' + str(res.getcode()))
return res
def gen_html(res):
# f.read() の戻り値は bytes型
# 文字列(str型)として扱うには、文字コードを指定してデコードする
# res の charset でデコードして、保存する
encoding = res.info().get_content_charset(failobj="utf-8")
print("encoding: ", encoding)
html = res.read().decode(encoding)
return html
def save_file(text, file_name):
with open(file_name, 'w') as f:
f.write(text)
print("save: " + file_name)
if __name__ == "__main__":
main()
python urllib-sample4.py raise HTTPError StatusCode: 403 ErrorReason: Forbidden アクセスが禁止されています ユーザーエージェントを偽装して再接続します request was successful StatusCode: 200 encoding: utf-8 save: index.html

コメント