質問編集履歴

3

追加質問の自己解決

2017/04/08 21:34

投稿

chrokurojp
chrokurojp

スコア26

test CHANGED
File without changes
test CHANGED
@@ -62,6 +62,14 @@
62
62
 
63
63
 
64
64
 
65
+
66
+
67
+ 「f = open("./static/"+os.path.basename(resource), "wb")」
68
+
69
+ にする事で解決できました
70
+
71
+
72
+
65
73
  # web_crawler.py
66
74
 
67
75
 

2

パス修正

2017/04/08 21:34

投稿

chrokurojp
chrokurojp

スコア26

test CHANGED
File without changes
test CHANGED
@@ -62,14 +62,22 @@
62
62
 
63
63
 
64
64
 
65
+ # web_crawler.py
66
+
67
+
68
+
69
+ ```
70
+
65
- # python3 web_crawler.py "https://search.yahoo.co.jp/image/search?ei=UTF-8&fr=sfp_as&aq=-1&oq=&ts=1609&p=%E8%B5%B0%E3%82%8C%EF%BC%81
71
+ python3 web_crawler.py "https://search.yahoo.co.jp/image/search?ei=UTF-8&fr=sfp_as&aq=-1&oq=&ts=1609&p=%E8%B5%B0%E3%82%8C%EF%BC%81
66
72
 
67
73
  %E3%80%80%E3%82%B3%E3%83%BC%E3%83%89%E5%AD%A6%E5%9C%92&meta=vc%3D" .jpeg,.jpg
68
74
 
69
-
70
-
71
75
  ```
72
76
 
77
+
78
+
79
+ ```
80
+
73
81
  #-*- coding:utf-8 -*-
74
82
 
75
83
 

1

追加質問の為

2017/04/08 21:05

投稿

chrokurojp
chrokurojp

スコア26

test CHANGED
File without changes
test CHANGED
@@ -37,3 +37,323 @@
37
37
  pip3 freeze | grep beautifulsoup
38
38
 
39
39
  beautifulsoup4==4.5.3
40
+
41
+
42
+
43
+
44
+
45
+ 【追加質問です。】
46
+
47
+ 上記は解決しました。
48
+
49
+
50
+
51
+ 下記を実行するとプログラムが置かれたフォルダ直下に保存される為、
52
+
53
+ f = open(os.path.basename("./static/"+resource), "wb")
54
+
55
+ と書き換えれば指定ディレクトリに保存できる考えたのですが
56
+
57
+ うまく行きませんでした。
58
+
59
+
60
+
61
+ アドバイスお願いします
62
+
63
+
64
+
65
+ # python3 web_crawler.py "https://search.yahoo.co.jp/image/search?ei=UTF-8&fr=sfp_as&aq=-1&oq=&ts=1609&p=%E8%B5%B0%E3%82%8C%EF%BC%81
66
+
67
+ %E3%80%80%E3%82%B3%E3%83%BC%E3%83%89%E5%AD%A6%E5%9C%92&meta=vc%3D" .jpeg,.jpg
68
+
69
+
70
+
71
+ ```
72
+
73
+ #-*- coding:utf-8 -*-
74
+
75
+
76
+
77
+ import os
78
+
79
+ import sys
80
+
81
+ import time
82
+
83
+ import bs4
84
+
85
+ import urllib.request
86
+
87
+
88
+
89
+ def crawring(url, extensions):
90
+
91
+ """
92
+
93
+ Content:
94
+
95
+ クローリング
96
+
97
+ Param:
98
+
99
+ url: クローリングするURL
100
+
101
+ extensions: 取得するリソースの拡張子(list)
102
+
103
+ """
104
+
105
+ # 指定したURLのHTMLを取得
106
+
107
+ html = get_html_string(url)
108
+
109
+ if len(html) < 1:
110
+
111
+ print("HTMLが取得できませんでした。")
112
+
113
+ print("URLを確認してください。")
114
+
115
+ sys.exit(1)
116
+
117
+
118
+
119
+ # リソース取得
120
+
121
+ get_resource(html, extensions)
122
+
123
+
124
+
125
+ def get_resource(html, extensions):
126
+
127
+ """
128
+
129
+ Content:
130
+
131
+ リソース取得
132
+
133
+ Param
134
+
135
+ html: HTML
136
+
137
+ extensions 拡張子のリスト
138
+
139
+ """
140
+
141
+
142
+
143
+ resource_list = []
144
+
145
+
146
+
147
+ soup = bs4.BeautifulSoup(html,'lxml')
148
+
149
+ for a_tag in soup.find_all("a"):
150
+
151
+ href_str = a_tag.get("href")
152
+
153
+ try:
154
+
155
+ (path, ext) = os.path.splitext(href_str)
156
+
157
+ if ext in extensions:
158
+
159
+ resource_list.append(href_str)
160
+
161
+ except:
162
+
163
+ pass
164
+
165
+
166
+
167
+ resource_list = sorted(set(resource_list), key=resource_list.index)
168
+
169
+ for resource in resource_list:
170
+
171
+ try:
172
+
173
+ print("download ---> [%s]" % os.path.basename(resource))
174
+
175
+ request = urllib.request.urlopen(resource)
176
+
177
+ f = open(os.path.basename("./static/"+resource), "wb")
178
+
179
+ f.write(request.read())
180
+
181
+ except Exception as e:
182
+
183
+ print(e)
184
+
185
+ print("download failed ... [%s]" % os.path.basename(resource))
186
+
187
+ finally:
188
+
189
+ time.sleep(3)
190
+
191
+
192
+
193
+ def get_html_string(url):
194
+
195
+ """
196
+
197
+ Content:
198
+
199
+ HTML取得
200
+
201
+ Param:
202
+
203
+ url HTMLを取得するURL
204
+
205
+ """
206
+
207
+ decoded_html = ""
208
+
209
+
210
+
211
+ # HTMLを取得
212
+
213
+ try:
214
+
215
+ request = urllib.request.urlopen(url)
216
+
217
+ html = request.read()
218
+
219
+ except:
220
+
221
+ return decoded_html
222
+
223
+
224
+
225
+ # エンコードを取得
226
+
227
+ enc = check_encoding(html)
228
+
229
+ if enc == None:
230
+
231
+ return decoded_html
232
+
233
+
234
+
235
+ # HTMLをデコード
236
+
237
+ decoded_html = html.decode(enc)
238
+
239
+
240
+
241
+ return decoded_html
242
+
243
+
244
+
245
+ def check_encoding(byte_string):
246
+
247
+ """
248
+
249
+ Content:
250
+
251
+ 文字コード確認
252
+
253
+ Param:
254
+
255
+ byte_string: バイト文字列
256
+
257
+ """
258
+
259
+ encoding_list = ["utf-8", "utf_8", "euc_jp",
260
+
261
+ "euc_jis_2004", "euc_jisx0213", "shift_jis",
262
+
263
+ "shift_jis_2004","shift_jisx0213", "iso2022jp",
264
+
265
+ "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_3",
266
+
267
+ "iso2022_jp_ext","latin_1", "ascii"]
268
+
269
+
270
+
271
+ for enc in encoding_list:
272
+
273
+ try:
274
+
275
+ byte_string.decode(enc)
276
+
277
+ break
278
+
279
+ except:
280
+
281
+ enc = None
282
+
283
+
284
+
285
+ return enc
286
+
287
+
288
+
289
+
290
+
291
+ def check_args():
292
+
293
+ """
294
+
295
+ Content:
296
+
297
+ 起動引数確認
298
+
299
+ """
300
+
301
+ if len(sys.argv) == 3:
302
+
303
+ return True
304
+
305
+ else:
306
+
307
+ return False
308
+
309
+
310
+
311
+ def print_usage():
312
+
313
+ print("Usage: %s URL Extensions" % __file__)
314
+
315
+ print("URLにはクロールしたいウェブサイトのアドレスを指定してください。")
316
+
317
+ print("Extensionsにはクロールしたときに取得するファイルの拡張子を指定してください。")
318
+
319
+ print("Extensionsはカンマ区切りで複数指定できます。")
320
+
321
+
322
+
323
+ def main():
324
+
325
+ """
326
+
327
+ Content:
328
+
329
+ main
330
+
331
+ """
332
+
333
+ # 引数確認
334
+
335
+ if check_args() is False:
336
+
337
+ print_usage()
338
+
339
+ sys.exit(1)
340
+
341
+
342
+
343
+ url = sys.argv[1]
344
+
345
+ extensions = sys.argv[2].split(",")
346
+
347
+
348
+
349
+ # クロール開始
350
+
351
+ crawring(url, extensions)
352
+
353
+
354
+
355
+ if __name__ == "__main__":
356
+
357
+ main()
358
+
359
+ ```