2006 09 22
■ruby のスクレイピングツールキット scrAPI
http://blog.labnotes.org/category/scrapi/
ruby でスクレイピングして web の情報を取得するのには、今まで正規表現か xpath でやってたので、わりと面倒でした。で、ふと scrAPI というスクレイピングツールキットを知ったのですが、これがかなり便利そう。
このツールキットを使うと、CSS3 なセレクタを記述することで、要素を取得することができます。たとえばとあるサイトのリンクを全部取得したければ、
require 'rubygems'
require 'scrapi'
require 'open-uri'
require 'nkf'
require 'pp'
$KCODE = 'u'
links = Scraper.define do
process "a[href]", "urls[]"=>"@href"
result :urls
end.scrape(URI.parse('http://www.hatena.ne.jp/')).sort.uniq
pp links
な感じですっきり記述することができます。
たとえばはてなダイアリーキーワードページから、タイトル、ふりがな、URL、カテゴリを取得したければこんな感じなコードで。
keyword_scrapper = Scraper.define do
process 'span.title > a:first-child', :title => :text, :url => '@href'
process 'span.furigana', :furigana => :text
process 'ul.list-circle > li:first-child > a', :category => :text
result :title, :furigana, :url, :category
end
html = NKF::nkf('-w -m0', open('http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE').read)
pp keyword_scrapper.scrape(html, :parser => :html_parser)
結果は構造体として取得できるのでアクセスも楽々です。
#<struct title="紺野あさ美", furigana="こんのあさみ", url="/keyword/%ba%b0%cc%ee%a4%a2%a4%b5%c8%fe?kid=800", category="アイドル">
一つはまったのが、デフォルトの html の構文解析では Tidy のライブラリを使うのですが、このライブラリがマルチバイト文字列をエンティティにしちゃうので困るという罠が…。そのため、scrape のオプションで pure ruby の HTMLParser を指定することで回避できます。
追記
HTMLParser を指定せずとも、tidy のオプションで
scrape(html, :parser_options => {:char_encoding=>'utf8'})
と渡せばよしなにはからってくれます。コメントで教えてもらいました。
また様々な方法で Scraper を定義できるのでいろいろできそう。海外じゃやたら流行ってる ruby のメタプログラミングを多用していてクラス定義などなどが行えます。
今まではスクレイピングには断然 perl のほうが便利だったのですが、この scrAPI を使いこなすだけで、だいぶ ruby でも便利になる気が!
トラックバック - http://d.hatena.ne.jp/secondlife/20060922/1158923779
- http://d.hatena.ne.jp/babie/20060922
- 今週の話題(簡単ボタン画像作成ツール、インクジェットプリンタで...
- Bulknews::Subtech - CSS selector to XPath
- http://d.hatena.ne.jp/perezvon/20060925
- [Python]libxml2でスクレイピング
- http://d.hatena.ne.jp/dambiyori/20060927
- http://d.hatena.ne.jp/naoya/20061003
- http://d.hatena.ne.jp/buzztaiki/20061006
- http://d.hatena.ne.jp/Gimite/20061011
- http://d.hatena.ne.jp/ma2/20061026
- http://d.hatena.ne.jp/kanbayashi/20061101
- 只今Ruby勉強中 - rubygems
- http://d.hatena.ne.jp/kanbayashi/20061209
- Clips
- yamazのRails日記 - FreeBSDでもscrAPI使いたいよ!
- 紺野あさ美
- http://d.hatena.ne.jp/nazoking/20070202
- bookmark
- 日記/2007-03-29
- http://d.hatena.ne.jp/naoya/20070509
- Web::Scraperでasahi.comの記事一覧から記事を取得
- http://d.hatena.ne.jp/caffeine/20070728
- diary/2007-03-29
- littlebuddhaの日記 - scrAPI
- uby のスクレイピングツールキット scrAPI
- memo_ruby - scrapiを使ってみた
- たばさの - [ruby]新着日記でプログラマ探し
- 刺身☆ブーメランのはてなダイアリー - gem ソムリエになる方法
Ruby を始めようと思う人から玄人まで身近に置いておきたい一冊
Rails 入門書の決定版!あのくまくまーの独特な解説ですんなり読める!

