免费注册 查看新帖 |

Chinaunix

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

[Coro+Anyevent]测试HTTP代理Demo [复制链接]

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-18 00:55 |只看该作者 |倒序浏览
之前常听PY说Coro+Anyevent会很牛X。。。然后晚上刚好被妹子放了鸽子,
心情略微郁闷了下,写了个DEMO让自己心情好起来。。


回头研究下怎么优化,改天把爬虫的DEMO也弄出来。
这个东西其实还有很多扩展的空间,例如BS算法加入、多进程等,大家都懂的。
随意扩展。。。
  1. #!perl
  2. use utf8;
  3. use AnyEvent;
  4. use AnyEvent::HTTP;
  5. use Data::Dumper;
  6. use Coro;

  7. my $calculate = new Coro::Channel;
  8. my $result = new Coro::Channel;


  9. # all proxy results
  10. our @proxy_results;

  11. # proxy page list
  12. my $url="http://proxy.com.ru/";

  13. my $cv = AnyEvent->condvar;
  14. eval {
  15.         # proxy page list
  16.         my $url="http://proxy.com.ru/";

  17.         $cv->begin;
  18.         http_get(
  19.                 $url,
  20.                 sub {
  21.                         my ( $content, $header, $hdr ) = @_;
  22.                         if ($content=~m/<a href='list_([0-9]{1,3}).html'>\[<b>(.*)<\/b>\]<\/a>/){
  23.                                 $tmp_result=$2;
  24.                                 @tmp_pages=split(/\[<b>/,$tmp_result);
  25.                                 # count page
  26.                                 $all_pages=$tmp_pages[-1];
  27.                                 ru_proxy($url,$all_pages,$content);
  28.                         }       
  29.                         $cv->end;
  30.                 }
  31.         );
  32. };
  33. if ($@) {
  34.         print "Error!\n";
  35. }
  36. $cv->recv();

  37. # ip picking up
  38. sub ru_proxy{
  39.         my ($url,$pages,$content) = @_;
  40.         foreach my $p (2..$pages){
  41.                 $cv->begin;
  42.                 http_get(
  43.                         $url."/list_".$p.".html",
  44.                         sub {
  45.                                 my ( $content, $header, $hdr ) = @_;
  46.                                 foreach my $line (split(/\n/,$content)){
  47.                                         if ( $line =~m/<td>([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})<\/td><td>([0-9]{1,5})<\/td>/){
  48.                                                 push(@proxy_results,"http://".$1.":".$2."/");
  49.                                         }
  50.                                 }
  51.                                 $cv->end;
  52.                         }
  53.                 );
  54.         }
  55.         foreach my $line (split(/\n/,$content)){
  56.                 if ( $line =~m/<td>([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})<\/td><td>([0-9]{1,5})<\/td>/){
  57.                         push(@proxy_results,"http://".$1.":".$2."/");
  58.                 }
  59.         }
  60. }

  61. # useing coro module
  62. async {
  63.         while (){
  64.                 my $task = $calculate->get;
  65.                 # testing proxy
  66.                 AnyEvent::HTTP::set_proxy $task;
  67.                 http_get(
  68.                         "http://bbs.chinaunix.net/forum.php",
  69.                         sub {
  70.                                 my ($content,$header)=@_;
  71.                                 if ( $content =~m/<title>(.*)<\/title>/){
  72.                                         $result->put("proxy:".$task."title:".$1."\n");
  73.                                 }
  74.                         }
  75.                 );
  76.         }
  77. };


  78. foreach my $t (@proxy_results){
  79.         $calculate->put($t);

  80.         print $result->get."\n";
  81. }
复制代码

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
2 [报告]
发表于 2014-08-18 11:16 |只看该作者
这些看了不说话的会怀孕。

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
3 [报告]
发表于 2014-08-18 11:52 |只看该作者
This is perl, v5.8.8 for win, 我的版本太老了,anyevent没法装上

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


    好吧,没有注意到老人的感受。。我有罪。。。。

    只是不太理解为毛PY不出来指点了。。。。。

    [@]py[/@]

论坛徽章:
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
5 [报告]
发表于 2014-08-18 13:59 |只看该作者
你要写个简单的程序注解,背景,目的,
分段描述或者注释
这么大段程序看起来很费劲的。

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


    # 号开头那些就是注释啊!没有任何目的,纯属娱乐。。。背景就是我不懂,然后现在懂了

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
7 [报告]
发表于 2014-08-20 21:22 |只看该作者
现在在改写程序,有些地方理解还是不够深入,需要去接着看看模块的说明。
  1. #!/usr/bin/perl
  2. use Coro;
  3. use AnyEvent::HTTP;
  4. use Data::Dumper;
  5. use encoding utf8;

  6. our $timeout=5;                # HTTP GET or POST time out set.

  7. our $proxy_tmp=new Coro::Channel;                # proxy tasks work.
  8. my @proxy_results;

  9. our $attack_task=new Coro::Channel;                # testing task work.
  10. our $testing_resuls=new Coro::Channel;        # testing task results

  11. # proxy work
  12. async {
  13.         eval {
  14.                 while () {
  15.                         # proxy url push in queue if proxy is alive.
  16.                         my $task=$proxy_tmp->get;
  17.                         AnyEvent::HTTP::set_proxy $task;
  18.                         http_get (
  19.                                 "http://bbs.chinaunix.net/forum.php",
  20.                                 timeout => $timeout,
  21.                                 sub {
  22.                                         my ($content,$header)=@_;
  23.                                         if ($content =~/ChinaUnix/){
  24.                                                 push(@proxy_results,$task);
  25.                                         }
  26.                                 }
  27.                         );

  28.                 }
  29.         };
  30.         if ( $@ ) {
  31.                 print "[*] proxy testing is Error!\n";
  32.         }
  33. };

  34. # testing alive work , if task is alive , Fuck up.
  35. async {
  36.         eval {
  37.                 while () {
  38.                         my $task = $attack_task->get;        # pick up for task
  39.                         if ( $task->{'proxy'} ==1 ) {
  40.                                 print "daili\n";
  41.                                 my $proxy = pop(@proxy_results);        # pick up for proxy
  42.                                 print "Start\n";
  43.                                 # set proxy
  44.                                 AnyEvent::HTTP::set_proxy $proxy;
  45.                                 # testing url
  46.                                 http_get(
  47.                                         $task->{'url'},
  48.                                         timeout => $timeout,
  49.                                         sub {
  50.                                                 my ( $content , $header )= @_;
  51.                                                 if ($header->{Status}==200){
  52.                                                         $item=200;
  53.                                                 }elsif ($header->{Status}==403){
  54.                                                         $item=403;
  55.                                                 }else{
  56.                                                         $item=$header->{Status};
  57.                                                 }
  58.                                         }
  59.                                 );
  60.                                 print "testing by proxy: ".$item."\n";
  61.                         }else{
  62.                                 print "testing by not proxy: ".$task->{'url'}."\n";
  63.                         }
  64.                 }
  65.         };
  66.         if ( $@ ) {
  67.                 print  Dumper \$@;
  68.         }
  69. };

  70. my %aa;
  71. $aa{'url'}="http://www.baidu.com";
  72. $aa{'proxy'}=1;
  73. # print Dumper %aa;
  74. $attack_task->put(\%aa);
  75. print "aLL;";

  76. cede;
复制代码

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
8 [报告]
发表于 2014-08-20 22:52 |只看该作者
想把爬虫改出来,貌似有难度。。先MARK下,改天继续改。。先陪妹子先。。
  1. #!/usr/bin/perl

  2. ########################
  3. #       
  4. #     task:  Spider
  5. #
  6. #
  7. ########################
  8. use URI::URL;
  9. use Data::Dumper;
  10. use Bloom::Filter;
  11. use Coro;
  12. use AnyEvent::HTTP;

  13. my @coro_list;
  14. my $base_url=$ARGV[0] || "http://blog.linuxeye.com/";
  15. my $calculate = new Coro::Channel;
  16. my $sem=new Coro::Semaphore 100;
  17. my $filter = Bloom::Filter->new(capacity => 5000000, error_rate => 0.001);
  18. my $host = URI::URL->new($base_url)->host;

  19. $calculate->put($base_url);
  20. $filter->add($base_url);


  21. while(1)
  22. {
  23.         foreach(@coro_list){
  24.                 $_->join;
  25.         }

  26.         my $item=$calculate->size;
  27.         if ($item==0){
  28.                 if ($sem->count==100){
  29.                         print "[*] Spider Finish!\n";
  30.                         last;
  31.                 }else{
  32.                         sleep 1;
  33.                         next;
  34.                 }
  35.         }

  36.         while($sem->down)
  37.         {
  38.                 push @coro_list,async {
  39.                         $url=$calculate->get;
  40.                         http_get $url, cb => Coro::rouse_cb;
  41.                         my @res = Coro::rouse_wait;
  42.                         print Dumper \@res;
  43.                 };
  44.         }


  45. }

  46. foreach(@coro_list){
  47.         $_->join;
  48. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2014-08-21 12:46 |只看该作者
本帖最后由 flw 于 2014-08-21 12:47 编辑
墨迹哥 发表于 2014-08-18 12:26
只是不太理解为毛PY不出来指点了。。。。。


我来告诉你为什么。
py
我早就看见他这帖子了,为了最大程度的帮助他,我就是不出声

py
老问问题是非常不好的事,对自己很不好。必须得有能力自己弄明白了,没有,就慢慢长上这个能力

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


    你们太坏了。。。幸亏我折腾出来了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP