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> , <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";
答
这点应有助于
始终
use warnings
以及use strict
始终使用
open
三个参数的形式,测试每成功open
呼叫,并且与包括吨的字符串死他内置变量$!
,让你知道为什么的打开HTML解析失败决不使用正则表达式。有几个模块,如
HTML::TreeBuilder::XPath
该做的工作做好,让简单的访问数据的内容,使用XPath
始终确保提取这样的数据是有问题的网站的服务条款中。
关于最后一点,大多数网站禁止任何形式的自动访问和复制他们的数据。 Yell.com也不例外。他们的conditions of use这样说。
不能使用本网站...使用任何自动化的手段来监视或复制网站或它的内容...
所以,你在做什么,都会让你更法律起诉的可能性。
如果我粘贴页面的源代码,并问你同样的问题,将被罚款。我只是要求学习的目的,如何能够获得所有数据。它可以正常工作于第一名。 – user1586957
将尝试'HTML :: TreeBuilder作为:: XPath'。但是关于它的教程却很少。 – user1586957