使用Perl分析网页中的文件链接
2013-04-23 16:57:31 阿炯

本站赞助商链接,请多关照。 任务要求:需要对网页中的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