Windowsで画像クローラを走らせよう
2020-10-16

1か月前くらいに画像検索サイトの画像を定期的に収集するスクリプトを作りました

言語はRubyです 手に馴染んでいたので

今作るならpythonで書くと思う pyはライブラリの質と量がすごいですね

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ファイルで包んであげるとバックグラウンドで処理してくれるようになりました。

cd C:\code\scripts
ruby nizigazou.rb

これを5分に1回走らせるように設定したのが、1か月前。

良い感じに画像を収集できています。

とりあえず今は鑑賞したり資料にしたりというのが用途なんですが、ゆくゆくは機械学習的なやつも触ってみたいな~と思っている。思ってはいる・・・・・・。