これは特定のウェッブページを取得しファイルとして収めるプログラムです。
例えば 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-c Cache_dir.snap-cache です。-g-U-w-d NumNum の深さだけ取得します。起動パラメータの第3引数と
同じ意味です。(こちらが優先されます。)-D-x-i-j-V-E-e-M size-m size-y filter-filefilter-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つのクラス HttpSnapSession と
HttpSnap が定義されています。これを利用して 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