teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ソースコード改良

2019/03/24 08:17

投稿

teityura
teityura

スコア84

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
- print('raise HTTPError')
57
+ print('raise URLError')
46
- print(e.code)
47
- print(e.reason)
48
- if e.code == 403:
49
- print("アクセスが禁止されています")
58
+ print('ErrorReason: ' + str(e.reason))
50
- print("ユーザーエージェントを偽装て再接続します")
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
- sys.exit(1)
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("success Request")
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

補足追加

2019/03/24 08:17

投稿

teityura
teityura

スコア84

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
+ 別質問にして、再度掲載させていただこうと思います。