回答編集履歴
6
修正
answer
CHANGED
@@ -190,6 +190,5 @@
|
|
190
190
|
```ここに言語を入力
|
191
191
|
[]
|
192
192
|
```
|
193
|
-
変なリンクを踏んでいるのがエラーの原因だと私は予想します。
|
194
193
|
これとは別にこのプログラムは同じ画像を何回も保存しているので
|
195
194
|
全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。
|
5
補足
answer
CHANGED
@@ -112,4 +112,84 @@
|
|
112
112
|
Cacheフォルダの画像以外のファイルを削除するようにしているので注意。
|
113
113
|
|
114
114
|
キャッシュの場所についての参考
|
115
|
-
[キャッシュの場所を確認する](http://www.tipsfound.com/chrome/01001)
|
115
|
+
[キャッシュの場所を確認する](http://www.tipsfound.com/chrome/01001)
|
116
|
+
|
117
|
+
```Ruby
|
118
|
+
require 'open-uri'
|
119
|
+
require 'nokogiri'
|
120
|
+
require 'anemone'
|
121
|
+
|
122
|
+
|
123
|
+
Dir.mkdir("画像フォルダ") unless Dir.exist?("画像フォルダ")
|
124
|
+
Dir.chdir("画像フォルダ")
|
125
|
+
|
126
|
+
opts = {
|
127
|
+
depth_limit: 1,
|
128
|
+
# 0 => 指定したURL先のみ
|
129
|
+
# 1 => 指定したURLにあるlinkから1回のジャンプで辿れる先も見る。
|
130
|
+
delay: 1,#ページ訪問間隔を1秒空ける
|
131
|
+
}
|
132
|
+
|
133
|
+
# 取得したいサイトURL
|
134
|
+
url = 'http://nekonekomamire.blog86.fc2.com/'
|
135
|
+
|
136
|
+
html = open(url) do |f|
|
137
|
+
f.read
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
# htmlを解析して目的のURLを取得
|
142
|
+
Anemone.crawl(url, opts) do |anemone|
|
143
|
+
|
144
|
+
# 起点となるページから飛ぶ先を予め指定
|
145
|
+
anemone.focus_crawl do |page|
|
146
|
+
page.links.keep_if { |link|
|
147
|
+
link.to_s.match(/http:\/\/nekonekomamire.blog86.fc2.com\//)
|
148
|
+
# 正規表現でhttp://nekonekomamire.blog86.fc2.com/に当てはまるurlを指定してます。
|
149
|
+
}
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
anemone.on_every_page do |page|
|
154
|
+
doc = Nokogiri::HTML.parse(html)
|
155
|
+
|
156
|
+
page.doc.css('div[class="body"]').each do |node|
|
157
|
+
begin
|
158
|
+
gazouURL = node.css('a').attribute('href').to_s
|
159
|
+
puts "#{gazouURL} を取得。"
|
160
|
+
name = File.basename(gazouURL)
|
161
|
+
|
162
|
+
#正規表現で画像ファイル以外は弾くようにしてます。
|
163
|
+
if /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/ =~ name then
|
164
|
+
# ここで、URLの画像をダウンロードします。
|
165
|
+
open(name, 'wb') do |output|
|
166
|
+
open(gazouURL) do |input|
|
167
|
+
output.write(input.read)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
puts "#{name} をダウンロードしました。"
|
171
|
+
else
|
172
|
+
puts "#{name} は画像ファイルではないのでスルーします。"
|
173
|
+
end
|
174
|
+
rescue
|
175
|
+
puts("エラー")
|
176
|
+
end
|
177
|
+
puts "4秒休憩\n\n"
|
178
|
+
sleep(4)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
```
|
184
|
+
resucueを入れてエラーが出ても一応は止まらないようにしました。
|
185
|
+
これがエラーが出る前のnode.css('a')です。↓
|
186
|
+
```ここに言語を入力
|
187
|
+
[#<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">]>]
|
188
|
+
```
|
189
|
+
これがエラーが出た時のnode.css('a')です。↓
|
190
|
+
```ここに言語を入力
|
191
|
+
[]
|
192
|
+
```
|
193
|
+
変なリンクを踏んでいるのがエラーの原因だと私は予想します。
|
194
|
+
これとは別にこのプログラムは同じ画像を何回も保存しているので
|
195
|
+
全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。
|
4
補足
answer
CHANGED
@@ -109,6 +109,7 @@
|
|
109
109
|
自分のブラウザのキャッシュから画像を手に入れればサイトに接続する必要がないということで
|
110
110
|
こんなプログラムを考えてみました。
|
111
111
|
私はChromeを使っているのでその他のブラウザについてはどうなるかわかりません。
|
112
|
+
Cacheフォルダの画像以外のファイルを削除するようにしているので注意。
|
112
113
|
|
113
114
|
キャッシュの場所についての参考
|
114
115
|
[キャッシュの場所を確認する](http://www.tipsfound.com/chrome/01001)
|
3
補足
answer
CHANGED
@@ -85,3 +85,30 @@
|
|
85
85
|
[robots.txt解析ツール](https://www.searchengineoptimization.jp/robots-txt-analyzer)
|
86
86
|
|
87
87
|
2017/1/02自己満足のために追記
|
88
|
+
2017/1/03自己満足のために追記
|
89
|
+
|
90
|
+
```Ruby
|
91
|
+
Dir.chdir("Cache")
|
92
|
+
list = Dir.glob("*")
|
93
|
+
|
94
|
+
list.each do |name|
|
95
|
+
header = nil
|
96
|
+
File.open(name, "rb") do |f|
|
97
|
+
header = f.read(8)
|
98
|
+
end
|
99
|
+
if header =~ /GIF|JF|Ex|PNG/ then
|
100
|
+
File.rename(name, name + ".gif") if header.include?("GIF")
|
101
|
+
File.rename(name, name + ".jpg") if header.include?("JF")
|
102
|
+
File.rename(name, name + ".jpg") if header.include?("Ex")
|
103
|
+
File.rename(name, name + ".png") if header.include?("PNG")
|
104
|
+
else
|
105
|
+
File.delete(name)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
```
|
109
|
+
自分のブラウザのキャッシュから画像を手に入れればサイトに接続する必要がないということで
|
110
|
+
こんなプログラムを考えてみました。
|
111
|
+
私はChromeを使っているのでその他のブラウザについてはどうなるかわかりません。
|
112
|
+
|
113
|
+
キャッシュの場所についての参考
|
114
|
+
[キャッシュの場所を確認する](http://www.tipsfound.com/chrome/01001)
|
2
補足
answer
CHANGED
@@ -30,10 +30,58 @@
|
|
30
30
|
}
|
31
31
|
|
32
32
|
```
|
33
|
+
```Ruby
|
34
|
+
require"open-uri"
|
35
|
+
#1:open-uriをrequire(インターネットに接続)
|
36
|
+
require"certified"
|
37
|
+
#2:certifiedをrequire(SSL証明書エラーを避けるためのgem。)
|
38
|
+
|
39
|
+
url = "http://nekonekomamire.blog86.fc2.com/" #3:接続するサイトのURL
|
40
|
+
|
41
|
+
Dir.mkdir("画像フォルダ") unless Dir.exist?("画像フォルダ") #4:とってきた画像を保存するためのフォルダを作成
|
42
|
+
Dir.chdir("画像フォルダ") #5:#4で作った画像保存用フォルダに移動
|
43
|
+
|
44
|
+
loop{#6:ループ
|
45
|
+
page_source = open(url, &:read) #7:対象になるページを開いてpage_sourceに入れる。&:readがないとページが読み込まれません。
|
46
|
+
|
47
|
+
img_url = page_source.scan(%r|img src="(.+?)"|).flatten!
|
48
|
+
=begin
|
49
|
+
#8:page_sourceから画像のurlを正規表現でとる。
|
50
|
+
結果は[[image0.jpg],[image0.jpg]]みたいな配列になる。このままでは
|
51
|
+
#10でFile.basenameをしたときに「配列ですよ」とエラーがでるので
|
52
|
+
flatten!をして配列を[image0.jpg, image1.jpg]という形に変更。
|
53
|
+
=end
|
54
|
+
|
55
|
+
img_url.reject!{|e| e =~ /logo|counter|banner|close/}
|
56
|
+
=begin
|
57
|
+
#9:#8でとった画像のurlには要らない画像(バナーなど)のurlが含まれている。
|
58
|
+
いらない画像のurlを見てみると「logo,counter,banner,close」のいずれかが
|
59
|
+
含まれているので該当するimg_urlの要素を削除する。
|
60
|
+
=end
|
61
|
+
|
62
|
+
img_url.each do |img| #10:img_urlの要素を順番に保存
|
63
|
+
name = File.basename(img)
|
64
|
+
open(name, 'wb') do |output|
|
65
|
+
open(img) do |input|
|
66
|
+
output.write(input.read)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
sleep(rand(4..6))
|
70
|
+
end
|
71
|
+
|
72
|
+
next_url = page_source.scan(%r| <a href="(.+?)">次のページ</a>|).flatten! #11:次のページのURLを正規表現でとる。
|
73
|
+
if next_url[0] == nil then #12:next_urlの最初の要素がnilになったらloopを終了させる。
|
74
|
+
break
|
75
|
+
end
|
76
|
+
url = next_url[0] #13:urlにnext_urlを入れる。
|
77
|
+
}
|
78
|
+
```
|
33
79
|
私も画像を収集するプログラムを作ってみました。
|
34
80
|
回答を書いている時点で画像を200程保存できています。
|
35
81
|
私はanemoneに詳しくないのでそこについては分かりませんが
|
36
82
|
サイトの方には原因がないような気がします。
|
37
83
|
|
38
84
|
参考
|
39
|
-
[robots.txt解析ツール](https://www.searchengineoptimization.jp/robots-txt-analyzer)
|
85
|
+
[robots.txt解析ツール](https://www.searchengineoptimization.jp/robots-txt-analyzer)
|
86
|
+
|
87
|
+
2017/1/02自己満足のために追記
|
1
修正
answer
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
end
|
24
24
|
|
25
25
|
next_url = page_source.scan(%r| <a href="(.+?)">次のページ</a>|).flatten!
|
26
|
-
if next_url == nil then
|
26
|
+
if next_url[0] == nil then
|
27
27
|
break
|
28
28
|
end
|
29
29
|
url = next_url[0]
|