Perl 网页抓取

use*_*957 0 perl www-mechanize web-scraping

我是 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>   &#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";
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 5

这些要点应该有帮助

  • 总是 use warnings一样use strict

  • 始终使用的三个参数的形式open,测试的成功,每一个 open电话,并与包括内建变量的字符串死$!,让你知道为什么打开失败

  • 永远不要使用正则表达式来解析 HTML。有几个模块HTML::TreeBuilder::XPath可以正确完成工作并允许使用XPath

  • 始终确保提取此类数据符合相关站点的服务条款。

关于最后一点,大多数站点禁止以任何形式自动访问和复制其数据。Yell.com 也不例外。他们的使用条件说明了这一点。

您不能使用该网站......使用任何自动化手段来监控或复制该网站或其内容......

因此,您正在做的事情使您有可能受到法律起诉。