我是Perl初学者,我对使用Perl进行网页抓取充满热情。花了几个小时后,我编写了以下代码,用于从yell.com
抓取公司名称,地址和电话号码。该脚本工作正常,我成功收集了一条记录(第1页的1/15)。
我需要您提出宝贵的建议,如何一次性完成第一页中的所有十家公司,以便我可以转到其他页面的数据。
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> , <span itemprop="postalCode">(.*?)<\/span> , <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";
答案 0 :(得分:4)
这些要点应该有所帮助
始终 use warnings
以及use strict
始终使用open
的三参数形式,测试每次 open
调用的成功与否包含内置变量$!
的字符串,以便您知道为什么打开失败
从不使用正则表达式来解析HTML。有几个模块,例如HTML::TreeBuilder::XPath
,可以正常完成工作,并允许使用XPath
始终确保提取此类数据属于相关网站的服务条款。
关于最后一点,大多数网站禁止任何形式的自动访问和复制其数据。 Yell.com也不例外。他们conditions of use说这个。
您无法使用网站...使用任何自动方式来监控或复制网站或其内容......
所以你所做的事情让你有可能受到法律起诉。