HTMLをスクレイピングして解析(パース)する
HTMLをスクレイピング(scraping)してあれこれとするとき、僕はずっと正規表現に頼っていたのですが、 ページの構造が変化するとすぐに使えなくなってしまうし、時間がかかる割りに退屈な作業なので何とかならないかなと思っていました。
PHPで探していたのですが、XML(とかRSS)をパースする関数やライブラリは、良く目にするものの、HTMLを処理できるものはなかなか見つかりませんでした。 以下は、PHP(とかRuby、Perl)でHTMLをスクレイピングしたりパースするための方法。
PHPでスクレイピング&パース
HTMLを整形式のXML文書に修正するPHPクラス
HTMLを、整形式のXMLに変換してくれるライブラリ。PEARのXML_HTMLSax3が同梱されているので、これだけでちゃんと動きます。いんちきなHTMLとか、XHTMLが整形式のXMLになるので、後は通常のXMLと同じように処理できる。
動作は、サンプルの「sample.php」ですぐに確認可。「$target = ?」で対象ファイルと、文字コードを指定し、「$output_xml = true;」でXMLファイルになる。とても便利!
rhacoのSimpleTagを試してみました
rhaco.org(らこ。PHPのWebアプリケーションフレームワーク)のSimpleTagを使うとPHPでHTMLを簡単にparseできる。使い方もシンプルです。 (参考:[rhaco]SimpleTag)
rhacoは、本当にいろんなことができるっぽい。ただ、ドキュメントが見当たらない?みたいなのでなかなか内容が掴めない。 テンプレートtemplate(rhaco)エンジンとかも使える。
Snoopy
スヌーピーはウェブブラウザをシミュレートするPHPのクラス。リンク(aタグ)を抜き出したり、submitして、getしたりできる。 そういえば、前に使ったMagpie RSSも中でSnoopyを使っているみたい。
PHPその他
PHP以外の他の言語の方が、この手のスクレイピング、パース(parse)周りは豊富かもしれない。 僕は、PHP以外、ほとんど使えないのですが一応メモ。
Rubyでスクレイピング&パース
「WWW::Mechanizeとか」、「htree」、「Hpricot」とかいろいろある。 サーバーにはRubyもインストールされているようなので、はじめてだけど、 VikiWiki - htreeを参考に、 “htree"あたりを使ってみたらちゃんと動いた。
こういうのをみると、Rubyもいいなって思う。
-
WWW::Mechanize による Webアクセスの自動化Rubyスクリプト
-
Hpricot Showcase-JaRubyでWebサイトを解析するときに強い味方となるライブラリ、HpricotとWWW::Mechanize
Perlでスクレイピング&パース
WWW::MechanizeはRubyとかに移植されているが、元は Perlで書かれていたものだったらしい。
他にも、PerlにはWeb::Scraperというモジュールがあるようです(追記 2007/5/21)。これは使いやすそうですね。
スクレイピングとか他の雑メモ
- スパイダリング(Spidering)の基礎
- スクレイピングはもっと簡単にならなければいけない
- 進化する“Webスクレイピング”技術の世界 ? @IT
- [BOT] Bots on NOBODY:PLACE vol.9 : NOBODY:PLACE
- OpenQA: Selenium
- Dapper: The Data Mapper
- はてな質問 PHPの「フレームワーク」とは何でしょうか?
- はてな質問 googleでの検索を、スクリプト言語に組み込むことというのは可能なのでしょうか。
- はてなブックマーク - タグ scraping
- はてなブックマーク - タグ スクレイピング
- del.icio.us search for “scraping”
Spidering スパイダ 参考書
Spidering hacks―ウェブ情報ラクラク取得テクニック101選 Perl中心だけど、かなりおもしろい。Hack#84にPHPのサンプルコードも一応ある。紹介されているコードが日本のサイトに合わせてあったり(国立国会図書館、Yahoo!JAPANのサイトなど)、日本語処理にかんするパートもちゃんと載っている。ページ数500ぐらいでちょっと厚めかな。