Rubyでのクローラー作成
はじめに
まだ、Rubyでの開発経験、業務経験がものすごく浅い新米プログラマーです。自分が業務で学んだことのアウトプットの場としてここに記事を残したいと思います。アドバイスや誤認訂正などがありましたら是非お願いします。
クローラーとは
以下の参考サイトによると
WEB上のファイルを収集するためのプログラムのようです。
参考文献
https://www.seohacks.net/basic/terms/crawler/
クローラーの中で起こっていること
クローラープログラムがどんなステップを踏んでいるのか大枠をまとめます
- そのサイトに取得しているurlを基にしてアクセス
- Nokogiriでのhtml解析が行われる
- 自分が収集したい情報をhtmlのエレメントパスなどで指定をし取得
- 取得情報をcsvなどのファイル形式で出力する
実際のコード
上司に概要を教えていただき、細かいところを自分で詰めて書きました。
必要なgemファイル
いかに示すgemが必要になります。プログラムの冒頭に書いてください。
require 'open-uri'
require 'nokogiri'
require 'csv'
クローラーの中身
設定
サイトでの一覧ページから各々の詳細ページに飛び、その中にあるexample_nameを取得するという形式でクロールしてます。
コードに移ります。require文以下に書き足してください。
何をしているかをコメントでできるだけ残しました。
class Crawler
def run
#csvファイルを書き出すのに必要
File.open('example.csv','w') do |csv|
(1..100).each do |id|
url = example_url(id) # privateメソッドに飛びurlを取得
uri = URI.parse(url)
html = uri.read # サーバにアクセス
doc = Nokogiri::HTML.parse(html) #そのページの要素を分解
sleep(0.5) #インターバルを置いておかないと相手サーバーに負荷をかけるので必ず必要!!!
# .searchは複数要素を検索 .atは単数要素検索 カッコ内には取得したい情報のエレメントパスを入力
example_name = doc.search('.box > h3').first.text
# csvファイルに出力
csv << [
"#{id}",
"#{example_name}",
"#{url}\n"
].join(',') #csv形式はカンマで分かれている形式(Comma-separated-value)のため要素を,でつなぐ
end
end
end
end
private
def example_url(id)
"https://example.com/index/id=#{id}"
end
end
実際にプログラムを走らせる
crawler = Crawler.new
crawler.run
bundle exec ruby プログラム名
で実際にプログラムを走らせます。gemを使っているので実行前にそのgemを読み込むというステップが必要です。そのステップは、
bundle exec
が担ってくれます。私はここを知らずにずっと悩んでました。
また、プログラムが実行されるとcsvファイルが新しく作成されます。
私は、同名のファイルをカレントディレクトリにマニュアルで作成して、プログラムを走らせれば作成したファイルに書き出されると思いました。しかし、今回の書き方では新規ファイルが別に作成されます。なので、csv形式のファイルを用意しなくても大丈夫でした。
終わりに
今回作成したこのプログラムは、インターン先で初めて任せていただいた仕事でした。色々と処理の仕方で上司から学ぶことや、自分の知識不足が認識できたので、勉強していきたいと思います。誰かの参考になれば幸いです。