免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 墨迹哥
打印 上一主题 下一主题

Perl爬虫,爬整站研究 [复制链接]

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
51 [报告]
发表于 2013-07-09 14:27 |只看该作者
我发现这个帖子烂产了。。。到最后都没有好的解决方案!

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
52 [报告]
发表于 2013-07-09 16:45 |只看该作者
本帖最后由 grshrd49 于 2013-07-09 16:49 编辑

试试这个,哈哈!测试用了2天!爬hao123用了基本2天...
$rooturl最后不要/结尾,$base_url这个可以确保不要爬到外面去
(jpg|png|exe|rar|zip|bmp|apk)$/i)这些结尾的连接就不再深度查找
控制了302页面重定向的深度
如果遇到实在无法理解的非法页面,加到@exclude = ();数组中发现了就不再请求
  1. #!C:\Perl\bin\perl.exe
  2. use strict;
  3. use LWP::UserAgent;
  4. use HTTP::Request::Common qw(GET);

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

  9. my @storeurl;
  10. my @newurl;
  11. my @findurl;
  12. my @waitfindurl;
  13. my $temp=0;

  14. push @waitfindurl,$rooturl;
  15. push @storeurl,$rooturl;

  16. while($#waitfindurl>=0){
  17.         my $wfu = shift @waitfindurl;
  18.         #last if (@storeurl > 150);
  19.         print @storeurl ." ". @waitfindurl." $temp $wfu\n";
  20.         $temp++;
  21.         @findurl = ();
  22.         @findurl = &findpageurl($rooturl,$wfu,$base_url,\@exclude);
  23.         next unless ($findurl[0] =~ /http/i);        #返回不时http就忽略
  24.        
  25.         for my $fu (@findurl){
  26.        
  27.                 my $finded = 0;                                #如果是已知的url就舍弃
  28.                 for my $su (@storeurl){
  29.                         if($fu eq $su){
  30.                                 $finded++;
  31.                                 last;
  32.                         }
  33.                 }
  34.                 next if($finded);
  35.                
  36.                 next unless ($fu =~ /http/i);                        #剔除非http的链接
  37.                 push @storeurl,$fu;
  38.                 if (!($fu =~ /.(jpg|png|exe|rar|zip|bmp|apk)$/i)){        #不是规定结尾的连接不再深度查找
  39.                         if ($fu =~ /$base_url/i){                                        #是本站连接继续深度查找
  40.                                 push @newurl,$fu;
  41.                         }
  42.                 }
  43.                
  44.                 #这里可以即时将找到的url写入文件
  45.                 #open FF,">>url.txt";
  46.                 #print FF "$fu\n";
  47.                 #close FF;
  48.                 #print @storeurl." ".@newurl." storeurl _ newurl \n";
  49.         }
  50.         push @waitfindurl,@newurl;
  51.         #shift @waitfindurl;
  52.         @newurl = ();#清空新找到的url列表
  53. }

  54. @storeurl = reverse sort {$a<=>$b} @storeurl;
  55. #这里是全部找到后一起写入文件
  56. open FF,">url-last.txt";
  57. print FF "$_\n" for(@storeurl);
  58. close FF;


  59. #####################
  60. #处理发现的链接
  61. #####################
  62. #my @item;
  63. #for(@storeurl){
  64. #        if($_ =~ /item/i){
  65. #                push @item,$_ ;
  66. #        }
  67. #}
  68. #@item =  sort {$a<=>$b} @item;
  69. #print "$_\n" for(@item);


  70. ###################################
  71. #请求url从返回页面中获取有用的url
  72. ###################################
  73. sub findpageurl{
  74.         my ($rooturl,$url,$base_url,$a) = @_;
  75.         my @exclude = @$a;
  76.         my $UA = LWP::UserAgent->new();
  77.         $UA->max_redirect(1);        #控制重定向深度
  78.         my $req = HTTP::Request->new( GET => "$url" );
  79.         my $resp = $UA->request($req);
  80.         #$UA->timeout(10);
  81.         my @page;
  82.         my @hrefurl;
  83.         my @srcurl;
  84.         my $return_code;
  85.         my $tempurl;

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

  91.         for(@page){
  92.                 if(s/href="(.+?)"//g){
  93.                         #print "$1\n";
  94.                         $tempurl = $1;
  95.                         $tempurl = $rooturl . $tempurl if($tempurl =~ /^\//);
  96.                         next if (map {$tempurl=~/$_/i} @exclude);
  97.                         substr($tempurl,-1) =~ s/\///;        #移除url最后的 /
  98.                         push @hrefurl,$tempurl;
  99.                 }
  100.                 push @srcurl,$1 if(/src="(.*?)"/g);
  101.         }
  102.         print "requset return url\n";
  103.         return @hrefurl;
  104. }
复制代码

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
53 [报告]
发表于 2013-07-09 16:55 |只看该作者
我发的帖子呢,这个是不是cu论坛的bug啊翻页发帖的第一帖就看不到了一定要再发一贴才能看到?
我已经不止一次遇到这问题了啊

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
54 [报告]
发表于 2013-07-09 18:02 |只看该作者
现在动态网站很多,象hao123这么好爬的网站不多.
很多链接都是藏在js里面的,尤其是一些视频游戏网站
一般的爬虫是找不全的.

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
55 [报告]
发表于 2013-07-09 20:18 |只看该作者
回复 54# laputa73


哪有一个工具可以一劳永逸的佑!?都不是按照自己的需求定制的嘛!你看qtp和lr这样强大的商业工具还不是万能的呢
我这个爬虫可以对一些企业的官网或者平台网站做功能性的功能性的回归测试, 特别是页面上的链接是否都是正确的. 结果还不错呢!嘿嘿

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
56 [报告]
发表于 2013-07-10 09:39 |只看该作者
回复 53# grshrd49


    我觉得CU好像只显示最新的一个评论。。。。
  
    你写这个通用爬虫?

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
57 [报告]
发表于 2013-07-10 09:40 |只看该作者
回复 54# laputa73


    额..我觉得把。JS的那些基本上都忽略就好。。。
  
    目的知识把URL爬下来,然后做一些处理而已啊。。。
  
     主要是1级二级三级的页面,不知道怎么实现抓。。

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
58 [报告]
发表于 2013-07-10 09:43 |只看该作者
回复 54# laputa73


    我主要有个问题想请教你的是,队列这个模块你有研究吗?。。

    我不太懂这个线程队列。。希望能指点下。

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
59 [报告]
发表于 2013-07-10 09:57 |只看该作者
本帖最后由 grshrd49 于 2013-07-10 09:58 编辑

回复 56# 墨迹哥


通不通用 哈哈!这个就不知道拉,反正一般的中小站基本通吃
大站的话要爬上一两天,特别是有论坛的这样的网站 ,我后面再考虑用多线程来加快爬行速度

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
60 [报告]
发表于 2013-07-10 10:01 |只看该作者
回复 59# grshrd49


    我测了下,挺稳定的。。还在看程序原理。。
  
    主要有一个好不理解!$base_url..
  
    还在看。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP