LoginSignup
1
0

More than 5 years have passed since last update.

Rubyでのクローラー作成

Last updated at Posted at 2019-05-20

Rubyでのクローラー作成

はじめに

まだ、Rubyでの開発経験、業務経験がものすごく浅い新米プログラマーです。自分が業務で学んだことのアウトプットの場としてここに記事を残したいと思います。アドバイスや誤認訂正などがありましたら是非お願いします。

クローラーとは

以下の参考サイトによると
WEB上のファイルを収集するためのプログラムのようです。

参考文献
https://www.seohacks.net/basic/terms/crawler/

クローラーの中で起こっていること

クローラープログラムがどんなステップを踏んでいるのか大枠をまとめます

  1. そのサイトに取得しているurlを基にしてアクセス
  2. Nokogiriでのhtml解析が行われる
  3. 自分が収集したい情報をhtmlのエレメントパスなどで指定をし取得
  4. 取得情報をcsvなどのファイル形式で出力する

実際のコード

上司に概要を教えていただき、細かいところを自分で詰めて書きました。

必要なgemファイル

いかに示すgemが必要になります。プログラムの冒頭に書いてください。

crawler.rb
require 'open-uri'
require 'nokogiri'
require 'csv'

クローラーの中身

設定

サイトでの一覧ページから各々の詳細ページに飛び、その中にあるexample_nameを取得するという形式でクロールしてます。

コードに移ります。require文以下に書き足してください。
何をしているかをコメントでできるだけ残しました。

crawler.rb
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.rb

crawler = Crawler.new
crawler.run

bundle exec ruby プログラム名

で実際にプログラムを走らせます。gemを使っているので実行前にそのgemを読み込むというステップが必要です。そのステップは、
bundle exec
が担ってくれます。私はここを知らずにずっと悩んでました。

また、プログラムが実行されるとcsvファイルが新しく作成されます。
私は、同名のファイルをカレントディレクトリにマニュアルで作成して、プログラムを走らせれば作成したファイルに書き出されると思いました。しかし、今回の書き方では新規ファイルが別に作成されます。なので、csv形式のファイルを用意しなくても大丈夫でした。

終わりに

今回作成したこのプログラムは、インターン先で初めて任せていただいた仕事でした。色々と処理の仕方で上司から学ぶことや、自分の知識不足が認識できたので、勉強していきたいと思います。誰かの参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0