免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19868 | 回复: 81
打印 上一主题 下一主题

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

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-31 16:42 |只看该作者 |倒序浏览
目前跟一骚年@grshrd49在研究整站爬虫。列出一些需求,准备倒腾一下。
看看有木有志同道合的骚年一块研究研究。
需求如下:
1.取出页面中的URL
2.对比目标URL排除不符合目标的URL
3.对URL进行排序

这三个是完成了,貌似这爬虫很弱。。。

目前还需要做以下需求加强:
1.抓取二级目标
2.找到停止的方法。


在这请教下几个大神,指导下。。。@zhlong8 @mcshell @iakuf
谢谢啦

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
2 [报告]
发表于 2013-05-31 17:59 |只看该作者
{:3_186:}{:3_186:}{:3_186:}
让其他大神看看。。

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


    貌似云总那代码能解决问题。。我去好好看看!

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
4 [报告]
发表于 2013-06-01 09:05 |只看该作者
本帖最后由 iakuf 于 2013-06-01 09:06 编辑

回复 1# 墨迹哥
我在被你们上次华丽的忽略的这个程序上改进了下,可以达到你们的要求。其中 $dept_level 是用来控制抓的深度,24 行的正则是用于控制只抓指定的域名。层次达到,并没新的 url 的时候,就会自动退出。

  1. #!/usr/bin/perl
  2. use strict;
  3. use Mojo::UserAgent;
  4. use Bloom::Filter;
  5. use Smart::Comments;

  6. my $dept_level = 2;
  7. my $filter = Bloom::Filter->new(capacity => 100000, error_rate => 0.0001);
  8. my $ua = Mojo::UserAgent->new;

  9. my $delay = Mojo::IOLoop->delay;
  10. my $end = $delay->begin(0);

  11. my $callback;$callback = sub  {
  12.     my ($ua, $tx) = @_;
  13.     returnif !$tx->success;

  14.     my $dept = $tx->req->headers->header('dept');
  15.     return if $dept > $dept_level;
  16.     ++$dept;
  17.     $tx->res->dom->find("a[href]")->each(sub{
  18.             my $attrs  = shift->attrs;
  19.             my $newUrl = $attrs->{href};
  20.             next if $newUrl !~ /php-oa.com/;
  21.             if( !$filter->check($newUrl) ) {
  22.                 print $filter->key_count(), " $dept ", $newUrl, "\n";
  23.                 $filter->add($newUrl);
  24.                 $ua->get($newUrl => { dept => $dept } => $callback);
  25.             }   
  26.     });
  27.     $end->();
  28. };

  29. $ua->get($ARGV[0] =>   { dept => 1} => $callback);

  30. Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-06-01 12:49 |只看该作者
ls的代码简单测试下,感觉至少有两个大问题:
1. 没有解决相对路径的问题,尤其在不同host抓取时,相对路径尤其要处理正确——另外Mojo::UA->get会因为错误的url挂住比较长时间。
2. 没有控制并发请求的数量,大站的url往往非常多,几百个都算少的,不加控制的同时get几百个url,Mojo::UA不能正常处理的。

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
6 [报告]
发表于 2013-06-01 16:09 |只看该作者
$newUrl => { dept => $dept } => $callback 这是什么语法

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
7 [报告]
发表于 2013-06-01 17:43 |只看该作者
本帖最后由 iakuf 于 2013-06-01 21:45 编辑

回复 5# dugu072

路径全不全这个加一行很容易解决,可能还有其它 bug 这个不是重点,这只是个例子。要控制并发,超时,重定向。。。还有其它很多功能之类其它,请看看 Mojo::UserAgent 的 pod,你讲的东西看看他的参数 max_connections,默认为 5 个并发保持的连接。
   

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
8 [报告]
发表于 2013-06-01 21:29 |只看该作者
回复 6# yakczh_cu

这只是 Mojo::UserAgent 的语法,第一个参数是请求的 url ,第二个参数是请求发送的 Header,最后一个参数是请求发送完的响应产生的回调。

   

论坛徽章:
0
9 [报告]
发表于 2013-06-01 22:29 |只看该作者
回复 7# iakuf


    本来也只是提醒大家这个代码不能直接使用,有一些问题。
    另外 max-connections 只是与 http 的keep alive机制相关,与这里的并发请求无关的,因此如果爬一个页面有几百个URL,Mojo::Reactor一下子监控几百个IO,基本就挂死了(实测:本机用的Mojo::Reactor:oll,没装EV),完全不能正常工作的。
    Mojo确实很棒,实用及其灵活,但也因为灵活,导致有好些使用上的注意点,这里只是给提醒下大家~

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
10 [报告]
发表于 2013-06-01 23:38 |只看该作者
iakuf 发表于 2013-06-01 21:29
回复 6# yakczh_cu

这只是 Mojo::UserAgent 的语法,第一个参数是请求的 url ,第二个参数是请求发送的 ...


通过perl的什么语法实现的?  hashref?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP