2011-02-18 28 views
3

在我的空閒時間,我一直在嘗試通過使用LWP :: Simple腳本來改進我的perl功能來輪詢一個特定網站的產品頁面檢查產品的價格(我有點perl noob)。該腳本還保留了該項目的最後價格的非常簡單積壓(因爲價格頻繁變化)。用Perl查詢網站LWP ::簡單來處理網上價格

我想知道是否有任何方法可以進一步自動化腳本,這樣我就不必顯式地將頁面的URL添加到最初的散列(即保留一個關鍵術語數組並執行搜索查詢亞馬遜找到頁面或價格?)。無論如何,我可以做到這一點,不涉及我只是複製亞馬遜的搜索網址和解析我的關鍵字? (我知道用正則表達式處理HTML通常是不好的形式,我只是用它,因爲我只需要一小塊數據)。


#!usr/bin/perl 
use strict; 
use warnings; 
use LWP::Simple; 

my %oldPrice; 
my %nameURL = (
    "Archer Season 1" => "http://rads.stackoverflow.com/amzn/click/B00475B0G2", 
    "Code Complete" => "http://rads.stackoverflow.com/amzn/click/0735619670", 
    "Intermediate Perl" => "http://rads.stackoverflow.com/amzn/click/0596102062", 
    "Inglorious Basterds (2-Disc)" => "http://rads.stackoverflow.com/amzn/click/B002T9H2LK" 
); 

if (-e "backlog.txt"){ 
    open (LOG, "backlog.txt"); 
    while(){ 
     chomp; 
     my @temp = split(/:\s/); 
     $oldPrice{$temp[0]} = $temp[1]; 
    } 
close(LOG); 
} 

print "\nChecking Daily Amazon Prices:\n"; 
open(LOG, ">backlog.txt"); 
foreach my $key (sort keys %nameURL){ 
    my $content = get $nameURL{$key} or die; 
    $content =~ m{\s*\$(\d+.\d+)} || die; 
    if (exists $oldPrice{$key} && $oldPrice{$key} != $1){ 
     print "$key: \$$1 (Was $oldPrice{$key})\n"; 
    } 
    else{ 
    print "\n$key: $1\n"; 
    } 
    print LOG "$key: $1\n"; 
} 
close(LOG); 

回答

2

我做了一個簡單的腳本來演示亞馬遜搜索自動化。所有部門的搜索網址已隨着轉義搜索字詞而更改。剩下的代碼是用HTML::TreeBuilder進行簡單解析。有關HTML的結構可以用dump方法輕鬆檢查(請參閱註釋行)。

use strict; use warnings; 

use LWP::Simple; 
use URI::Escape; 
use HTML::TreeBuilder; 
use Try::Tiny; 

my $look_for = "Archer Season 1"; 

my $contents 
    = get "http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=" 
     . uri_escape($look_for); 

my $html = HTML::TreeBuilder->new_from_content($contents); 
for my $item ($html->look_down(id => qr/result_\d+/)) { 
    # $item->dump;  # find out structure of HTML 
    my $title = try { $item->look_down(class => 'productTitle')->as_trimmed_text }; 
    my $price = try { $item->look_down(class => 'newPrice')->find('span')->as_text }; 

    print "$title\n$price\n\n"; 
} 
$html->delete; 
+0

謝謝,我會研究HTML :: TreeBuilder進行解析。我很好奇你對URI_Escape的使用,因爲我不完全熟悉它。使用URI Escape有什麼好處,而不僅僅是將搜索詞加入到一起並添加到關鍵字中? – Cooper 2011-02-18 17:42:01

+1

@Bob如果您的搜索字詞包含一些URL不友好的字符(&符號,問號等),則純連接會產生無效的URL。 – bvr 2011-02-18 17:53:18

3

是的,設計可以改進。這也可能是最好的,刪除一切,與現有的全功能的網頁抓取應用或框架重新開始,但因爲你想了解:

  1. 的名字到地址映射爲configuration data。從程序外部檢索它。
  2. 將歷史數據存儲在database中。
  3. 學習XPath和use it to extract data from HTML,如果您已經熟練使用CSS選擇器,那很容易。

其他堆垛機,如果你想修改我的職務與每件建議的理由,繼續編輯。