Perl脚本,网页搜罗

siotufzp  于 2023-03-03  发布在  Perl
关注(0)|答案(2)|浏览(174)

我有这个脚本,刮亚马逊网站的评论。每次我运行它,我得到一个关于编译错误的错误。我想知道是否有人可以透露一些光,因为它有什么问题。

#!/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 = ('&quot;'=>'"', '&amp;'=>'&', '&nbsp;'=>' ');
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";
}
pod7payv

pod7payv1#

语法错误似乎是由代码中出现两次的“[RETURN]”引起的。当我删除这些错误时,代码编译没有问题。
亚马逊不喜欢人们抓取他们的网站。这就是为什么他们提供了一个API,让你访问他们的内容。有一个Perl模块使用该API -Net::Amazon。你应该使用它,而不是脆弱的网页抓取技术。

hgc7kmma

hgc7kmma2#

也许你应该试试Web::Scraper(http://metacpan.org/pod/Web::Scraper)。它会以一种干净得多的方式完成工作。
[EDIT]无论如何,我检查了一个随机评论的HTML代码,发现你的模式已经过时了。例如,评论者的名字是由'By'而不是'Reviewer'引入的。

相关问题