我是Perl语言的新手,并且有这个脚本可以抓取亚马逊网站的评论。每次我运行它时都会收到有关编译错误的错误。想知道是否有人可以解释它是否有错误。
#!/usr/bin/perl
# get_reviews.pl
#
# A script to scrape Amazon, retrieve reviews, and write to a file
# Usage: perl get_reviews.pl <asin>
use strict;
use warnings;
use LWP::Simple;
# Take the asin from the command-line
my $asin = shift @ARGV or die "Usage: perl get_reviews.pl <asin>\n";
# Assemble the URL from the passed asin.
my $url = "http://amazon.com/o/tg/detail/-/$asin/?vi=customer-reviews";
# Set up unescape-HTML rules. Quicker than URI::Escape.
my %unescape = ('"'=>'"', '&'=>'&', ' '=>' ');
my $unescape_re = join '|' => keys %unescape;
# Request the URL.
my $content = get($url);
die "Could not retrieve $url" unless $content;
#Remove everything before the reviews
$content =~ s!.*?Number of Reviews:!!ms;
# Loop through the HTML looking for matches
while ($content =~ m!<img.*?stars-(\d)-0.gif.*?>.*?<b>(.*?)</b>, (.*?)[RETURN]
\n.*?Reviewer:\n<b>\n(.*?)</b>.*?</table>\n(.*?)<br>\n<br>!mgis) {
my($rating,$title,$date,$reviewer,$review) = [RETURN]
($1||'',$2||'',$3||'',$4||'',$5||'');
$reviewer =~ s!<.+?>!!g; # drop all HTML tags
$reviewer =~ s!\(.+?\)!!g; # remove anything in parenthesis
$reviewer =~ s!\n!!g; # remove newlines
$review =~ s!<.+?>!!g; # drop all HTML tags
$review =~ s/($unescape_re)/$unescape{$1}/migs; # unescape.
# Print the results
print "$title\n" . "$date\n" . "by $reviewer\n" .
"$rating stars.\n\n" . "$review\n\n";
}
答案 0 :(得分:3)
语法错误似乎是由代码中出现两次的“[RETURN]”引起的。当我删除它们时,代码编译没有问题。
亚马逊并不喜欢人们刮取他们的网站。这就是为什么他们提供了一个API,让您可以访问他们的内容。还有一个用于使用该API的Perl模块 - Net::Amazon。您应该使用它而不是脆弱的网络抓取技术。
答案 1 :(得分:0)
也许你应该试试Web :: Scraper(http://metacpan.org/pod/Web::Scraper)。 它将以更清洁的方式完成工作。
[编辑]无论如何,我检查了随机评论的HTML代码,看来你的模式已经过时了。例如,评论者的名字由&#39; By&#39;而不是评论员&#39;。