perl写的网站爬虫

上一篇 / 下一篇  2013-06-18 18:22:03 / 个人分类:perl脚本

基本已经可以正常工作
爬小站在5分钟内
大站可能需要2天,这取决与网络条件。
比对算法嵌套了2层for循环因该还有可优化的余地

#!C:\Perl\bin\perl.exe
use strict;
use LWP::UserAgent;
use HTTP::Request::Common qw(GET);

my $rooturl = "http://www.hao123.com";
my $base_url = "hao123";
my @exclude = ();
#my @exclude = ("thread");#url排除

my @storeurl;
my @newurl;
my @findurl;
my @waitfindurl;
my $temp=0;

push @waitfindurl,$rooturl;
push @storeurl,$rooturl;

while($#waitfindurl>=0){
my $wfu = shift @waitfindurl;
#last if (@storeurl > 150);
print @storeurl ." ". @waitfindurl." $temp $wfu\n";
$temp++;
@findurl = ();
@findurl = &findpageurl($rooturl,$wfu,$base_url,\@exclude);
next unless ($findurl[0] =~ /http/i);#返回不时http就忽略
for my $fu (@findurl){
my $finded = 0;#如果是已知的url就舍弃
for my $su (@storeurl){
if($fu eq $su){
$finded++;
last;
}
}
next if($finded);
next unless ($fu =~ /http/i);#剔除非http的链接
push @storeurl,$fu;
if (!($fu =~ /.(jpg|png|exe|rar|zip|bmp|apk)$/i)){#不是规定结尾的连接不再深度查找
if ($fu =~ /$base_url/i){#是本站连接继续深度查找
push @newurl,$fu;
}
}

#open FF,">>url.txt";
#print FF "$fu\n";
#close FF;
#print @storeurl." ".@newurl." storeurl _ newurl \n";
}
push @waitfindurl,@newurl;
#shift @waitfindurl;
@newurl = ();#清空新找到的url列表
}

@storeurl = reverse sort {$a<=>$b} @storeurl;
open FF,">url-last.txt";
print FF "$_\n" for(@storeurl);
close FF;


#####################
#处理发现的链接
#####################
#my @item;
#for(@storeurl){
#if($_ =~ /item/i){
#push @item,$_ ;
#}
#}
#@item =  sort {$a<=>$b} @item;
#print "$_\n" for(@item);


###################################
#请求url从返回页面中获取有用的url
###################################
sub findpageurl{
my ($rooturl,$url,$base_url,$a) = @_;
my @exclude = @$a;
my $UA = LWP::UserAgent->new();
$UA->max_redirect(1);#控制重定向深度
my $req = HTTP::Request->new( GET => "$url" );
my $resp = $UA->request($req);
#$UA->timeout(10);
my @page;
my @hrefurl;
my @srcurl;
my $return_code;
my $tempurl;

#链接不是200返回错误代码
$return_code = $resp->code;
print "requset return code:$return_code\n";
return $return_code unless ($return_code == 200);
@page = split /\n/,$resp->content;

for(@page){
if(s/href="(.+?)"//g){
#print "$1\n";
$tempurl = $1;
$tempurl = $rooturl . $tempurl if($tempurl =~ /^\//);
next if (map {$tempurl=~/$_/i} @exclude);
substr($tempurl,-1) =~ s/\///;#移除url最后的 /
push @hrefurl,$tempurl;
}
push @srcurl,$1 if(/src="(.*?)"/g);
}
print "requset return url\n";
return @hrefurl;
}


TAG:

 

评分:0

我来说两句

日历

« 2024-05-16  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 79854
  • 日志数: 15
  • 建立时间: 2013-01-04
  • 更新时间: 2013-09-27

RSS订阅

Open Toolbar