回答編集履歴
6
修正
test
CHANGED
@@ -382,8 +382,6 @@
|
|
382
382
|
|
383
383
|
```
|
384
384
|
|
385
|
-
変なリンクを踏んでいるのがエラーの原因だと私は予想します。
|
386
|
-
|
387
385
|
これとは別にこのプログラムは同じ画像を何回も保存しているので
|
388
386
|
|
389
387
|
全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。
|
5
補足
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
補足
test
CHANGED
@@ -220,6 +220,8 @@
|
|
220
220
|
|
221
221
|
私はChromeを使っているのでその他のブラウザについてはどうなるかわかりません。
|
222
222
|
|
223
|
+
Cacheフォルダの画像以外のファイルを削除するようにしているので注意。
|
224
|
+
|
223
225
|
|
224
226
|
|
225
227
|
キャッシュの場所についての参考
|
3
補足
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
補足
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
修正
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
|
|