質問編集履歴

2

ソースコード改良

2019/03/24 08:17

投稿

teityura
teityura

スコア84

test CHANGED
File without changes
test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  from urllib.request import Request, urlopen
54
54
 
55
- from urllib.error import URLError
55
+ from urllib.error import URLError, HTTPError
56
56
 
57
57
 
58
58
 
@@ -62,6 +62,8 @@
62
62
 
63
63
  url = "https://gihyo.jp/dp"
64
64
 
65
+ # url = "http://not_exist_site/"
66
+
65
67
  res = throw_request(url)
66
68
 
67
69
  html = gen_html(res)
@@ -72,7 +74,7 @@
72
74
 
73
75
 
74
76
 
75
- def throw_request(url, req=None):
77
+ def throw_request(url, req=None, recursive=False):
76
78
 
77
79
  if req is None:
78
80
 
@@ -82,47 +84,47 @@
82
84
 
83
85
  res = urlopen(req)
84
86
 
87
+ except HTTPError as e:
88
+
89
+ print('raise HTTPError')
90
+
91
+ print('StatusCode: ' + str(e.code))
92
+
93
+ print('ErrorReason: ' + str(e.reason))
94
+
95
+ if e.code == 403 and recursive is False:
96
+
97
+ print("アクセスが禁止されています")
98
+
99
+ print("ユーザーエージェントを偽装して再接続します")
100
+
101
+ req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
102
+
103
+ return throw_request(url, req, True) # 再帰呼び出し
104
+
105
+ else:
106
+
107
+ print('正常なレスポンスでないため、エラー終了します')
108
+
109
+ sys.exit(1)
110
+
85
111
  except URLError as e:
86
112
 
87
- if hasattr(e, 'code'): # HTTPError
88
-
89
- print('raise HTTPError')
113
+ print('raise URLError')
90
-
91
- print(e.code)
114
+
92
-
93
- print(e.reason)
94
-
95
- if e.code == 403:
96
-
97
- print("アクセスが禁止されています")
115
+ print('ErrorReason: ' + str(e.reason))
98
-
116
+
99
- print("ユーザーエージェントを偽装て再接続します")
117
+ print('正常なレスポンスでないため、終了します')
100
-
101
- req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
118
+
102
-
103
- # 再帰呼び出し後、戻ってくるので、returnを付ける必要がある
104
-
105
- return throw_request(url, req)
106
-
107
- # 本来、returnを付けずに、下記のように呼び出し、main()にelse句のresを返してほしい
108
-
109
- # throw_request(url, req)
110
-
111
- sys.exit(1)
119
+ sys.exit(1)
112
-
113
- elif hasattr(e, 'reason'): # URLError
114
-
115
- print('raise URLError')
116
-
117
- print(e.reason)
118
-
119
- sys.exit(1)
120
120
 
121
121
  else:
122
122
 
123
- print("success Request")
123
+ print("request was successful")
124
+
124
-
125
+ print('StatusCode: ' + str(res.getcode()))
126
+
125
- return res # ここで帰りたい
127
+ return res
126
128
 
127
129
 
128
130
 

1

補足追加

2019/03/24 08:17

投稿

teityura
teityura

スコア84

test CHANGED
File without changes
test CHANGED
@@ -165,3 +165,49 @@
165
165
  main()
166
166
 
167
167
  ```
168
+
169
+
170
+
171
+ 【補足】
172
+
173
+ 質問1 につきましては、
174
+
175
+ ドキュメントの探し方が上手く慣れるようにしていかなきゃですね。
176
+
177
+ 参考リンク先の情報で解決しました。ありがとうございます。
178
+
179
+
180
+
181
+ 質問2 につきましては、
182
+
183
+ return throw_request(url, req)
184
+
185
+ の部分で再帰呼び出しした結果をreturnしていますが、
186
+
187
+ throw_request(url, req)
188
+
189
+ だけで、else句のreturn resより、
190
+
191
+ main()関数のresにthrow_requestのresを返したいということです。
192
+
193
+ なんとなく、変な気がしていたのですが、
194
+
195
+ else句のreturnを返す先はif句のthrow_requestに対してで、
196
+
197
+ return throw_request(url, req)
198
+
199
+ としなければ、返す先がないので、これが普通の動きなんだなと納得してきました。
200
+
201
+
202
+
203
+ 質問3 につきましては、
204
+
205
+ HTTPプロトコルではできないとのことで、一旦納得しました。
206
+
207
+ きちんと理解するには、TCP/IPやOSI参照モデルを勉強する必要がありそうです。
208
+
209
+
210
+
211
+ 質問4 につきましては、
212
+
213
+ 別質問にして、再度掲載させていただこうと思います。