回答編集履歴

6

修正

2017/01/02 21:43

投稿

退会済みユーザー
test CHANGED
@@ -382,8 +382,6 @@
382
382
 
383
383
  ```
384
384
 
385
- 変なリンクを踏んでいるのがエラーの原因だと私は予想します。
386
-
387
385
  これとは別にこのプログラムは同じ画像を何回も保存しているので
388
386
 
389
387
  全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。

5

補足

2017/01/02 21:42

投稿

退会済みユーザー
test CHANGED
@@ -227,3 +227,163 @@
227
227
  キャッシュの場所についての参考
228
228
 
229
229
  [キャッシュの場所を確認する](http://www.tipsfound.com/chrome/01001)
230
+
231
+
232
+
233
+ ```Ruby
234
+
235
+ require 'open-uri'
236
+
237
+ require 'nokogiri'
238
+
239
+ require 'anemone'
240
+
241
+
242
+
243
+
244
+
245
+ Dir.mkdir("画像フォルダ") unless Dir.exist?("画像フォルダ")
246
+
247
+ Dir.chdir("画像フォルダ")
248
+
249
+
250
+
251
+ opts = {
252
+
253
+ depth_limit: 1,
254
+
255
+ # 0 => 指定したURL先のみ
256
+
257
+ # 1 => 指定したURLにあるlinkから1回のジャンプで辿れる先も見る。
258
+
259
+ delay: 1,#ページ訪問間隔を1秒空ける
260
+
261
+ }
262
+
263
+
264
+
265
+ # 取得したいサイトURL
266
+
267
+ url = 'http://nekonekomamire.blog86.fc2.com/'
268
+
269
+
270
+
271
+ html = open(url) do |f|
272
+
273
+ f.read
274
+
275
+ end
276
+
277
+
278
+
279
+
280
+
281
+ # htmlを解析して目的のURLを取得
282
+
283
+ Anemone.crawl(url, opts) do |anemone|
284
+
285
+
286
+
287
+ # 起点となるページから飛ぶ先を予め指定
288
+
289
+ anemone.focus_crawl do |page|
290
+
291
+ page.links.keep_if { |link|
292
+
293
+ link.to_s.match(/http:\/\/nekonekomamire.blog86.fc2.com\//)
294
+
295
+ # 正規表現でhttp://nekonekomamire.blog86.fc2.com/に当てはまるurlを指定してます。
296
+
297
+ }
298
+
299
+ end
300
+
301
+
302
+
303
+
304
+
305
+ anemone.on_every_page do |page|
306
+
307
+ doc = Nokogiri::HTML.parse(html)
308
+
309
+
310
+
311
+ page.doc.css('div[class="body"]').each do |node|
312
+
313
+ begin
314
+
315
+ gazouURL = node.css('a').attribute('href').to_s
316
+
317
+ puts "#{gazouURL} を取得。"
318
+
319
+ name = File.basename(gazouURL)
320
+
321
+
322
+
323
+ #正規表現で画像ファイル以外は弾くようにしてます。
324
+
325
+ if /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/ =~ name then
326
+
327
+ # ここで、URLの画像をダウンロードします。
328
+
329
+ open(name, 'wb') do |output|
330
+
331
+ open(gazouURL) do |input|
332
+
333
+ output.write(input.read)
334
+
335
+ end
336
+
337
+ end
338
+
339
+ puts "#{name} をダウンロードしました。"
340
+
341
+ else
342
+
343
+ puts "#{name} は画像ファイルではないのでスルーします。"
344
+
345
+ end
346
+
347
+ rescue
348
+
349
+ puts("エラー")
350
+
351
+ end
352
+
353
+ puts "4秒休憩\n\n"
354
+
355
+ sleep(4)
356
+
357
+ end
358
+
359
+ end
360
+
361
+ end
362
+
363
+
364
+
365
+ ```
366
+
367
+ resucueを入れてエラーが出ても一応は止まらないようにしました。
368
+
369
+ これがエラーが出る前のnode.css('a')です。↓
370
+
371
+ ```ここに言語を入力
372
+
373
+ [#<Nokogiri::XML::Element:0x277ec60 name="a" attributes=[#<Nokogiri::XML::Attr:0x277ec24 name="href" value="http://blog-imgs-52.fc2.com/n/e/k/nekonekomamire/20121105013114dde.jpg">, #<Nokogiri::XML::Attr:0x277ec18 name="target" value="_blank">] children=[#<Nokogiri::XML::Element:0x277e720 name="img" attributes=[#<Nokogiri::XML::Attr:0x277e6d8 name="src" value="http://blog-imgs-52.fc2.com/n/e/k/nekonekomamire/20121105013114dde.jpg">, #<Nokogiri::XML::Attr:0x277e6cc name="alt" value="\u30EA\u30DC\u30EB\u30D0\u30FC">, #<Nokogiri::XML::Attr:0x277e6c0 name="border" value="0">, #<Nokogiri::XML::Attr:0x277e6b4 name="width" value="910">, #<Nokogiri::XML::Attr:0x277e6a8 name="height" value="848">]>]>, #<Nokogiri::XML::Element:0x1bc9cfc name="a" attributes=[#<Nokogiri::XML::Attr:0x1bc9ca8 name="href" value="http://blog.fc2.com/theme-6448-11.html">, #<Nokogiri::XML::Attr:0x1bc9c9c name="title" value="\u81EA\u4F5C\u30A4\u30E9\u30B9\u30C8\uFF08\u4E8C\u6B21\u5275\u4F5C\uFF09">] children=[#<Nokogiri::XML::Text:0x1bc9804 "\u81EA\u4F5C\u30A4\u30E9\u30B9\u30C8\uFF08\u4E8C\u6B21\u5275\u4F5C\uFF09">]>, #<Nokogiri::XML::Element:0x1bc96b4 name="a" attributes=[#<Nokogiri::XML::Attr:0x1bc966c name="href" value="http://blog.fc2.com/community-11.html">, #<Nokogiri::XML::Attr:0x1bc9660 name="title" value="\u30A2\u30CB\u30E1\u30FB\u30B3\u30DF\u30C3\u30AF">] children=[#<Nokogiri::XML::Text:0x1bc91a4 "\u30A2\u30CB\u30E1\u30FB\u30B3\u30DF\u30C3\u30AF">]>, #<Nokogiri::XML::Element:0x1bc9054 name="a" attributes=[#<Nokogiri::XML::Attr:0x1bc9018 name="href" value="http://nekonekomamire.blog86.fc2.com/blog-entry-435.html">] children=[#<Nokogiri::XML::Text:0x1bc8cf4 "2012/11/05(\u6708) 01:33:25">]>, #<Nokogiri::XML::Element:0x1bc8bbc name="a" attributes=[#<Nokogiri::XML::Attr:0x1bc8b80 name="href" value="blog-category-10.html">] children=[#<Nokogiri::XML::Text:0x1bc88b0 "\u30EA\u30EA\u30AB\u30EB\u306A\u306E\u306F">]>, #<Nokogiri::XML::Element:0x1bc8760 name="a" attributes=[#<Nokogiri::XML::Attr:0x1bc8724 name="href" value="http://nekonekomamire.blog86.fc2.com/blog-entry-435.html#trackback">] children=[#<Nokogiri::XML::Text:0x1bc8400 "\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF:1">]>, #<Nokogiri::XML::Element:0x1bc82c8 name="a" attributes=[#<Nokogiri::XML::Attr:0x1bc828c name="href" value="http://nekonekomamire.blog86.fc2.com/blog-entry-435.html#comment">] children=[#<Nokogiri::XML::Text:0x1bf7efc "\u30B3\u30E1\u30F3\u30C8:0">]>]
374
+
375
+ ```
376
+
377
+ これがエラーが出た時のnode.css('a')です。↓
378
+
379
+ ```ここに言語を入力
380
+
381
+ []
382
+
383
+ ```
384
+
385
+ 変なリンクを踏んでいるのがエラーの原因だと私は予想します。
386
+
387
+ これとは別にこのプログラムは同じ画像を何回も保存しているので
388
+
389
+ 全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。

4

補足

2017/01/02 21:32

投稿

退会済みユーザー
test CHANGED
@@ -220,6 +220,8 @@
220
220
 
221
221
  私はChromeを使っているのでその他のブラウザについてはどうなるかわかりません。
222
222
 
223
+ Cacheフォルダの画像以外のファイルを削除するようにしているので注意。
224
+
223
225
 
224
226
 
225
227
  キャッシュの場所についての参考

3

補足

2017/01/02 16:36

投稿

退会済みユーザー
test CHANGED
@@ -172,4 +172,56 @@
172
172
 
173
173
  2017/1/02自己満足のために追記
174
174
 
175
-
175
+ 2017/1/03自己満足のために追記
176
+
177
+
178
+
179
+ ```Ruby
180
+
181
+ Dir.chdir("Cache")
182
+
183
+ list = Dir.glob("*")
184
+
185
+
186
+
187
+ list.each do |name|
188
+
189
+ header = nil
190
+
191
+ File.open(name, "rb") do |f|
192
+
193
+ header = f.read(8)
194
+
195
+ end
196
+
197
+ if header =~ /GIF|JF|Ex|PNG/ then
198
+
199
+ File.rename(name, name + ".gif") if header.include?("GIF")
200
+
201
+ File.rename(name, name + ".jpg") if header.include?("JF")
202
+
203
+ File.rename(name, name + ".jpg") if header.include?("Ex")
204
+
205
+ File.rename(name, name + ".png") if header.include?("PNG")
206
+
207
+ else
208
+
209
+ File.delete(name)
210
+
211
+ end
212
+
213
+ end
214
+
215
+ ```
216
+
217
+ 自分のブラウザのキャッシュから画像を手に入れればサイトに接続する必要がないということで
218
+
219
+ こんなプログラムを考えてみました。
220
+
221
+ 私はChromeを使っているのでその他のブラウザについてはどうなるかわかりません。
222
+
223
+
224
+
225
+ キャッシュの場所についての参考
226
+
227
+ [キャッシュの場所を確認する](http://www.tipsfound.com/chrome/01001)

2

補足

2017/01/02 16:16

投稿

退会済みユーザー
test CHANGED
@@ -62,6 +62,98 @@
62
62
 
63
63
  ```
64
64
 
65
+ ```Ruby
66
+
67
+ require"open-uri"
68
+
69
+ #1:open-uriをrequire(インターネットに接続)
70
+
71
+ require"certified"
72
+
73
+ #2:certifiedをrequire(SSL証明書エラーを避けるためのgem。)
74
+
75
+
76
+
77
+ url = "http://nekonekomamire.blog86.fc2.com/" #3:接続するサイトのURL
78
+
79
+
80
+
81
+ Dir.mkdir("画像フォルダ") unless Dir.exist?("画像フォルダ") #4:とってきた画像を保存するためのフォルダを作成
82
+
83
+ Dir.chdir("画像フォルダ") #5:#4で作った画像保存用フォルダに移動
84
+
85
+
86
+
87
+ loop{#6:ループ
88
+
89
+ page_source = open(url, &:read) #7:対象になるページを開いてpage_sourceに入れる。&:readがないとページが読み込まれません。
90
+
91
+
92
+
93
+ img_url = page_source.scan(%r|img src="(.+?)"|).flatten!
94
+
95
+ =begin
96
+
97
+ #8:page_sourceから画像のurlを正規表現でとる。
98
+
99
+ 結果は[[image0.jpg],[image0.jpg]]みたいな配列になる。このままでは
100
+
101
+ #10でFile.basenameをしたときに「配列ですよ」とエラーがでるので
102
+
103
+ flatten!をして配列を[image0.jpg, image1.jpg]という形に変更。
104
+
105
+ =end
106
+
107
+
108
+
109
+ img_url.reject!{|e| e =~ /logo|counter|banner|close/}
110
+
111
+ =begin
112
+
113
+ #9:#8でとった画像のurlには要らない画像(バナーなど)のurlが含まれている。
114
+
115
+ いらない画像のurlを見てみると「logo,counter,banner,close」のいずれかが
116
+
117
+ 含まれているので該当するimg_urlの要素を削除する。
118
+
119
+ =end
120
+
121
+
122
+
123
+ img_url.each do |img| #10:img_urlの要素を順番に保存
124
+
125
+ name = File.basename(img)
126
+
127
+ open(name, 'wb') do |output|
128
+
129
+ open(img) do |input|
130
+
131
+ output.write(input.read)
132
+
133
+ end
134
+
135
+ end
136
+
137
+ sleep(rand(4..6))
138
+
139
+ end
140
+
141
+
142
+
143
+ next_url = page_source.scan(%r| <a href="(.+?)">次のページ</a>|).flatten! #11:次のページのURLを正規表現でとる。
144
+
145
+ if next_url[0] == nil then #12:next_urlの最初の要素がnilになったらloopを終了させる。
146
+
147
+ break
148
+
149
+ end
150
+
151
+ url = next_url[0] #13:urlにnext_urlを入れる。
152
+
153
+ }
154
+
155
+ ```
156
+
65
157
  私も画像を収集するプログラムを作ってみました。
66
158
 
67
159
  回答を書いている時点で画像を200程保存できています。
@@ -75,3 +167,9 @@
75
167
  参考
76
168
 
77
169
  [robots.txt解析ツール](https://www.searchengineoptimization.jp/robots-txt-analyzer)
170
+
171
+
172
+
173
+ 2017/1/02自己満足のために追記
174
+
175
+

1

修正

2017/01/01 16:41

投稿

退会済みユーザー
test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  next_url = page_source.scan(%r| <a href="(.+?)">次のページ</a>|).flatten!
50
50
 
51
- if next_url == nil then
51
+ if next_url[0] == nil then
52
52
 
53
53
  break
54
54