Rubyでクローラーを作る その1
移転しました。
Rubyでクローラーを作りましたので、その方法の解説。
まずウェブサイトを巡回してデータ集めるプログラムのことをクローラーと言ったり、スクレイパーと言ったりしますがその定義は以下。
- クローラー:ウェブサイトを巡回的にまわってデータを集める。ページ内にあるリンクをたどって、階層構造のウェブサイト郡にあるデータを集めてまわる。
- スクレイパー:ウェブページのHTMLデータを解析、収集するプログラム。基本的には1つのウェブページを対象にする。
ということで、今回作ったのはクローラー。
クローラー関連のプログラムはGithubなんかにはほとんどソースコードがアップ されていない。理由は他人のウェブサイトを巡回してデータ取ってくるプログラムに何か変な細工してて、公開できないんじゃないですかね?
Nokogiri
Nokogiriを入れればひと通りのスクレイピングは可能になる。ただし主にウェブサイトの静的な表現に限る。まずはNokogiriでターゲットのウェブサイトのスクレイピングを実施して、できない箇所をその2以降で解説する方法を採るってのが王道。
ヤフーニュースサイト(http://news.yahoo.co.jp/)のトップニュースのヘッドラインを取ってきて表示するサンプル。
require 'rubygems' require 'nokogiri' require 'open-uri' url = "http://news.yahoo.co.jp/" doc = Nokogiri::HTML(open(url)) for i in 1..8 do top_news_css = "li:nth-child(" + i.to_s + ") div" puts doc.at_css(top_news_css).text end
これを保存したファイルをnokogiri_text.rbとする。
$ ruby nokogiri_text.rb
を実行すると
5人刺殺 ネットで住民を中傷?写真new 和解には過去直視を 独首相写真 財政的に「戦争できぬ」日本写真 あまりに不快 起床装置が人気写真 ゲーム改造 PARが生産終了写真new ガッツポーズ禁止 英明野球部写真new ロンギヌスに38日で3538万円写真 斎藤工「anan」で濃厚キス写真
のような結果がターミナルに出ます。しかしロクなニュースないな。
解説
まずはNokogiriを入れる
$ sudo gem install nokogiri
urlの中にクロールしたいウェブサイトのアドレスを入れる。
url = "http://news.yahoo.co.jp/"
ポイントはここ。
puts doc.at_css(top_news_css).text
取りたい情報のCSSをカッコ内に入れてテキスト化した内容をputsしている。
top_news_cssトップ8件のニュースのヘッドラインに相当するCSS要素が入ります。
CSS要素の調べ方
ここにSafariを使ってアクセス。
SelectorGadget: point and click CSS selectors
真ん中あたりにある青文字のSelectorGadgetをブックバックバーまでひっぱって貼り付ける。
クローラーターゲットのウェブサイトにアクセスする。例えばヤフーニュース
先ほど貼り付けたSelectorGadgetのブックマークバーを押すと画面下部に部品が表示される。
取りたい要素をクリックして黄色にする。要らない要素をクリックして赤で除く。
もうこれは文章で解説するより、触ってもらった方が理解が早いです。要るのをクリックして黄色、要らんのをクリックして赤!
で下部に表示されたCSS要素をソースコードに貼り付け。
例で言えば
li:nth-child(1) div
が1つ目のヘッドライン。
2つ目は
li:nth-child(2) div
となります。
後は実行あるのみ。なんか説明が雑かな?もし分からない記述とかあればコメントください。
とは言ってもこのようなググって出てくる情報を元にコーディングしてると、その場しのぎの泥縄解決式コードになりがち。体系的にRubyによるクローラー技術を習得するのであればこの本が最適。
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
- 作者: るびきち,佐々木拓郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/08/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る