免费注册 查看新帖 |

Chinaunix

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

爬虫入库不知道为什么有问题? [复制链接]

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-17 18:20 |只看该作者 |倒序浏览
发出来请教下。。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use threads;
  5. use threads::shared;
  6. use Thread::Queue;
  7. use Thread::Semaphore;

  8. use URI::URL;
  9. use Web::Scraper;
  10. use Digest::MD5 qw(md5 md5_hex md5_base64);
  11. use DBI;


  12. my $max_threads = 15;
  13. my $base_url = $ARGV[0] || 'http://www.icylife.net';
  14. my $host = URI::URL->new($base_url)->host;

  15. my $queue = Thread::Queue->new( );

  16. my $semaphore = Thread::Semaphore->new( $max_threads );
  17. my $mutex = Thread::Semaphore->new( 1 );

  18. $queue->enqueue( $base_url );

  19. my $digest = md5_hex($base_url+rand(100000));
  20. print "数据库地址:$digest";

  21. my $dbh=DBI->connect("dbi:SQLite:dbname=./db/".$digest.".db","","",{RaiseError=>1,AutoCommit=>0});
  22. my $sql="create table url_data(id int primary key,url TEXT not null)";
  23. $dbh->do($sql);
  24. $dbh->do("insert into url_data(url)values('".$base_url."')");
  25. while( 1 )
  26. {
  27.         foreach ( threads->list(threads::joinable) )
  28.         {
  29.                 $_->join( );
  30.         }
  31.         my $item = $queue->pending();
  32.         if( $item == 0 )
  33.         {
  34.                 my $active = threads->list(threads::running);
  35.                 if( $active == 0 )
  36.                 {
  37.                         print "All done!\n";
  38.                         last;
  39.                 }
  40.                 else
  41.                 {
  42.                         sleep 1;
  43.                         next;
  44.                 }
  45.         }
  46.         $semaphore->down;
  47.         threads->create( \&ProcessUrl );
  48. }

  49. foreach ( threads->list() )
  50. {
  51.         $_->join( );
  52. }
  53. sub ProcessUrl
  54. {
  55.         my $scraper = scraper
  56.         {
  57.                 process '//a', 'links[]' => '@href';
  58.         };

  59.         my $res;
  60.         my $link;

  61.         while( my $url = $queue->dequeue_nb() )
  62.         {
  63.                 eval
  64.                 {
  65.                         $res = $scraper->scrape( URI->new($url) )->{'links'};
  66.                 };
  67.                 if( $@ )
  68.                 {
  69.                         warn "$@\n";
  70.                         next;
  71.                 }
  72.                 next if (! defined $res );
  73.                 foreach( @{$res} )
  74.                 {
  75.                         $link = $_->as_string;
  76.                         $link = URI::URL->new($link, $url);

  77.                         # not http and not https?
  78.                         next if( $link->scheme ne 'http' && $link->scheme ne 'https' );
  79.                         # another domain?
  80.                         next if( $link->host ne $host );

  81.                         $link = $link->abs->as_string;

  82.                         if( $link =~ /(.*?)#(.*)/ )
  83.                         {
  84.                                 $link = $1;
  85.                         }

  86.                         next if( $link =~ /.(jpg|png|bmp|mp3|wma|wmv|gz|zip|rar|iso|pdf)$/i );

  87.                         $mutex->down();
  88.                                                                 #$dbconn=$dbh->prepare("select * from url_data where url='".$link."'");
  89.                                                                 #$dbconn->excute();
  90.                                                                 #if($dbconn){
  91.                             print $link, "\n";
  92.                             $dbh->do("insert into url_data(url)values('".$link."')");
  93.                             if($dbh->err()){
  94.                                  exit(1);
  95.                              }
  96.                              $dbh->commit();
  97.                                   $queue->enqueue($link);
  98.                                                                 #}
  99.                         $mutex->up();
  100.                         undef $link;
  101.                 }
  102.                 undef $res;
  103.         }
  104.         undef $scraper;
  105.         $semaphore->up( );
  106. }

  107. $dbh->disconnect();
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-12-18 10:21 |只看该作者
这段爬虫代码几乎没有什么可取之处,错误的技术选择,糟糕的代码。。。
扶凯不是给你写了一个爬虫代码吗,你可以基于那个代码往下写

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


    好吧!。。

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


    我到现在还是没搞清爬虫的原理。。我尝试用PYTHON写的时候,我发现对爬虫的概念很混淆。

    且听我说下去:

        从上个月开始我就在纠结这个问题,到现在依然没有靠谱的答案。

        我希望爬取所有网页链接,要求不重复。将其保存到db里面。

        可是在爬虫理念上我完全不能明白,该怎么去做爬虫思维。看了好多教程都是教怎么获得网页上的链接。这个很轻松就能做到。

        但是重点是如何递归下去爬虫呢?这是一个很科学的问题。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-12-20 11:56 |只看该作者
本帖最后由 py 于 2013-12-20 11:57 编辑

这是软件设计的问题,和爬虫没关系,和具体技术也关系不大

不是所有的你想做的事都有教程,不是所有的时候都可以顺着前人的足迹走,不是所有的问题都能在论坛发帖解决。

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


    好把。。。我去自己琢磨下把。。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
7 [报告]
发表于 2013-12-20 17:51 |只看该作者
GOOD!恩,了解了!{:2_172:}
回复 5# py


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP