Windowsで画像クローラを走らせよう
1か月前くらいに画像検索サイトの画像を定期的に収集するスクリプトを作りました
言語はRubyです 手に馴染んでいたので
今作るならpythonで書くと思う pyはライブラリの質と量がすごいですね
nizigazou.rb
require 'open-uri'
require 'nokogiri'
require 'date'
index = 0
download_key = 'G:\nizigazou\x'
index_url = 'https://ascii2d.net/recently'
charset = nil
index_html = open(index_url) do |f|
charset = f.charset
f.read
end
index_doc = Nokogiri::HTML.parse(index_html, nil, charset)
img_urls = []
index_doc.xpath('//span[@class="recently_header"]').each do |node|
node.css('a').each do |links|
url = links.attribute('href').to_s
if url.include?(".jpg") || url.include?(".jpeg") || url.include?(".png") || url.include?(".gif")
img_urls.push([links.attribute('href').to_s, links.children.text])
p links.children.text
end
end
end
days = Date.today.to_s
if days[-2..-1].to_i < 10
folder_name = days.chop.chop + "1"
elsif days[-2..-1].to_i < 20
folder_name = days.chop.chop + "2"
else
folder_name = days.chop.chop + "3"
end
img_urls.each do |img_url|
flag = false
begin
open(img_url[0])
rescue => e
puts e
flag = true
end
next if flag
if img_url[0].include?(".gif")
File.open(download_key + folder_name +'\\' + img_url[1] ,'w+b') do |out|
open(img_url[0]) do |data|
out.write(data.read)
end
index = index + 1
end
next
end
name = img_url[1]
if name[-1] == ")"
name.slice!(0...name.length-1)
end
File.open(download_key + folder_name +'\\' + name,'w+b') do |out|
open(img_url[0]) do |data|
out.write(data.read)
end
index = index + 1
end
end
画像をしまうフォルダは予め作っておく必要があります とりあえず今は以下のような感じで月ごとに3フォルダ作っています。
x2020-10-1
, x2020-10-2
, x2020-10-3
それでこのコードをどうやって自動実行させるかということなのですが、今回はタスクスケジューラを使いました。
linuxとかだったらcronでらくちんなのですが、メイン機がWinだったのでちょっと苦労しました。
直接このrbファイルを指定して定期実行させてあげてもいいのですが、そうするとスクリプトが走るたびに真っ黒のターミナルが画面に表示されてログを吐いていきます。邪魔すぎる・・・・・・。
色々試行錯誤していたのですが、以下のようにbatファイルで包んであげるとバックグラウンドで処理してくれるようになりました。
nizi.bat
cd C:\code\scripts
ruby nizigazou.rb
これを5分に1回走らせるように設定したのが、1か月前。
良い感じに画像を収集できています。
とりあえず今は鑑賞したり資料にしたりというのが用途なんですが、ゆくゆくは機械学習的なやつも触ってみたいな~と思っている。思ってはいる・・・・・・。