3

暇なときは、LWP :: Simpleを使用して特定のWebサイトの製品ページをポーリングして製品の価格をチェックするスクリプトを作成することで、Perlの能力を向上させようとしています(私はPerlの初心者です)。このスクリプトは、そのアイテムで最後に表示された価格の非常に単純なバックログも保持します(価格は頻繁に変更されるため)。

スクリプトをさらに自動化して、ページのURLを最初のハッシュに明示的に追加する必要がないようにする方法があるかどうか疑問に思いました(つまり、キーワードの配列を保持し、Amazonで検索クエリを実行してページを見つけるか、価格?)。とにかく、Amazonの検索URLをコピーしてキーワードを解析するだけでなく、これを実行できる方法はありますか?(正規表現を使用したHTMLの処理は一般的に悪い形式であることを認識しています。必要なデータは1つだけなので、これを使用しました)。


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

my %oldPrice;
my %nameURL = (
    "Archer Season 1" => "http://www.amazon.com/Archer-Season-H-Jon-Benjamin/dp/B00475B0G2/ref=sr_1_1?ie=UTF8&qid=1297282236&sr=8-1",
    "Code Complete" => "http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_1?ie=UTF8&qid=1296841986&sr=8-1",
    "Intermediate Perl" => "http://www.amazon.com/Intermediate-Perl-Randal-L-Schwartz/dp/0596102062/ref=sr_1_1?s=books&ie=UTF8&qid=1297283720&sr=1-1",
    "Inglorious Basterds (2-Disc)" => "http://www.amazon.com/Inglourious-Basterds-Two-Disc-Special-Brad/dp/B002T9H2LK/ref=sr_1_3?ie=UTF8&qid=1297283816&sr=8-3"
);

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);
4

2 に答える 2

3

はい、デザインを改善することができます。すべてを削除して、既存のフル機能のWebスクレイピングアプリケーションまたはフレームワークからやり直すのがおそらく最善ですが、学習したいので:

  1. 名前からURLへのマップは構成データです。プログラムの外部から取得します。
  2. 履歴データをデータベースに保存します。
  3. XPathを学び、それを使用してHTMLからデータを抽出します。すでに、CSSセレクターを使用している場合は簡単です。

他のスタッカー、アドバイスの各部分の論理的根拠で私の投稿を修正したい場合は、先に進んでそれを編集してください。

于 2011-02-18T17:44:38.980 に答える
2

Amazon検索の自動化を実証するための簡単なスクリプトを作成しました。すべての部門の検索URLが、エスケープされた検索語で変更されました。残りのコードは、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;
于 2011-02-18T17:37:36.240 に答える