jsAutoPageScraperというのを作った
http://coderepos.org/share/wiki/jsAutoPageScraper
概要
ブックマークレット開発などにおいて、JavaScriptでのHTMLスクレーピングを支援します。検索結果などの複数のレコードをJavaScriptの配列に変換して取得できます。ページングを利用しているサイトでは、意識することなく複数ページにまたがってレコードを取得できます。
特徴
- クロスブラウザで動作します。
- スクレーピングする要素の指定にはXPathを使います。IEとかSafari2の場合はJavaScript-XPathをロードして使います。
- 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にドキュメントをロードしています。そのため、スクレーピング対象はブックマークレットを起動したページと同一のドメインである必要があります。Greasemonkey の GM_XMLHttpRequest のようにクロスドメインでのリクエストは不可です。
IFRAMEロード完了後、XPathがサポートされてない場合にはJavaScript-XPathをロードしたドキュメントに付け加えます。
paragraphオプションに指定されている要素をすべてXPathで抜き出します。各要素ごとにmappingに指定されているXPathを適用して、値をレコードとして抜き出します。
nextLinkが指定されている場合は、次のロード先としてnextLink XPathで指定されているURLのドキュメントをロードし、これを最後まで繰り返します。
以上。なんか不具合あったら教えてください。