bar_1

contents_map

ラベル HTML の投稿を表示しています。 すべての投稿を表示
ラベル HTML の投稿を表示しています。 すべての投稿を表示

2010年10月7日木曜日

Ruby関連 HTML/Webスクレイピング・ライブラリ・レビュー

HTML/Webのスクレイピング処理の観点から、有名どころのRubyのライブラリについて、現状(2010年10月時点)を調査した。調査項目は凡例に示すとおりである。ライブラリの比較・選定に際して、判断のひとつの材料として資することを、期待している。

なにかご意見がありましたら、お気軽にコメントをどうぞ。
2014-05-06追記: 新しいのはこちら→2014年版



■凡例



  • ■の次に、ライブラリ名 (現時点(2010年)でのバージョン)を記す

  • desc に、ライブラリの目的・機能仕様などの説明を記す

  • update に、ライブラリの更新期間を記す。ここで、yyyy-と記されている場合、yyyy年から現時点でも更新されていることを表す

  • url には、ライブラリのHPを記す。特にない場合、また情報が不足している場合は、補うに足るurl(ソースコードのurl)を追記している

  • ライセンスには、配布条件等のライセンスを記す

  • ソースコードには、ライブラリの格納場所のurlを記す

  • インストールには、ライブラリのインストール方法を記す

  • コメントには、補足の情報、私見などを記す

■Hpricot (0.8.2)


desc:
Hpricot は、非常に柔軟なHTMLパーサーで、田中 哲(TANAKA, Akira)の
HTree とジョン・レッシグ(John Lessig)の jQuery に基づいている。しかし、
コード・スキャナは、C でコーディングし直された。

update:
2006-


ライセンス:
MIT License (see http://github.com/hpricot/hpricot/blob/master/COPYING )


rubyforge:
N/A

インストール:
gem install hpricot

コメント
多くの派生ライブラリを持つHTMLパーサー。webスクレイピングにも使うこと
ができる。
以前の公式サイト(http://code.whytheluckystiff.net/hpricot/)は、リン
ク切れである。

田中 哲氏のhtreeは、 http://www.a-k-r.org/index.html からたどることがで
きる。

■Mechanize (1.0.0)


desc:
Mechanizeライブラリは、webサイト間のやり取りを自動化するために
使用される。Mechanizeは、自動でクッキーを格納して送信、リダイレクトを
フォローし、リンクをたどったり、フォームをサブミットsubmitできる。フォーム・フィ
ールドは増やしたり、サブミットできる。また、履歴となった訪れたサイトを
調査する。

update:
2005-



ソースコード:
github:
http://github.com/tenderlove/mechanize


インストール:
gem install mechanize

コメント:
Andy LesterによるPerlの同名のライブラリ:Mechanize の強い影響のもとに開
発された。webスクレイピングのためのライブラリである。
ruby 1.8.6 と nokogiri に依存している。

インストール時に、エラーが発生するという報告がWeb上に散見される。この場合、gemとRailsの更新等が事前に必要とのこと。
※追記2010/12/7:バージョン1.0.0では、Hpricotではなく、Nokogiriを使用するようになっているようだ。

■ScrAPI toolkit for Ruby (1.2.0)


desc:
CSSセレクタと選択 => 抽出 => 格納 処理ルールを使ったスクレイパーを書く
ためのフレームワーク。

update:
2006-2008



ソースコード:
github:
http://github.com/assaf/scrapi


install:
gem install scrapi

コメント:
少し情報が古い(2007年)が、このような意見もあった:“Web scraping in
Ruby: why I had to use scrAPI instead of WWW::Mechanize and Hpricot”
http://blog.bigsmoke.us/2007/05/02/scrapi-wins-over-mechanize-and-hpricot-for-web-scraping-in-ruby

開発は、止まっているようだ。

■scRUBYt! (0.4.06)


desc:
scRUBYt! は、Rubyで記述された、シンプルだがパワフルなwebスクレイピング・
ツールキットである。目的は、webページ・クローリング、HTMLタグ・属性・
XPath・フォーム名のルック・アップ処理の超めんどくささ、また、その他Web
ページまたはFirebugから直接コピペしたようなサンプルからこれらを理解
するような、典型的な低レベルなwebスクレイピングから、あなたをフリーに
することである。

update:
2007-



ソースコード:
github:
http://github.com/scrubber/scrubyt


インストール:
gem install hpricot
gem install mechanize
gem install scrubyt

コメント:
hpricot と mechanize (選択的に、AJAXのスクレイピングにFireWtir)に依存
している。

■nokogiri (1.4.3.1)


desc:
Nokogiri は、libxmlラッパーである。Nokogiri は、XPathやCSSの検索のため
のインタフェースを持ち、また、HTML, XML, SAX, そしてReaderパーサーの機
能がある。Nokogiri は、Hpricotの寄り道リプレイスメントでもある。

update:
2008-


ライセンス:
The MIT License (via http://nokogiri.org/ )

ソースコード:
github:
http://github.com/tenderlove/nokogiri/


インストール:
gem install nokogiri

コメント:
この中で、一番包括的な機能を持つパーサー。もちろん、webスクレイピングに
も使うことができる。


2008年11月25日火曜日

[Seesaa]CSSを微修正[ソースコード]

前々から、どうもソースコードを記事に載せるときに、見にくいなぁと思っていたので、修正してみました。

等幅フォントのほうが、どう考えてもいい。
デザイン>デザイン一覧>下のほうに出てくる一覧から、使用しているデザインをクリック
で、スタイルシートの編集画面になる。

そこから、blockquoteクラスの属性に、font-family: monotype; を追加した。


ぐぐると、ソースコード中のキーワードを、色付けしたりするJavaScriptなどが、存在するみたいだ。
今のところは、これは保留。

2008年3月18日火曜日

Ruby: Mechanize GUIDE.txt 日本語訳

追記2010/12/7:本内容は古くなったので、バージョン1.0.0のものに更新予定である。
追記2014-10-13: ここに最新版をおいた: http://voidptrjp.blogspot.jp/2014/10/mechanize-guide.html



http://mechanize.rubyforge.org/mechanize/ にある GUIDE.txt を訳してみた。
チュートリアルとしてよくできていると思う(原文的な意味で)。




  • ルー語っぽい箇所などを、若干修正[2008/3/31]

  • 訳微修正。SyntaxHighlighterでコード部分を整理[2010/8/5]








GUIDE.txt


Path:     GUIDE.txt
Last Update:     Tue Dec 04 19:36:28 -0800 2007







WWW::Mechanizeをはじめよう



このガイドは、Mechanize を使い始めるためのものです。このガイドを読み終わるまでに、ページをフェッチしたり、リンクをクリックしたり、フォームをうめてサブミットしたり、Webページ内から必要なデータを取り出したり、、と、お望みのいろいろな便利なことができるようになるとよいです。このガイドは、Mechanize を使ってできることの、表面的なほんとにちょっとしたスクラッチです。だけども、はじめるには十分な情報となるとよいです!

   


ページをフェッチしよう!



最初のことを最初に。mechanize を require して、新しい mechanizeオブジェクトを生成しましょう:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new




さて、ページをフェッチするためのエージェントが使えます。グーグルをエージェントでフェッチしてみよう:

page = agent.get('http://google.com/')




なにがおこった? 我々は mechanize に対して、グーグルのメインページを取ってくるようにたのみました。Mechanize は、任意のセットされたクッキーを格納し、そしてグーグルが送ってきた任意のリダイレクトをたどりました。エージェントは、ページを我々に返しました。このページからデータを取り出したり、クリックするためのリンクを探したり、うめるためのフォームを見つけることができます。



つぎに、クリックするためのいくつかのリンクを探してみましょう。

   



リンクを見つける





Mechanize は、ページをGETしたり、POSTしたり、またはフォームをSUBMITしたとき、ページ・オブジェクトをひとつ返します。ページがフェッチされたら、エージェントはページをパースして、リンクの一覧表をページ・オブジェクト内に作ります。


それでは、グーグルのホームページをフェッチしたので、すべてのリンクを表示してみよう:

page.links.each do |link|
   puts link.text
end




リンクの一覧を表示できます。だけど、Mechanize はクリックするリンクを見つけるのに役立つ、いくつかショート・カットを用意してます。たとえば、テキストが ‘News’ であるようなリンクをクリックしたい、としましょう。ふつうは、このようにしなければなりません:

page = agent.click page.links.find { |l| l.text == 'News' }




でもMechanize には、ショートカットがあります。上記の代わりに、このようにできるのです:

page = agent.click page.links.text('News')




このショートカットは、「名前が ‘News’ であるような全てのリンクを探せ」という意味です。もしかしたら読者は「そのテキストのリンクは、複数ありうるのに!」と考えているかもしれません。そしてそれは正しい!もしクリック・メソッドに、リンクの一覧を渡した場合、Mechanize は最初のひとつをクリックします。もし二つ目のリンクをクリックしたいのなら、このようにやりましょう:

agent.click page.links.text('News')[1]




適切なリンクを以下のように探すこともできます:

page.links.href('/something')




もしくはそれらを一緒につなげて、適切なテキストと適切なhrefのリンクを探すこともできます:

page.links.text('News').href('/something')




これらのショートカットは、frame, iframe, formのようなものをフェッチしたときの任意のリストに対して、使えます。さて我々はリンクのクリックの仕方を知りました。つぎに、フォームをうめるようなもっと複雑なことをやってみましょう。

   


フォームをうめる




グーグルの例の続きをやりましょう。以下がコードです:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
page = agent.get('http://google.com/')




もしページが表示できれば、ひとつのfという名前のフォームがあり、2組のボタンと2,3のフィールドがあります:

pp page




いまフォームの名前がわかりましたので、ページをフェッチしてみましょう:

google_form = page.form('f')




Mechanize で、フォーム・インプット・フィールドにアクセスする方法はいくつかありますが、一番便利な方法は、オブジェクトのアクセッサを利用する方法です。では、フォーム上の ‘q’ という名前のフォーム・フィールドに、‘ruby mechanize’と入力して見ましょう:

google_form.q = 'ruby mechanize'




値をセットして、フォームを表示し、以下のような行が見えることを確認してください:

#<WWW::Mechanize::Field:0x1403488 @name="q", @value="ruby mechanize">




名前 ‘q’ に対応する値が変わっていた場合は、成功です!つぎにフォームをサブミットしてボタンを押し、結果を見てみましょう:

page = agent.submit(google_form, google_form.buttons.first)
pp page




今やったことは、検索フィールドに文字をいれて「検索」ボタンを押したのと同じことです。ボタンなしでフォームをサブミットした場合、テキスト・フィールドに入力してリターン・キーを打ったのと同じです。



コードを全部見てみましょう:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
page = agent.get('http://google.com/')
google_form = page.form('f')
google_form.q = 'ruby mechanize'
page = agent.submit(google_form)
pp page




ここまでで、スクリーン・スクレーピングをやってみました。フォームについて、もう少し深く見てみましょう。スキップしたくなる前に!

   





フォーム・テクニック応用編



このセクションでは、フォームで可能な入力フォームで違ったタイプの使用法について、触れたいと思う。パスワードやテキストエリア・フィールドは、テキスト・フィールドと同じように扱われ得る。セレクト・フィールドは、テキスト・フィールドにとても似ているが、関連するオプションがたくさんある。ひとつのオプションを選んだとき、mechanize はそれ以外のオプションを非選択にする (マルチセレクトでなければ!)




たとえばリスト上のひとつのオプションを選択しよう:

form.fields.name('list').options[0].select




今、チェック・ボックスとラジオ・ボタンを見てみよう。チェックボックスを選択するには、ただこのようにすればいい:

form.checkboxes.name('box').check




ラジオ・ボタンは、チェック・ボックスによく似ているが、同じ名前のその他のラジオ・ボタンをアンチェックする方法を知っている。チェック・ボタンと同じように、ラジオ・ボタンをチェックしてみよう:

form.radiobuttons.name('box')[1].check




Mechanize はまた、ファイルのアップロードも簡単にできる!ファイル・アップロード・フィールドを探し、ファイル名を教えてやるのだ:

  form.file_uploads.file_name = "somefile.jpg"


   



データをいじる





Mechanize は、HTMLをパースするために hpricot を使っている。これはなにを意味するか? mechanize で得たページを、hpricotオブジェクトのように扱えるということだ。 Mechanize をデータを取り出したいページのナビゲートに使った後、hpricotのメソッドで取り出せる:

agent.get('http://someurl.com/').search("//p[@class='posted']")


このパワフル・スクレーパに関するさらなる情報については、 HpricotBasics を参照してほしい。