用Perl查询网站LWP ::简单来处理网上价格

问题描述:

在我的空闲时间,我一直在尝试通过使用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.*.com/amzn/click/B00475B0G2", 
    "Code Complete" => "http://rads.*.com/amzn/click/0735619670", 
    "Intermediate Perl" => "http://rads.*.com/amzn/click/0596102062", 
    "Inglorious Basterds (2-Disc)" => "http://rads.*.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); 

我做了一个简单的脚本来演示亚马逊搜索自动化。所有部门的搜索网址已随着转义搜索字词而更改。剩下的代码是用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

是的,设计可以改进。这也可能是最好的,删除一切,与现有的全功能的网页抓取应用或框架重新开始,但因为你想了解:

  1. 的名字到地址映射为configuration data。从程序外部检索它。
  2. 将历史数据存储在database中。
  3. 学习XPath和use it to extract data from HTML,如果您已经熟练使用CSS选择器,那很容易。

其他堆垛机,如果你想修改我的职务与每件建议的理由,继续编辑。