本教程是一个简单的perl爬虫例子,使用正则表达式来抓取网页的内容(主要是为了练习练习正则,真的爬虫都不用正则而是使用DOM).
本教程的测试网站为(/weather/101020100.shtml)目的是抓取网站上如下表中的天气信息。
最后的结果为
使用到的工具(firefox浏览器,firebug插件,perl)
教程开始
1:观察网页结构
1.1 我们使用firebug发现我们想要抓取的表格的HTML代码结构为
1.2 我们看到我们要的表格放在3个class=”yuBaoTable”的<table>标签中,所以我们用一个正则将我们要的3段<table>存到一个一个数组中。
(这里我们用perl来做)$start = '<table class="yuBaoTable" ';
$end = '</table>';
my @find_all = ($re =~ /$start(.*?)$end/gs);
1.3 进入每段<table>我们又发现每天的白天和黑夜是放在两个<tr>标签里的
1.4 所以我们又用一个正则将两个<tr>中的代码存到一个数组
my @find_day = (/<tr>(.*?)<\/tr>/gs);
1.5 现在我们得到的就是我们需要抓取的最小单位了(每个白天/晚上的天气情况),接着用一堆正则将我们要的信息捕获出来即可
foreach my $re1(@find_day){
if($re1 =~ />(\d{1,2}日星期.*?)<\/a>/s){
print "$1\n";
}
if($re1 =~ /(白天|夜间)/s){
printf "%8s:",$1;
}
if($re1 =~ /(晴|多云|阴|小雨|中雨|小到中雨|阵雨)/s){
printf "%5s ",$1;
} #30
if($re1 =~ /(高温|低温).*?\<strong>(.*?)<\/strong>/s){
printf "%8s:%5s",$1,$2 ;
}
if($re1 =~ /(西北风|北风|东北方|东风|东南风|南风|西南风|西风)/s){
printf "%8s:",$1;
}
if($re1 =~ />.*?(\d-\d级).*?<\/a>/s){
printf "%6s\n",$1;
}
}
抓取结束。
贴上完整代码(perl版)
use strict;
use warnings;
use Encode; ##添加处理中文的模块
use LWP::UserAgent; ##perl中用来处理网页请求的模块
my $ua = LWP::UserAgent->new();
$ua->timeout(10);
my $r = $ua->get('/weather/101020100.shtml');
if ($r->is_success){
my $re = encode("gb2312",$r->decoded_content); ##用于处理中文乱码
my $start = '<div class="weatherYubaoBox">';
my $end = '</div>';
if($re =~ /($start.*?$end)/s){
$re = $1;
}
$start = '<table class="yuBaoTable" ';
$end = '</table>';
my @find_all = ($re =~ /$start(.*?)$end/gs); ##将每天的天气信息存在一个数组中foreach (@find_all){
my @find_day = (/<tr>(.*?)<\/tr>/gs); ##将同一天的白天和晚上的信息存在一个数组中
foreach my $re1(@find_day){
if($re1 =~ />(\d{1,2}日星期.*?)<\/a>/s){
print "$1\n";
}
if($re1 =~ /(白天|夜间)/s){
printf "%8s:",$1;
}
if($re1 =~ /(晴|多云|阴|小雨|中雨|小到中雨|阵雨)/s){
printf "%5s ",$1;
} #30
if($re1 =~ /(高温|低温).*?\<strong>(.*?)<\/strong>/s){
printf "%8s:%5s",$1,$2 ;
}
if($re1 =~ /(西北风|北风|东北方|东风|东南风|南风|西南风|西风)/s){
printf "%8s:",$1;
}
if($re1 =~ />.*?(\d-\d级).*?<\/a>/s){
printf "%6s\n",$1;
}
}
}
}。