Perl的网页抓取

问题描述:

我是一个Perl的初学者,我热爱的网络使用Perl刮。花了几个小时后,我写了下面从yell.com刮的公司名称,地址和电话号码的代码。该脚本工作正常,我成功收集了一条记录(从第1页1/15)。Perl的网页抓取

我需要你关于我怎样才能凑所有十家公司在第一页中一气呵成的宝贵建议,让我可以移动到其他页的数据。

use strict; 

use Data::Dumper; 
use LWP::Simple; # from CPAN 
use JSON qw(decode_json); # from CPAN 

use WWW::Mechanize; 

my $mech = WWW::Mechanize->new(); 

my $header = "company_name|Address|Telphone"; 

open (CH, ">output.csv"); 

print CH "$header\n"; 

my $url = "http://www.yell.com/ucs/UcsSearchAction.do?keywords=Engineering+consulatants&location=United+Kingdom&scrambleSeed=13724563&searchType=&M=&bandedclarifyResults=&ssm=1"; 

$mech->get($url); 
my $con = $mech->content(); 
my $res = ""; 

############ for company name ########## 
if ($con =~ /<a data-omniture="LIST:COMPANYNAME" href="\/biz\/ross-davy-associates-grimsby-901271213\/" itemprop="name">(.*?)<\/a>/is) { 
    $res = $1; 
} 
else { 
    $res = "Not_Match"; 
} 

############### for address ######### 
my ($add1, $add2, $add3, $add4, $add) = ("", "", "", "", ""); 

if ($con =~ /<span itemprop="streetAddress">(.*?)<\/span> <span itemprop="addressLocality">(.*?)<\/span> &#44; <span itemprop="postalCode">(.*?)<\/span> &#44; <span itemprop="addressRegion">(.*?)<\/span>/is) { 
    $add1 = $1; 
    $add2 = $2; 
    $add3 = $3; 
    $add4 = $4; 
    $add = $1.$2.$3.$$; 
} 
else { 
    $add = "Not_Match"; 
} 

########### telephone ########## 
my $tel=""; 

if ($con =~ /<li data-company-item="telephone" class="last"> Tel: <strong>(.*?)<\/strong> <\/li>/is) { 
    $tel = $1; 
} 
else { 
    $tel = "Not_Match"; 
} 

print "==$res===$add===$tel==\n"; 
print CH "$res|$add|$tel\n"; 

这点应有助于

  • 始终use warnings以及use strict

  • 始终使用open三个参数的形式,测试成功open呼叫,并且与包括吨的字符串死他内置变量$!,让你知道为什么打开HTML解析失败

  • 决不使用正则表达式。有几个模块,如HTML::TreeBuilder::XPath该做的工作做好,让简单的访问数据的内容,使用XPath

  • 始终确保提取这样的数据是有问题的网站的服务条款中。

关于最后一点,大多数网站禁止任何形式的自动访问和复制他们的数据。 Yell.com也不例外。他们的conditions of use这样说。

不能使用本网站...使用任何自动化的手段来监视或复制网站或它的内容...

所以,你在做什么,都会让你更法律起诉的可能性。

+0

如果我粘贴页面的源代码,并问你同样的问题,将被罚款。我只是要求学习的目的,如何能够获得所有数据。它可以正常工作于第一名。 – user1586957

+0

将尝试'HTML :: TreeBuilder作为:: XPath'。但是关于它的教程却很少。 – user1586957