首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl的Web爬虫程序

使用perl的Web爬虫程序
EN

Stack Overflow用户
提问于 2013-03-29 10:17:32
回答 1查看 10.2K关注 0票数 6

我想开发一个网络爬虫,它从一个种子网址开始,然后爬行100个html页面,它发现属于同一领域的种子网址,以及保持遍历网址的记录,以避免重复。我写了以下内容,但$url_count值似乎没有增加,检索到的URL甚至包含来自其他域的链接。我该如何解决这个问题?在这里,我插入了stackoverflow.com作为我的起始网址。

代码语言:javascript
复制
use strict;
use warnings;

use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;


##open file to store links
open my $file1,">>", ("extracted_links.txt");
select($file1); 

##starting URL
my @urls = 'http://stackoverflow.com/';

my $browser = LWP::UserAgent->new('IE 6');
$browser->timeout(10);
my %visited;
my $url_count = 0;


while (@urls) 
{
     my $url = shift @urls;
     if (exists $visited{$url}) ##check if URL already exists
     {
         next;
     }
     else
     {
         $url_count++;
     }         

     my $request = HTTP::Request->new(GET => $url);
     my $response = $browser->request($request);

     if ($response->is_error()) 
     {
         printf "%s\n", $response->status_line;
     }
     else
     {
         my $contents = $response->content();
         $visited{$url} = 1;
         @lines = split(/\n/,$contents);
         foreach $line(@lines)
         {
             $line =~ m@(((http\:\/\/)|(www\.))([a-z]|[A-Z]|[0-9]|[/.]|[~]|[-_]|[()])*[^'">])@g;
             print "$1\n";  
             push @urls, $$line[2];
         }

         sleep 60;

         if ($visited{$url} == 100)
         {
            last;
         }
    }
}

close $file1;
EN

回答 1

Stack Overflow用户

发布于 2013-03-29 11:35:43

有几点,你的URL解析是脆弱的,你肯定得不到相关链接。此外,你不需要测试100个链接,而是测试当前url的100个匹配项,这几乎肯定不是你想要的。最后,我不太熟悉LWP,所以我将使用Mojolicious工具套件展示一个示例。

这似乎是有效的,也许它会给你一些想法。

代码语言:javascript
复制
#!/usr/bin/env perl

use strict;
use warnings;

use Mojo::UserAgent;
use Mojo::URL;

##open file to store links
open my $log, '>', 'extracted_links.txt' or die $!;

##starting URL
my $base = Mojo::URL->new('http://stackoverflow.com/');
my @urls = $base;

my $ua = Mojo::UserAgent->new;
my %visited;
my $url_count = 0;

while (@urls) {
  my $url = shift @urls;
  next if exists $visited{$url};

  print "$url\n";
  print $log "$url\n";

  $visited{$url} = 1;
  $url_count++;         

  # find all <a> tags and act on each
  $ua->get($url)->res->dom('a')->each(sub{
    my $url = Mojo::URL->new($_->{href});
    if ( $url->is_abs ) {
      return unless $url->host eq $base->host;
    }
    push @urls, $url;
  });

  last if $url_count == 100;

  sleep 1;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15696375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档