サイトのクローリングにはScrappyがすごくいいかもしれない
クローリング楽しいですよね!
perlで高速にクロールしたいのであればGunghoなど使うのがいいかもしれませんが、
基本手軽にやりたいことが多いので
WWW::Mechanize+Web::Scraper
という組み合わせでクロールするのが定番でした。
しかしたまたま Scrappy を知り、
少し触ってみたところすごくいいのではないか!?と思い
記事にしてみました。*1
基本系(crawlコマンドを利用する場合)
my $scrappy = Scrappy->new; $scrappy->crawl('1.クロールするルートURL', '2.URLにマッチするパス' => { '3.コンテンツにマッチするxpath or CSSセレクタ' => sub { my ($self, $item) = @_; # 4.キューに追加 $self->queue->add($item->{href}); } }, );
こんな構成になります。
- まずクロールするルートを指定し、
- その下にURLのパスを記述します。
- あとは普通にxpathやCSSセレクタでスクレイピングすることが可能です(Web::Scraperと同じ記述が可能)。
- また、自身のキューにURLをaddすることでcrawl対象のジョブキューに追加されます。
- crawlはキューからURLを取り出して処理を繰り返します。
例について
SYNOPSISも理解しやすいものになっていますが、
もう少し例を増やしてみます。
例その1:はてなフォトライフから画像ぶっこぬき
ルートURL = http://f.hatena.ne.jp/hotfoto
1ループ目
- パスが「/hotfoto」にマッチするので 11行目の処理が実行されます。
- スクレイピングでエントリURLを抜き出して、それをキューに突っ込みます。
例その2:はてぶのトップからperlタグをたどってエントリのリンク先からテキストのみ抽出
ルートURL = http://b.hatena.ne.jp/
1ループ目
- パスが「/」にマッチするので 13行目の処理が実行されます。
- スクレイピングで「タグ一覧」へのURLを抜き出して、それをキューに突っ込みます。
ドキュメント
http://search.cpan.org/~awncorp/Scrappy-0.94111610/lib/Scrappy.pm.bak
他にもいろんな機能があるのでご参照ください。
プラグイン機能もあるようですね。
いままでの知識はそのまま使えますし、なにより読みやすいのがいい!
階層構造に似たコーディングスタイルのため
あとから見たときに何をやっているのか一目瞭然です。
クローリングするときはしばらくこのモジュールを使ってみます!
*1:つまりそんなに使い込んでいない