jsAutoPageScraperというのを作った

http://coderepos.org/share/wiki/jsAutoPageScraper

概要

ブックマークレット開発などにおいて、JavaScriptでのHTMLスクレーピングを支援します。検索結果などの複数のレコードをJavaScriptの配列に変換して取得できます。ページングを利用しているサイトでは、意識することなく複数ページにまたがってレコードを取得できます。

特徴

  1. クロスブラウザで動作します。
  2. スクレーピングする要素の指定にはXPathを使います。IEとかSafari2の場合はJavaScript-XPathをロードして使います。
  3. AutoPagerizeとかLDRizeのSITEINFO形式(一部)を利用できます。

使い方

1. jsAutoPageScraperをcodereposからチェックアウトし、適当なサーバにアップします

svn co http://svn.coderepos.org/share/lang/javascript/jsAutoPageScraper/trunk jsAutoPageScraper

2. jsAutoPageScraper/js/ ディレクトリに作成するブックマークレットJavaScriptファイルを配置します。
e.g. twitter-scraper.js

var jscr = new JSAutoPageScraper(‘http://twitter.com/home', {
  nextLink: '//div[@class="pagination"]/a[last()]', // <== from AutoPagerize SITEINFO
  paragraph: '//*[contains(@class,"hentry")]', // <== from LDRize SITEINFO
  mapping : './/*[@class="meta entry-meta"]/a[contains(@class,"entry-date")]/@href'
});

jscr.scrape(50, handleTwitterPostUrls);
jscr.done();

function handleTwitterPostUrls(records) {
  ...
}

3. トップページ(index.html)の「Create Bookmarklet」からブックマークレットを生成します。「Name」にブックマークレット名、「File」にファイルへのパスを指定します。たとえば「File」に先の”twitter-scraper.js”を指定した場合以下のようなブックマークレットが生成されます。

javascript:(function(u,d,s){s=d.createElement('script');s.type='text/javascript';s.src=u;d.documentElement.appendChild(s)})('http://example.com/jsAutoPageScraper/js/scriptLoader.js#jsAutoPageScraper.js,twitter-scraper.js:JSAutoPageScraper',document)

こちらのブックマークレットは、はじめにライブラリとしてjsAutoPageScraperをロードし、そのロード後に指定したスクリプトファイル(ブックマークレットの本体)をロードするようになってます。(see. scriptLoader.js)

4. 生成されたブックマークレットをブラウザに登録しておきます。

5. あとはスクレープするHTMLが置かれてるサーバと同じドメインに属するページで、上記ブックマークレットを起動します。

内容の説明

クロスブラウザでDOMスクレーピングを行うため隠しIFRAMEにドキュメントをロードしています。そのため、スクレーピング対象はブックマークレットを起動したページと同一のドメインである必要があります。GreasemonkeyGM_XMLHttpRequest のようにクロスドメインでのリクエストは不可です。
IFRAMEロード完了後、XPathがサポートされてない場合にはJavaScript-XPathをロードしたドキュメントに付け加えます。
paragraphオプションに指定されている要素をすべてXPathで抜き出します。各要素ごとにmappingに指定されているXPathを適用して、値をレコードとして抜き出します。
nextLinkが指定されている場合は、次のロード先としてnextLink XPathで指定されているURLのドキュメントをロードし、これを最後まで繰り返します。


以上。なんか不具合あったら教えてください。