Ruby
1 require "open-uri"
2 require "certified"
3
4 url = "http://nekonekomamire.blog86.fc2.com/"
5
6 Dir . mkdir ( "画像フォルダ" ) unless Dir . exist ? ( "画像フォルダ" )
7 Dir . chdir ( "画像フォルダ" )
8
9 loop {
10 page_source = open ( url , & :read )
11 img_url = page_source . scan ( %r|img src="(.+?)"| ) . flatten !
12 img_url . reject ! { | e | e = ~ /logo|counter|banner|close/ }
13
14 img_url . each do | img |
15 name = File . basename ( img )
16 open ( name , 'wb' ) do | output |
17 open ( img ) do | input |
18 output . write ( input . read )
19 end
20 end
21 sleep ( rand ( 4. .6 ) )
22 end
23
24 next_url = page_source . scan ( %r| <a href="(.+?)">次のページ</a>| ) . flatten !
25 if next_url [ 0 ] == nil then
26 break
27 end
28 url = next_url [ 0 ]
29 }
30
Ruby
1 require "open-uri"
2 #1:open-uriをrequire(インターネットに接続)
3 require "certified"
4 #2:certifiedをrequire(SSL証明書エラーを避けるためのgem。)
5
6 url = "http://nekonekomamire.blog86.fc2.com/" #3:接続するサイトのURL
7
8 Dir . mkdir ( "画像フォルダ" ) unless Dir . exist ? ( "画像フォルダ" ) #4:とってきた画像を保存するためのフォルダを作成
9 Dir . chdir ( "画像フォルダ" ) #5:#4で作った画像保存用フォルダに移動
10
11 loop { #6:ループ
12 page_source = open ( url , & :read ) #7:対象になるページを開いてpage_sourceに入れる。&:readがないとページが読み込まれません。
13
14 img_url = page_source . scan ( %r|img src="(.+?)"| ) . flatten !
15 =begin
16 #8:page_sourceから画像のurlを正規表現でとる。
17 結果は[[image0.jpg],[image0.jpg]]みたいな配列になる。このままでは
18 #10でFile.basenameをしたときに「配列ですよ」とエラーがでるので
19 flatten!をして配列を[image0.jpg, image1.jpg]という形に変更。
20 =end
21
22 img_url . reject ! { | e | e = ~ /logo|counter|banner|close/ }
23 =begin
24 #9:#8でとった画像のurlには要らない画像(バナーなど)のurlが含まれている。
25 いらない画像のurlを見てみると「logo,counter,banner,close」のいずれかが
26 含まれているので該当するimg_urlの要素を削除する。
27 =end
28
29 img_url . each do | img | #10:img_urlの要素を順番に保存
30 name = File . basename ( img )
31 open ( name , 'wb' ) do | output |
32 open ( img ) do | input |
33 output . write ( input . read )
34 end
35 end
36 sleep ( rand ( 4. .6 ) )
37 end
38
39 next_url = page_source . scan ( %r| <a href="(.+?)">次のページ</a>| ) . flatten ! #11:次のページのURLを正規表現でとる。
40 if next_url [ 0 ] == nil then #12:next_urlの最初の要素がnilになったらloopを終了させる。
41 break
42 end
43 url = next_url [ 0 ] #13:urlにnext_urlを入れる。
44 }
私も画像を収集するプログラムを作ってみました。
回答を書いている時点で画像を200程保存できています。
私はanemoneに詳しくないのでそこについては分かりませんが
サイトの方には原因がないような気がします。
参考
robots.txt解析ツール
2017/1/02自己満足のために追記
2017/1/03自己満足のために追記
Ruby
1 Dir . chdir ( "Cache" )
2 list = Dir . glob ( "*" )
3
4 list . each do | name |
5 header = nil
6 File . open ( name , "rb" ) do | f |
7 header = f . read ( 8 )
8 end
9 if header = ~ / GIF | JF | Ex | PNG / then
10 File . rename ( name , name + ".gif" ) if header . include ? ( "GIF" )
11 File . rename ( name , name + ".jpg" ) if header . include ? ( "JF" )
12 File . rename ( name , name + ".jpg" ) if header . include ? ( "Ex" )
13 File . rename ( name , name + ".png" ) if header . include ? ( "PNG" )
14 else
15 File . delete ( name )
16 end
17 end
自分のブラウザのキャッシュから画像を手に入れればサイトに接続する必要がないということで
こんなプログラムを考えてみました。
私はChromeを使っているのでその他のブラウザについてはどうなるかわかりません。
Cacheフォルダの画像以外のファイルを削除するようにしているので注意。
キャッシュの場所についての参考
キャッシュの場所を確認する
Ruby
1 require 'open-uri'
2 require 'nokogiri'
3 require 'anemone'
4
5
6 Dir . mkdir ( "画像フォルダ" ) unless Dir . exist ? ( "画像フォルダ" )
7 Dir . chdir ( "画像フォルダ" )
8
9 opts = {
10 depth_limit : 1 ,
11 # 0 => 指定したURL先のみ
12 # 1 => 指定したURLにあるlinkから1回のジャンプで辿れる先も見る。
13 delay : 1 , #ページ訪問間隔を1秒空ける
14 }
15
16 # 取得したいサイトURL
17 url = 'http://nekonekomamire.blog86.fc2.com/'
18
19 html = open ( url ) do | f |
20 f . read
21 end
22
23
24 # htmlを解析して目的のURLを取得
25 Anemone . crawl ( url , opts ) do | anemone |
26
27 # 起点となるページから飛ぶ先を予め指定
28 anemone . focus_crawl do | page |
29 page . links . keep_if { | link |
30 link . to_s . match ( /http:\/\/nekonekomamire.blog86.fc2.com\// )
31 # 正規表現でhttp://nekonekomamire.blog86.fc2.com/に当てはまるurlを指定してます。
32 }
33 end
34
35
36 anemone . on_every_page do | page |
37 doc = Nokogiri : : HTML . parse ( html )
38
39 page . doc . css ( 'div[class="body"]' ) . each do | node |
40 begin
41 gazouURL = node . css ( 'a' ) . attribute ( 'href' ) . to_s
42 puts " #{ gazouURL } を取得。"
43 name = File . basename ( gazouURL )
44
45 #正規表現で画像ファイル以外は弾くようにしてます。
46 if / \ . jpg$ | \ . jpeg$ | \ . png$ | \ . gif$ | \ . bmp$ / = ~ name then
47 # ここで、URLの画像をダウンロードします。
48 open ( name , 'wb' ) do | output |
49 open ( gazouURL ) do | input |
50 output . write ( input . read )
51 end
52 end
53 puts " #{ name } をダウンロードしました。"
54 else
55 puts " #{ name } は画像ファイルではないのでスルーします。"
56 end
57 rescue
58 puts ( "エラー" )
59 end
60 puts "4秒休憩\n\n"
61 sleep ( 4 )
62 end
63 end
64 end
65
resucueを入れてエラーが出ても一応は止まらないようにしました。
これがエラーが出る前のnode.css('a')です。↓
[#<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">]>]
これがエラーが出た時のnode.css('a')です。↓
これとは別にこのプログラムは同じ画像を何回も保存しているので
全ての画像を保存し終わるまでにだいぶ時間がかかると考えられます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/01 14:53
退会済みユーザー
2017/01/01 15:52
2017/01/02 03:01
2017/01/03 12:51
退会済みユーザー
2017/01/03 15:14