2013-10-24 2 views
-1

Я новичок в языке Perl и имею этот скрипт, который сбрасывает веб-сайт amazon для обзоров. Каждый раз, когда я запускаю его, я получаю сообщение об ошибке компиляции. Интересно, может ли кто-нибудь пролить свет на то, что с ним не так.Perl Script, Web Scraper

#!/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"; 

}

+2

Не могли бы вы больше узнать об ошибке? –

+0

В основном это говорит о том, что «Global Symbol» $ reviewer «требует явного имени пакета в строке C: \ User \ test.pl 25. Также ошибка синтаксиса рядом с» («on line 36. – user2916250

+0

» Я знаю, что глобальная ошибка символа связана с тем, что переменная не объявлена ​​должным образом, но я не получаю синтаксическую ошибку. – user2916250

ответ

0

Может быть, вы должны попробовать Web :: Скребок (http://metacpan.org/pod/Web::Scraper). Он будет выполнять работу намного более чистым способом.

[EDIT] Во всяком случае, я проверил код HTML случайного обзора и выяснилось, что ваш шаблон устарел. Имя рецензента, например, вводится «By», а не «Reviewer».

+1

Web :: Скребок - это определенное улучшение в ручных регулярных выражениях, но это все еще веб-скребок. Использование API Amazon - лучшее решение здесь. –

+1

Я не знал об API. Для этой конкретной задачи это, безусловно, лучшее решение. Когда API не доступен, модуль веб-лома должен быть рассмотрен красный ... – Pierre

3

Ошибки синтаксиса, по-видимому, вызваны «[RETURN]», который дважды появляется в вашем коде. Когда я удалил их, код был скомпилирован без проблем.

Amazon не очень нравится, как люди соскабливают свой веб-сайт. Именно поэтому они предоставляют API, который дает вам доступ к их контенту. И есть модуль Perl, который для использования этого API - Net::Amazon. Вы должны использовать это вместо хрупких методов веб-скрепок.

+0

Хм, я думал, что Amazon избавился от своего API для отзывов клиентов? Это изменилось? и спасибо за информацию! – user2916250

+0

На этой странице об их API (https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html) говорится: «API рекламы продукта помогает рекламировать продукты Amazon, используя поиск товаров и возможности поиска, информация о продукте и функции, такие как ** Отзывы клиентов **, Похожие продукты, Списки пожеланий и новые и использованные списки " –

Смежные вопросы