てきとうにクリックしたらてきとうにWeb::Scraperのコードを作ってくれるWebScraper IDE

まえに作ったWeb::Scraperのjavascriptバージョンwebscraper.jsとXPathをてきとうに作ってくれる機能を追加したwebscraperp.jsにHTMLのドキュメントから繰り返し部分をみつけてSITEINFOをつくるAutoPagerize Iteration Detectorみたいなみためをくっつけて、取り出したい部分をクリックしたらてきとうにXPathを生成してWeb::Scraperのコードにして出してくれるFirefoxのextensionを作りました。Firefox3専用です。ごめんなさい。

ダウンロード

WebScraper IDE (for Firefox3)

使い方

今回もいつもお世話になっているスターバックスさんの店舗検索結果(住所・店名・条件から探す)を例に使い方をご紹介します。 WebScraper IDEをインストールするとツールメニューの中にWebScraper IDEという項目ができます。コードを作りたいページを開いてからWebScraper IDEを選んで開きます。
こんなウインドウが出てきたら、今度はページの中の取り出したいところをクリックしています。クリックするとちょっと処理が重くて2秒くらいまたされることがありますが、クリックした要素が丸く囲まれて、WebSCraper IDEのウインドウにその項目が追加されていきます。

クリックされた要素から繰り返し部分を判別してそのXPathを生成と、繰り返し部分からクリックした要素の相対的なXPathの生成を自動的にやります。ちょっとだけ処理が重いのでクリックしたあと反応がなくなった感じになりますが、スペックにもよりますがたぶん2,3秒くらい待てば反応が返ってくるので、押したあとちょっとだけ待つかんじで使ってみてください。

マッチング結果をみる

WebScraper IDEの下側のツリーには、XPathを評価してマッチした要素の内容が表示されます。Firebugがインストールされていれば、選択した部分がブラウザの側で強調表示されるので結果として表示されているテキストがページの中のどの部分にマッチしていたのかがわかりやすいです。自動で生成されたXPathでうまくマッチできているかどうかの確認に使えます。
Picture 10-5

XPathを書き直す

生成されたXPathがたしかにマッチするけどちょっとそれは...というかんじにいまいちなときには手で書き換えてもいいです。 XPathの部分をダブルクリックすると編集モードになるので、生成されたXPathをもっと人間的な感じに書き換えられます。
Picture 12-3
書き換えるとページの囲まれている部分とXPathのマッチング結果もそれに合わせて変わるので、書き換えた結果変なところにマッチしたりしていないかもチェックできます。

Web::Scraperのコードを得る

ひととおり取り出したい部分をクリックしたりXPathを修正してWebScraper IDEのPerlタブをクリックすると、Web::Scraperのperlのコードを得られます。
Web::Scraper genetated code
コピーして実行すると$resultに取り出したいデータが入ります。

アルゴリズム

WebScraper IDEの中で使っているwebscraperp.jsのアルゴリズムをかんたんに紹介します。

webscraperp.jsは、ページの中にとりだしたいデータが繰り返し入っていることをいまのところ前提にしています(入っていないときに対応させるのは簡単なのですがまだやってないです)。webscraperp.jsは、とりだす部分として明示的に指定された要素のXPathを作ることと、そこから繰り返し部分(以下paragraphと呼びます)のXPathを推定することをしています。

取り出す部分のXPathは、指定された要素からHTMLドキュメントのルートの要素に到達するまで親要素をたどっていけば簡単に作ることができます。ただそれだとHTMLの変化に対してとても弱いXPathになってしまうので、HTMLにつけられているクラス名やIDを使ってXPathを生成します。

paragraphのXPath推定は、明示的に指定された要素の共通の祖先を基準にして、親要素をたどっていき、兄弟要素に同じような子孫要素を持つところを見つけて、同じような子孫を持つ兄弟要素にマッチするXPathを生成しています。このとき似たような子孫をたまたま持っているけれど、paragraphのひとつとしては適当でない要素があったりするので(今回の例でいうと、検索結果の上下に入っているナビゲーション部分)、それを排除するために単純にHTMLツリーの差分を取って差分の小さいものだけにマッチするようにしています。この処理は重たいのでなんとかしたいところです。

取り出したい部分が、ひとつのページに何回か繰り返されているような構造になっていればmozillaZine 日本語版のように、ひとつひとつのparagraphがみためではすごく大きいものでもみたいなものでもうまく取り出すことができます。

うまいくかないもの

いまのところ、繰り返しが含まれていてもSourceForge.net Repository - [nekohtml] Index of /trunk/src/org/cyberneko/htmlのように、繰り返しひとつずつに色分け等のために異なるクラス名がつけられているものはうまくXPathを生成することができません。どちらか一方にだけマッチするXPathができちゃうので、そのときは手で修正する必要があります。

リポジトリ

AutoPagerizeのSITEINFOのように、こうして生成したXPathをみんなで共有してメンテナンスできる場所があるといいなーとおもいます。一度作ったXPathがHTMLの変更等で機能しなくなっていないか、CPANのように定期的にテストを走らせてチェックしてくれたりして、壊れているものがあったら教えてくれたり。最近のDapperをみていると、いくつかクリアしないといけないこともありそうですが、そういうリポジトリがほしいです。

tags

  • Firefox
  • data
  • extension
  • 「てきとうにクリックしたらてきとうにWeb::Scraperのコードを作ってくれるWebScraper IDE」のはてなブックマーク数
  • 「てきとうにクリックしたらてきとうにWeb::Scraperのコードを作ってくれるWebScraper IDE」deliciousブックマーク数
  • 「てきとうにクリックしたらてきとうにWeb::Scraperのコードを作ってくれるWebScraper IDE」をはてなブックマークに追加
  • save "てきとうにクリックしたらてきとうにWeb::Scraperのコードを作ってくれるWebScraper IDE" to del.icio.us
  • 「てきとうにクリックしたらてきとうにWeb::Scraperのコードを作ってくれるWebScraper IDE」をリアルタイムブログ検索
  • permalink
  • いまさら人に聞けない Firebug tips
  • Firefox3でSQLite3の全文検索機能を使って日本語を検索する

comments

TypeKey Enabled
スタイル用のHTMLタグが使えます。
*required

trackbacks

トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。

http://labs.gmo.jp/mt/mt-tb.cgi/206
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2008 .03. 12 15:34

tagcloud

  • API1
  • C/C++2
  • E4X1
  • FUSE2
  • Firefox21
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP4
  • XML1
  • XPCOM4
  • XPath3
  • apache2
  • binary2
  • book1
  • data12
  • debug5
  • design1
  • experiments3
  • extension12
  • google gears1
  • google maps API1
  • greasemonkey3
  • httpd5
  • javascript18
  • linux1
  • logging2
  • mobile3
  • perl4
  • tips5
  • tool11
  • vim2
  • visualization2
  • widget1
  • wii1
  • windows7
  • サービス6
  • 和訳1

Archives

  • 2008.03 (3)
  • 2008.02 (6)
  • 2008.01 (3)
  • 2007.12 (4)
  • 2007.11 (5)
  • 2007.10 (4)
  • 2007.09 (4)
  • 2007.08 (4)
  • 2007.07 (8)
  • 2007.06 (7)
  • 2007.05 (4)
  • 2007.04 (5)
  • 2007.03 (6)
  • 2007.02 (4)
  • 2007.01 (6)

about

  • bits and bytesのXML
  • 「bits and bytes」のCreative Commons
  • Powered by Movable Type
  • イベントと地図 - モグ
  • Use ecto to blog!
  • bits and bytesのはてなブックマーク数
  • bits and bytesをMy Yahoo!に追加
  • Subscribe with Bloglines