質問編集履歴
2
ソースコード改良
title
CHANGED
File without changes
|
body
CHANGED
@@ -25,42 +25,43 @@
|
|
25
25
|
# encoding: utf-8
|
26
26
|
import sys
|
27
27
|
from urllib.request import Request, urlopen
|
28
|
-
from urllib.error import URLError
|
28
|
+
from urllib.error import URLError, HTTPError
|
29
29
|
|
30
30
|
|
31
31
|
def main():
|
32
32
|
url = "https://gihyo.jp/dp"
|
33
|
+
# url = "http://not_exist_site/"
|
33
34
|
res = throw_request(url)
|
34
35
|
html = gen_html(res)
|
35
36
|
save_file(html, "index.html")
|
36
37
|
|
37
38
|
|
38
|
-
def throw_request(url, req=None):
|
39
|
+
def throw_request(url, req=None, recursive=False):
|
39
40
|
if req is None:
|
40
41
|
req = Request(url)
|
41
42
|
try:
|
42
43
|
res = urlopen(req)
|
44
|
+
except HTTPError as e:
|
45
|
+
print('raise HTTPError')
|
46
|
+
print('StatusCode: ' + str(e.code))
|
47
|
+
print('ErrorReason: ' + str(e.reason))
|
48
|
+
if e.code == 403 and recursive is False:
|
49
|
+
print("アクセスが禁止されています")
|
50
|
+
print("ユーザーエージェントを偽装して再接続します")
|
51
|
+
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
|
52
|
+
return throw_request(url, req, True) # 再帰呼び出し
|
53
|
+
else:
|
54
|
+
print('正常なレスポンスでないため、エラー終了します')
|
55
|
+
sys.exit(1)
|
43
56
|
except URLError as e:
|
44
|
-
if hasattr(e, 'code'): # HTTPError
|
45
|
-
|
57
|
+
print('raise URLError')
|
46
|
-
print(e.code)
|
47
|
-
print(e.reason)
|
48
|
-
if e.code == 403:
|
49
|
-
|
58
|
+
print('ErrorReason: ' + str(e.reason))
|
50
|
-
|
59
|
+
print('正常なレスポンスでないため、エラー終了します')
|
51
|
-
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
|
52
|
-
# 再帰呼び出し後、戻ってくるので、returnを付ける必要がある
|
53
|
-
return throw_request(url, req)
|
54
|
-
# 本来、returnを付けずに、下記のように呼び出し、main()にelse句のresを返してほしい
|
55
|
-
# throw_request(url, req)
|
56
|
-
|
60
|
+
sys.exit(1)
|
57
|
-
elif hasattr(e, 'reason'): # URLError
|
58
|
-
print('raise URLError')
|
59
|
-
print(e.reason)
|
60
|
-
sys.exit(1)
|
61
61
|
else:
|
62
|
-
print("
|
62
|
+
print("request was successful")
|
63
|
+
print('StatusCode: ' + str(res.getcode()))
|
63
|
-
return res
|
64
|
+
return res
|
64
65
|
|
65
66
|
|
66
67
|
def gen_html(res):
|
1
補足追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -81,4 +81,27 @@
|
|
81
81
|
|
82
82
|
if __name__ == "__main__":
|
83
83
|
main()
|
84
|
-
```
|
84
|
+
```
|
85
|
+
|
86
|
+
【補足】
|
87
|
+
質問1 につきましては、
|
88
|
+
ドキュメントの探し方が上手く慣れるようにしていかなきゃですね。
|
89
|
+
参考リンク先の情報で解決しました。ありがとうございます。
|
90
|
+
|
91
|
+
質問2 につきましては、
|
92
|
+
return throw_request(url, req)
|
93
|
+
の部分で再帰呼び出しした結果をreturnしていますが、
|
94
|
+
throw_request(url, req)
|
95
|
+
だけで、else句のreturn resより、
|
96
|
+
main()関数のresにthrow_requestのresを返したいということです。
|
97
|
+
なんとなく、変な気がしていたのですが、
|
98
|
+
else句のreturnを返す先はif句のthrow_requestに対してで、
|
99
|
+
return throw_request(url, req)
|
100
|
+
としなければ、返す先がないので、これが普通の動きなんだなと納得してきました。
|
101
|
+
|
102
|
+
質問3 につきましては、
|
103
|
+
HTTPプロトコルではできないとのことで、一旦納得しました。
|
104
|
+
きちんと理解するには、TCP/IPやOSI参照モデルを勉強する必要がありそうです。
|
105
|
+
|
106
|
+
質問4 につきましては、
|
107
|
+
別質問にして、再度掲載させていただこうと思います。
|