teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2017/01/02 21:43

投稿

退会済みユーザー
answer CHANGED
@@ -190,6 +190,5 @@
190
190
  ```ここに言語を入力
191
191
  []
192
192
  ```
193
- 変なリンクを踏んでいるのがエラーの原因だと私は予想します。
194
193
  これとは別にこのプログラムは同じ画像を何回も保存しているので
195
194
  全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。

5

補足

2017/01/02 21:42

投稿

退会済みユーザー
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

補足

2017/01/02 21:32

投稿

退会済みユーザー
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

補足

2017/01/02 16:36

投稿

退会済みユーザー
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

補足

2017/01/02 16:16

投稿

退会済みユーザー
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

修正

2017/01/01 16:41

投稿

退会済みユーザー
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]