ref="/tag/2034/" style="color:#E3A3CF;font-weight:bold;">Perl爬虫怎么写?其实没那么难
有时候你想从某个网站抓点数据,比如商品价格、新闻标题或者天气信息,手动复制太费劲。这时候写个爬虫就省事多了。虽然现在很多人用Python写爬虫,但如果你已经熟悉Perl,完全可以用它来搞定。
Perl在文本处理方面一直很强大,加上丰富的模块支持,写个简单的网页抓取脚本非常顺手。下面直接上实战例子,让你看得明白,改得轻松。
先装两个关键模块
写Perl爬虫,最常用的组合是 LWP::UserAgent 和 HTML::TreeBuilder。前者负责发请求,后者用来解析HTML结构。
打开终端,运行下面命令安装:
cpan LWP::UserAgent
cpan HTML::TreeBuilder如果系统里没配好CPAN环境,也可以用 cpanm 更快一些:
cpanm LWP::UserAgent HTML::TreeBuilder抓一个网页试试看
假设我们要抓取某个博客首页的文章标题。先用 LWP::UserAgent 拿到页面内容:
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('https://example.com/blog');
if ($response->is_success) {
my $html_content = $response->decoded_content;
print $html_content;
} else {
die $response->status_line;
}这段代码模拟浏览器访问页面,设置了超时和User-Agent,避免被当成机器人直接拦截。
提取你需要的数据
光拿到HTML还不够,得把想要的内容抠出来。比如文章标题都在 <h2 class="title"></h2> 里面,就可以用 HTML::TreeBuilder 来解析:
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_content($html_content);
for my $node ($tree->look_down('_tag' => 'h2', 'class' => 'title')) {
my $text = $node->as_text;
print "[标题] $text\n";
}
$tree->delete; # 清理内存这样就能一条条打印出所有匹配的标题。你还可以顺着DOM结构往深了找,比如父节点、子节点,或者根据链接、属性进一步筛选。
加点容错和保存功能更实用
实际用的时候,网络可能不稳定,目标网站也可能改结构。可以在关键步骤加判断,比如检查元素是否存在,再决定是否输出。
数据抓下来后,存成文件也方便后续处理:
open my $fh, '>', 'titles.txt' or die $!;
for my $node (...) {
my $text = $node->as_text;
print $fh "$text\n";
}
close $fh;这样一来,每次运行完就生成一个文本文件,可以直接导入Excel或者其他工具分析。
别忘了遵守规则
爬虫能省时间,但也得讲规矩。最好看看目标网站有没有 /robots.txt,别频繁请求,间隔几秒再抓一次更稳妥。不然IP被封了就得不偿失。
一个小技巧:在代码里加个 sleep(2),让每次请求之间停两秒,对服务器友好,自己也安心。