2013-10-24 2 views
-1

나는 Perl 언어에 익숙하지 않고 리뷰를 위해 아마존 웹 사이트를 긁는이 스크립트를 가지고있다. 컴파일 할 때마다 오류가 발생합니다. 누군가가 그걸로 무엇이 잘못되었는지 밝힐 수 있는지 궁금 해서요.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 = ('&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 행의 명시 적 패키지 이름이 필요합니다."36 행의 구문 오류 " – user2916250

+0

글로벌 기호 오류는 변수가 올바르게 선언되지 않았지만 구문 오류가 발생하지 않습니다. – user2916250

답변

0

아마 당신은 웹 :: 스크레이퍼 (http://metacpan.org/pod/Web::Scraper)를 시도해야합니다. 작업이 훨씬 깔끔하게 완료됩니다.

[EDIT] 어쨌든 임의 리뷰의 HTML 코드를 검사했는데 패턴이 오래되었습니다. 예를 들어 검토 자의 이름은 '검토 자'가 아닌 '작성자'에 의해 소개됩니다.

+1

Web :: 스크래핑은 수동 정규 표현식에서 확실히 개선되었지만 여전히 웹 스크래핑입니다. 아마존의 API를 사용하는 것이 가장 좋은 해결책입니다. –

+1

API에 대해 알지 못했습니다.이 특정 작업을 위해서는 확실히 최상의 솔루션입니다. API를 사용할 수없는 경우 웹 스크래핑 모듈을 고려해야합니다. 빨강 ... – Pierre

3

구문 오류는 코드에서 두 번 나타나는 "[RETURN]"으로 인한 것 같습니다. 코드를 제거하면 코드가 문제없이 컴파일됩니다.

아마존은 웹 사이트를 고수하는 사람들을 정말로 좋아하지 않습니다. 그렇기 때문에 콘텐츠에 대한 액세스 권한을 제공하는 API를 제공합니다. 그리고 그 API를 사용하기위한 Perl 모듈이 있습니다 - Net::Amazon. 깨지기 쉬운 웹 스크래핑 기술 대신에 이것을 사용해야합니다.

+0

흠 나는 아마존이 고객 리뷰를 위해 API를 제거했다고 생각 했습니까? 이게 바뀌 었습니까? 정보를 제공해 주셔서 감사합니다. – user2916250

+0

API (https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html)에 대한이 페이지는 "Product Advertising API는 제품 검색 및 조회 기능을 사용하여 Amazon 제품을 광고하는 데 도움이됩니다. ** 고객 리뷰 **, 유사 제품, 위시리스트 및 신규 및 중고 목록과 같은 제품 정보 및 기능 " –