Web::Scaraperを使ってCDBabyからタイトルと金額を取得する
Webページから欲しい情報を取得してしまおうというのがスクレイピング。スパイダリングなんて言い方もする。
でもHTMLっていろいろな書き方があるからこれがなかなか大変。
今まではHTML::TreeBuilderとかHTML::TokeParserを使っていたけど、Web::Scraperという便利なものがあるということでやってみました。
"CDBaby"というインディーズなどマイナーなCDが売っているサイトの「ラグタイム」というジャンルから、TOP40のCDタイトル名・価格・URLを抜き出してみます。
コード
use strict; use warnings; use Web::Scraper; use URI; use YAML; my $url = new URI('http://cdbaby.com/top/223'); my $scraper = scraper { process 'div.albumbox>h3>a', 'title' => 'TEXT', 'link' => '@href'; process 'div.albumbox>div.price', 'price' => 'TEXT'; #result 'title', 'link', 'price'; }; my $item = scraper { process 'div#content li', 'result[]' => $scraper; #result 'result'; }; my $res = $item->scrape($url); warn Dump $res;
出力結果
- link: !!perl/scalar:URI::http http://cdbaby.com/cd/duck3 price: 'CD price: $15.00' title: 'DUCK BAKER: Do You Know What It Means To Miss New Orleans' - link: !!perl/scalar:URI::http http://cdbaby.com/cd/finnreilly2 price: 'CD price: $12.50' title: 'FRED MICKEY FINN AND CATHY REILLY: The Entertainers' - link: !!perl/scalar:URI::http http://cdbaby.com/cd/celletti1 price: 'CD price: $14.00' title: 'ALESSANDRA CELLETTI PLAYS SCOTT JOPLIN: Black Baby ・・・ ・・・
XPathではなくCSSセレクタで指定しました。
ところで、コメントアウトした result行 はよくわかっていません・・。
他のコードを見ているとよく指定しているんだけど、コメントしても結果は変わりませんでした。