コードを舐める日々

わからないことがわからないことをしる日々

Web::Scraperってすごい件

あるサイトからコピペでデータ集めすると大変になっちゃう時がありませんか?
そこでCPANモジュールのWeb::Scraperを使ったプログラムを勉強してみました。

勉強することになった経緯

まず、「perl スクレイピング」でぐぐってみると、色んな解説やQ&Aサイトが出てきた中で
Web::Scraperが使いやすいようです。このモジュールを作った人が著名なPerlハッカーである
miyagawaさんなのでこれに決めますた。

Web::Scraperはどうやるの?

まず、CPAN.orgでWeb::Scraperをぐぐります。
http://search.cpan.org/dist/Web-Scraper/lib/Web/Scraper.pm

NAMEに「Web Scraping Toolkit inspired by Scrapi」とあり、
ウェブスクレイピングツールキットであることはわかっているんですが、
Scrapiに影響をうけてつくられたもの?だそうです。
Scrapiってなんだ!とぐぐったら、Rubyスクレイピングツールキットでした。

SYNOPSIS(概要)はWeb::Scraperの使い方が書いてある。

#!/usr/bin/perl

use URI;
use strict;
use warnings;
use Web::Scraper;

 my $ebay_auction = scraper {
     process "h3.ens>a",
         description => 'TEXT',
         url => '@href';
     process "td.ebcPr>span", price => "TEXT";
     process "div.ebPicture >a>img", image => '@src';
 };

 my $ebay = scraper {
     process "table.ebItemlist tr.single",
         "auctions[]" => $ebay_auction;
     result 'auctions';
 };

 my $res = $ebay->scrape( URI->new("http://search.ebay.com/apple-ipod-nano_W0QQssPageNameZWLRS") );

DESCRIPTIONを超訳してみると「Web::Scraperはウェブ上のデータをスクレイパするためのツールです。
RubyのScrapiと同じものです。このモジュールの品質はベータです。このアプリケーションプロトコル
インタフェースはScrapiから盗んだものですが、将来的には変わるかもしれません。」となる。
なるほど!

でもまだ自分で書けるまで理解できていないのでid:naoyaさんからの記事を参考に動かしてみる。
Web::Scraper - naoyaのはてなダイアリー

#!/usr/local/bin/perl
use strict;
use warnings;
use FindBin::libs;

use URI;
use Web::Scraper;
use Encode;
use List::MoreUtils qw/uniq/;

my $links = scraper {
    process 'a.keyword', 'keywords[]' => 'TEXT';
    result 'keywords';
}->scrape(URI->new(shift));

print encode('UTF-8', $_), "\n" for uniq @$links;

EUC-JPからUTF-8に変更。

実行してみる

ためしにid:masabozのダイアリーでやってみた。

# perl scraper.cgi http://d.hatena.ne.jp/masaboz/

おお!

DVD-RAM
I/O
メディア
ダイアログ
CD-RW
Google
チェックボックス
マイコン
プロパティ
ATAPI
ジャンパー
自作PC
シリアルATA
CD-ROM
ハードウェア
タグ
再起動
ソフトウェア
ダスター
フロントロー
エレコム
amazon.co.jp
砂時計
アイコン
メンテナンス
Windows
OS
ISO
ECMA
リムーバブル
コンピュータ
ドライバ
レーザー
CD-R
Blu-ray
HD-DVD
青色発光ダイオード
経済効果
技術者
赤外線
ナノメートル
青紫
半導体
関数
セキュリティ
参考書籍
string
引数
ABC
文字列
abc
xyz
デフォルト
スクリプト
ディレクトリ
PHP
php
ブラウザ
アクセス
dir
Apache
module
山田祥寛
秀和システム
正規表現
Yahoo!
配列
キーワード
Goo
変数
ハーシー
毎日コミュニケーションズ

簡単に摘出できてしまうんだな!
今度はその仕組みを勉強しよう。