Subscribed unsubscribe Subscribe Subscribe

オフラインでウェブページを閲覧するための Fetch::WithStatic 書いた

普通、スクレイピングしたウェブページをブラウザで開くと、外部の .js や .css や画像ファイルが無いので、ぐっちゃぐちゃになってますね。
ということで、 コマンド1発でウェブページを静的ファイルごとまとめてダウンロードできるモジュールを作りました。

https://github.com/Cside/Fetch--WithStatic

コマンドから使う

だだだだーっとファイルがダウンロードされます。

$ fetch-static http://twitter.com/

Saved: index.html
Saved: D1010281_normal.jpg  # 静的ファイルはすべて static/ 以下にまとめて保存される
Saved: img053_normal.jpg
Saved: tp_mark_normal.png
Saved: aicon_normal.png
Saved: icon-_normal.png
Saved: unicef_75x75_1__normal.jpg
Saved: _______1_normal.jpg
Saved: ayu_19980408_normal.jpg
Saved: tanigaki_normal.jpg
Saved: ola_normal.jpg
Saved: icon12771681201367_normal.jpg
Saved: __________2__normal.jpg
Saved: icon_twitter_normal.jpg
Saved: k3wG1_normal.jpg
Saved: 73_normal.jpg
Saved: biz_stone_normal.jpg
Saved: face2_normal.jpg
Saved: jquery.min.js
Saved: logo_withbird_home.png
Saved: a_normal.jpg
Saved: evedit0xr_2__1__normal.jpg
Saved: fronts.css
Saved: remipic_normal_done_normal.jpg
Saved: discover-video.png
Saved: fronts.js
Saved: widget.js
Saved: ja.js

Success!
open `/Users/cside/src/index.html`

ダウンロードしたHTMLファイルを開くと、オフラインでも綺麗に見れます。(jsも動く)
http://gyazo.com/d9f7bf38341d796b5992a2d18d47c2a5.png


ディレクトリを指定する場合はこのようにします。

$ fetch-static http://twitter.com/ --dir=/path/to/dir  # /path/to/dir 以下にダウンロードする

スクリプトの中で使う

もちろんスクリプトの中でも使えます。

use Fetch::WithStatic;

my $scraper = Fetch::WithStatic->new;
$scraper->get(
    url => "http://twitter.com/",
    dir => "/path/to/dir"    # 省略可
);

単一のページを保存するだけなら、ブラウザの拡張(ScrapBookとか)で十分事足りますが、スクリプトの中で使いたかったのでモジュールにするに至りました。

今後加えようか悩んでいる機能

  • 再帰的にページをダウンロードする機能

役に立ったもの

  • HTML::TreeBuilder::Select
    • CSSセレクタでHTML要素を取得できる。XPathろくに書けないので使った。
    • HTMLの要素や属性を書き換えたりすることも可能。
    • だいたいのウェブページはXML::LibXMLに食わせるとパースエラーになるので、HTMLを扱う際には今後もお世話になると思う。
  • Encode::Guess
  • Coro
    • 並行処理には欠かせない。