httpsnapshot

概要

これは特定のウェッブページを取得しファイルとして収めるプログラムです。 例えば http://ruby-lang.org/ を取得し、ruby-dir に保存するには 次のようにします。

ruby httpsnapshot.rb http://ruby-lang.org/ ruby-dir

この時、一緒に張り付いている画像なども取り込まれ、ローカルで 閲覧できるようにリンクの張りなおしがなされます。

また、そのページにリンクされているページも取得したい場合は、 その深さをパラメータに加えてください。その深さだけ再帰的 にページを取得します。(デフォルトの深さが 0 です。)

ruby httpsnapshot.rb http://ruby-lang.org/ ruby-dir 2

この時最初のサイト外や、最初のページのあるディレクトリより上 のページは取得しません。しかし、httpsnapshot.rbはひとつ のライブラリであり、どのようなページを取得するかは細かく制御 できます。

インストール

httpsnapshot.rb を起動可能なディレクトリに置きます。

起動法

httpsnapshot.rb [OPTIONS] <URL> <DOWNLOAD DIRECTORY> [<DEPTH>]

起動オプション

-f config_file
設定ファイルを読み込みます。
-p Proxy
プロキシーサーバを指定します。
-h
ヘルプを表示します。
-t
テキストファイルだけを取得します。
-a
取得した HTML ファイルをテキスト化して保存します。
-c Cache_dir
キャッシュディレクトリを指定します。デフォルトは保存ディレクトリ のサブディレクトリ .snap-cache です。
-g
取得した HTML ファイルを変換しません。保存先はキャッシュディレクトリ です。
-U
キャッシュを読まず、新たに取得します。
-w
-g オプションで取得したファイルを変換します。
-d Num
Num の深さだけ取得します。起動パラメータの第3引数と 同じ意味です。(こちらが優先されます。)
-D
深さ優先で取得します。
-x
スタートしたディレクトリより下も取得します。
-i
スタートしたサイト以外の src を取得します。
-j
スタートしたサイト以外の href も取得します。
-V
処理状況のレポートの出力を控えます。
-E
処理の前にキャッシュを消去します。
-e
処理の後にキャッシュを消去します。
-M size
最大サイズで制限をかけます。size はバイト単位です。
-m size
最小サイズで制限をかけます。
-y filter-file

filter-file に書かれているフィルターをかけます。例えば

# filter-file
:href-allow,ignorecase
\.html?$
\.shtml?$
:href-deny,ignorecase
^foo\.html$
^bar\.html$

filter-file に書かれていれば .htm または .html または .shtm または .shtml で終わるファイルで、foo.html と bar.html 以外を取得します。 src-allow, src-deny というオプションも指定できます。

設定ファイル

httpsnapshot.rb はデフォルトでカレントディレクトリの .httpsnapshotrc を設定ファイルとして読みます。 現在設定できるのは Proxy だけです。

例:

proxy: http://proxy.xxx.yyy.com:8080

ライブラリとしての利用

httpsnapshot.rb には、2つのクラス HttpSnapSessionHttpSnap が定義されています。これを利用して WEB ページ取得 の制限をコントロールしたプログラムが書けます。

httpsnapshot.rb をそのまま起動すると以下のようなコード が実行されます。

#!/usr/local/bin/ruby
require "httpsnapshot"
require "getopts"
getopts("UuxhtvVgwae", "c:", "d:", "p:", "f:.httpsnapshotrc")

target, savedir = ARGV.shift, ARGV.shift
($OPT_h or !savedir) and usage()
savedir.sub!(/\/$/, '') #/
depth = Integer($OPT_d || ARGV.shift)

$config = HttpSnapSession.read_config($OPT_f) if $OPT_f

proxy_s = $OPT_p || $config["proxy"] || ENV["HTTPSNAPSHOT_PROXY"]
if proxy_s && !proxy_s.empty?
  proxy_s.sub!(/^(:?http:\/\/)?/, 'http://')
  proxy_s.concat ":8080" if proxy_s !~ /:\d+$/
  proxy = URI.parse(proxy_s)
  proxy, proxy_port = proxy.host, proxy.port
end

session = HttpSnapSession.new(target, savedir, depth)
session.cache_dir = $OPT_c if $OPT_c
session.verbose = $OPT_v || !$OPT_V
session.read_local = !$OPT_U || $OPT_u
session.proxy, session.proxy_port = proxy, proxy_port
session.only_get = true if $OPT_g || $OPT_a
session.output_format = "text" if $OPT_a

unless $OPT_x
  session.add_href_filter do |snap, psnap|
    snap.upper_dir?(session.root) || snap.path =~ /\bcgi-bin\b/
  end
end

if $OPT_t || $OPT_a
  session.add_href_filter do |snap, psnap| snap.guess_text?; end
  session.add_src_filter do |snap, psnap| snap.guess_text?; end
end

if $OPT_w
  session.build_table
  session.rewrite
else
  session.start
end

if $OPT_e
  session.cache_clear
end

puts "First File: #{session.start_file}" if session.first

Reference

httpsnapshot