使用Perl分析网页中的文件链接
任务要求:需要对网页中的pdf文件链接进行下载,由于文件数量很多,就要使用程序来提供出它们的链接,然后在进行下载;下载并不一定要使用perl来实现,但文件的链接却需要提取出来。---------------
使用'WWW::Mechanize'模块,它的依赖较多,需要安装不少相关模块;这也是一个重量级的模块,运行效率不是很高,在这里似乎有点牛刀小用。
---------------
use strict;
use warnings;
use WWW::Mechanize;
my $url= "http://www.cl.cam.ac.uk/~rja14/book.html";
my $mech=WWW::Mechanize->new();
$mech->get($url);
my @links = $mech->links();
foreach my $link (@links) {
print "LINK: " . $link->url() . "\n";
#print "DESCRIPTION: " . $link->text() . "\n";
}
---------------
使用'LWP::UserAgent'和'HTML::LinkExtor'模块
use LWP::UserAgent;
use HTML::LinkExtor;
use URI::URL;
$url = "http://www.cl.cam.ac.uk/~rja14/book.html";
$ua = LWP::UserAgent->new;
# Set up a callback that collect image links
my @imgs = ();
sub callback {
my($tag, %attr) = @_;
return if $tag ne 'a'; # we only look closer at <img ...>
push(@imgs, values %attr);
}
# Make the parser. Unfortunately, we don't know the base yet
# (it might be diffent from $url)
$p=HTML::LinkExtor->new(\&callback);
# Request document and parse it as it arrives
$res = $ua->request(HTTP::Request->new(GET => $url),sub {$p->parse($_[0])});
# Expand all image URLs to absolute ones
my $base = $res->base;
@imgs = map { $_ = url($_, $base)->abs; } @imgs;
# Print them out
print join("\n", @imgs), "\n";
---------------
使用'LWP::Simple'和'HTML::LinkExtor'模块
The Perl Cookbook has a good example:
# xurl - extract unique, sorted lists of links from URL
use HTML::LinkExtor;
use LWP::Simple;
$base_url = shift;
$parser = HTML::LinkExtor->new(undef, $base_url);
$parser->parse(get($base_url))->eof;
@links = $parser->links;
foreach $linkarray (@links) {
local(@element)=@$linkarray;
local($elt_type)=shift @element;
while (@element) {
local($attr_name, $attr_value) = splice (@element, 0, 2);
$seen{$attr_value}++;
}
}
for (sort keys %seen) { print $_, "\n"};
比如我想下载《计算机安全工程》书的第二版,可以将脚本输出的所有链接进行过滤处理:
perl geturls.pl|grep pdf|grep SEv2>dl.log
使用wget进行批量下载:
wget -i dl.log
笔者还用到的一个场景,就是下载"星际译王-StarDict"上的字典链接。
可用以实现分析下载功能的模块或工具可有:
WWW::Mechanize::Firefox
WWW::Scripter
lwp-rget
webreaper
w3mir
checklink
timefetch
非perl工具
Heritrix
HTTrack是一款令人印象深刻的产品:它使用简单,有着出色的用户界面,提供了你所需要的每一个功能,同时运行速度快,不附带任何广告。如果你想要下载一个网站以便能够“离线浏览”,这款软件就是你所需要的。
HTTrack兼容所有的Windows版本,按GPL协议作为自由软件发布。在Windows下的发行版本是WinHTTrack,Linux下则是WebHTTrack。官方没有直接提供Mac系统下的安装文件,但是在常见问题解答里详述了如何编译源码。
curl
wget