maRkの

キャンペーンだとか、Chess.appについてのなにか

Web::ScraperとWWW::MechanizeでHatena::Letから自分のRawコード取得、ファイル保存

Hatena::Let 外で作成済みのbookmarkリポジトリ管理しようかな、とか思って。一つ一つ書き出していくのもなんだし、後学のため作ってみた。

自分(或いはあるユーザー)のbookmarkletを持ってくるのに、cURL wget なり使ってもいいと思うけど、自分の場合だと@privateつきのプライベートモードのbookmarkletも作っているから、一回認証通してないとpublicモードのしか取れないことになる。

参考
WWW::Mechanize - Perlオブジェクト中のハンディWebブラウザ - perldoc.jp
use Web::Scraper; - 今日のCPANモジュール(跡地)

成果物は以下に

Hatena::Let で自分の bookmarklet の Raw Code を取得、ファイル保存する — Bitbucket


作業フォルダを mkdir してカレントディレクトリ移動しておきます。

my $user = 'USER NAME';
my $pass = '?? YOUR PASSWORD ??';

でユーザー名:Passwordを入れ getlet.pl とでもして保存。あとは、ターミナル等で

$ ./getlet.pl 

とか。

Note:

ログインが成功したら、Hatena::Letのユーザーのトップページに移動して、そこから各bookmarkletパーマリンクを配列に格納します。
あとは、Web::Scraperで、ページにあるbookmarkletの分だけページ移動してスクレイピングしていきます。Hatena::Letでは1ページ20件分のbookmarkletで分割されているので、1ページ最大で20件のbookmarkletです。
切り出し部分は、

my $scraper = scraper{
    process 'pre.code-raw', 'rawcode' => 'TEXT';
    process 'title', 'doctitle' => 'TEXT';
    };

な感じにして、Rawコードは pre要素から、各ファイル名として(でっちあげで)指定するのにtitle要素から取得しています。取得しできたら、ファイル出力して、20件分ならば20回繰り返します。
※ 出力するファイルは、text/plain で 拡張子 .txtとなるようにしてあります。

ツールでは、トップページ1ページだけの解析ですが、2ページ目からは、 ?of=20 とかいったリンクをたどることで取得できます(本当はそこまで解析して全自動にすればいいんだけど、何せ突貫工事なもので、本当に自分のページのだけしか想定してないです)。

$mech->follow_link (url => "http://let.hatelabo.jp/".$user."/");
$mech->follow_link (url_regex => qr/of=20$/i);

ついでにですが、以下に、個別bookmarkletページ開いた時実行するとダウンロードになるbookmarkletがあります。