ref="/tag/2034/" style="color:#EB6E00;font-weight:bold;">Perl爬虫怎么写
想用Perl写个爬虫,其实没那么复杂。很多人觉得Perl老了,但现在有些老系统、内部脚本还在用它,写个小爬虫抓点网页数据特别顺手。比如你要定期从公司内网拉报表,或者监控某个页面有没有更新,Perl几行代码就能搞定。
核心就是用几个经典模块,最常用的是LWP::UserAgent和HTML::TreeBuilder。前者负责发请求,后者帮你解析HTML结构,像浏览器一样“看懂”页面。
发起HTTP请求
LWP::UserAgent是Perl里发网络请求的标配。安装可以用cpan命令:cpan install LWP::UserAgent。写代码时先use一下,然后创建一个ua对象:
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
my $response = $ua->get('http://example.com');
if ($response->is_success) {
print $response->decoded_content;
} else {
warn $response->status_line;
}这里设置了超时时间和User-Agent,避免被当成机器人封掉。response成功后拿到的是原始HTML字符串,接下来就得靠解析工具提取内容。
解析网页内容
直接用正则去扒HTML?别犯傻,容易出错。推荐HTML::TreeBuilder,能把HTML转成树结构,方便查找元素。先安装:cpan install HTML::TreeBuilder。
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_content($response->decoded_content);
# 找所有链接
for my $link ($tree->look_down('_tag' => 'a')) {
my $href = $link->attr('href');
my $text = $link->as_text;
print "$text: $href\n";
}
$tree->delete; # 记得释放内存look_down方法很实用,可以根据标签名、class、id等属性查节点。比如要找class为price的元素,可以写$tree->look_down(class => 'price')。
处理简单的反爬
有些网站会检查Cookie或Referer,这时候在请求里加上就行:
my $response = $ua->get(
'http://example.com/detail',
'Referer' => 'http://example.com',
'Cookie' => 'session=abc123'
);如果页面是JavaScript动态加载的,那Perl就不太合适了,得上Selenium这类工具。但纯静态页面,Perl完全够用。
保存抓下来的数据
抓完存成文件也很简单。比如把结果写进CSV:
open my $fh, '>:encoding(utf8)', 'data.csv' or die $!;
print $fh "标题,链接\n";
# 假设已经从页面里提取了$title和$url
print $fh "$title,$url\n";
close $fh;以后用Excel或者Python都能接着处理。小任务不折腾数据库,文本文件最省事。
写Perl爬虫就像修家里的水龙头,工具老旧但好使。关键不是语言多新潮,而是解决问题快不快。你要是手头有台老服务器跑着Perl环境,别急着换技术栈,先试试看能不能用几行脚本把活干了。