perl简单爬虫教程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本教程是一个简单的perl爬虫例子,使用正则表达式来抓取网页的内容(主要是为了练习练习正则,真的爬虫都不用正则而是使用DOM).

本教程的测试网站为(/weather/101020100.shtml)目的是抓取网站上如下表中的天气信息。

最后的结果为

使用到的工具(firefox浏览器,firebug插件,perl)

教程开始

1:观察网页结构

1.1 我们使用firebug发现我们想要抓取的表格的HTML代码结构为

1.2 我们看到我们要的表格放在3个class=”yuBaoTable”的

标签中,所以我们用一个正则将我们要的3段
存到一个一个数组中。(这里我们用perl来做)$start = '

$end = '

';

my @find_all = ($re =~ /$start(.*?)$end/gs);

1.3 进入每段

我们又发现每天的白天和黑夜是放在两个标签里的

1.4 所以我们又用一个正则将两个

中的代码存到一个数组

my @find_day = (/

(.*?)<\/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>/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 = '

';

my $end = '

';

if($re =~ /($start.*?$end)/s){

$re = $1;

}

$start = '

$end = '

';

my @find_all = ($re =~ /$start(.*?)$end/gs); ##将每天的天气信息存在一个数组中foreach (@find_all){

my @find_day = (/(.*?)<\/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>/s){

printf "%8s:%5s",$1,$2 ;

}

if($re1 =~ /(西北风|北风|东北方|东风|东南风|南风|西南风|西风)/s){

printf "%8s:",$1;

}

if($re1 =~ />.*?(\d-\d级).*?<\/a>/s){

printf "%6s\n",$1;

}

}

}

}