XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)

ページからデータをとりだそうとするとき、詳細な情報が書かれているページは別に用意されていて、もとのページと詳細ページのデータを混ぜ合わせないと全部のデータが得られないことがあります。


例としてTwitterが挙げられます。
タイムラインのページでは、発言が長い時は発言の末尾が省略されて ... になるため、発言の個別ページにいって発言全体を取得する必要があります(と思って今確認したら、今は長くても発言全体が表示されるようになってました...)。

以前に作ったWeb::Scraperのjavascriptバージョンwebscraper.jsはひとつのページからしかデータが取れなかったので、複数のページからもデータが取れるもの急いで作りました。

Firefoxであればブックマークレットから呼び出したり、Firebugコンソールで使えます。

スクリプト

jscrawler.js

つかいかた

Twitterのタイムラインのページ( http://twitter.com/home など )で
make_deferred_document(document, {
    paragraph: 'id("content")//tr',
    data: {
        name: './/a[@class="url"]/img/@alt',
        id: './/td[@class="content"]/strong/a',
    },
    subRequest: {
        url: './/a[@class="url"]/@href',
        paragraph: '.',
        data: {
            bio: './/span[@class="bio"]',
            url: './/div[@class="user_icon"]/a/@href'
        }
    }
} ).next( extractor ).next( function (data) {
        console.log(data);
} )

こんなかんじで取り出す部分を指定して使います。

そうすると


タイムラインのページからリンクをたどってユーザの個別ページにあるbio(自己紹介のところです)部分といっしょに、ユーザのIDと表示名を取得することができます。と、ここまでは一見よさそうなんですけど....


よくみると全部に同じデータが入っていて、しかもタイムラインのページで取り出しているid,nameと個別ページから取り出しているbioのデータとが同じ人のものではなくほかの人のものが混ざっている状態なのでした....


途中まで、時間的都合で再起的にたどるのはあきらめて2段階しかたどれない実装でいいやと思って書いていて、そのときはちゃんと動いてたのですが、やっぱりルールに従って何段階でもたどれるようにしたいと思って書き直したのが失敗でした。
こういう、ほかのページをXMLHttpRequestで取得して全部のページのロードと処理が終わってから非同期でなにかを処理するときにはJSDeferredが便利です。MochiKitのDeferredも同じように使えます(がJSDeferredに比べてファイルのサイズが大きいのでちょっとしたのが書きたい時にはちょっとおおげさなかんじがします)。


javascriptで複数ページからデータを集めてくるのは、ずっとまえから欲しかったので再度挑戦したいと思います....

tags

  • Firefox
  • data
  • javascript
  • 「XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)」のはてなブックマーク数
  • 「XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)」deliciousブックマーク数
  • 「XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)」をはてなブックマークに追加
  • save "XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)" to del.icio.us
  • 「XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)」をリアルタイムブログ検索
  • permalink
  • Firefoxのヒストリぜんぶをfaviconにして見る!
  • 大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性

comments

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

trackbacks

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

http://labs.gmo.jp/mt/mt-tb.cgi/225
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2008 .07. 26 0:14

tagcloud

  • API3
  • C/C++3
  • E4X1
  • FUSE2
  • Firefox30
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP4
  • Safari1
  • UI2
  • WebKit1
  • XML2
  • XPCOM4
  • XPath5
  • apache2
  • binary2
  • book1
  • data14
  • debug5
  • design2
  • experiments4
  • extension14
  • geo1
  • google gears2
  • google maps API1
  • greasemonkey4
  • httpd5
  • javascript24
  • linux1
  • logging2
  • mobile4
  • perl6
  • tips6
  • tool11
  • vim2
  • visualization4
  • widget1
  • wii3
  • windows7
  • サービス8
  • 和訳1

Archives

  • 2008.08 (1)
  • 2008.07 (4)
  • 2008.06 (4)
  • 2008.05 (5)
  • 2008.04 (4)
  • 2008.03 (4)
  • 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