ベルリンのITスタートアップで働くジャバ・ザ・ハットリの日記

日本→シンガポール→ベルリンへと流れ着いたソフトウェアエンジニアのブログ

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をブックバックバーまでひっぱって貼り付ける。

f:id:tango_ruby:20150309184740p:plain


クローラーターゲットのウェブサイトにアクセスする。例えばヤフーニュース
先ほど貼り付けたSelectorGadgetのブックマークバーを押すと画面下部に部品が表示される。

f:id:tango_ruby:20150309184813p:plain

取りたい要素をクリックして黄色にする。要らない要素をクリックして赤で除く。
もうこれは文章で解説するより、触ってもらった方が理解が早いです。要るのをクリックして黄色、要らんのをクリックして赤!

で下部に表示されたCSS要素をソースコードに貼り付け。
例で言えば
li:nth-child(1) div
が1つ目のヘッドライン。
2つ目は
li:nth-child(2) div
となります。

後は実行あるのみ。なんか説明が雑かな?もし分からない記述とかあればコメントください。

とは言ってもこのようなググって出てくる情報を元にコーディングしてると、その場しのぎの泥縄解決式コードになりがち。体系的にRubyによるクローラー技術を習得するのであればこの本が最適。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

tango-ruby.hatenablog.com

tango-ruby.hatenablog.com