読者です 読者をやめる 読者になる 読者になる

稲沢市よりお届けしてます。

Perlをはじめとしたプログラミング周りのあれこれについて。Perl界のモブキャラとして暗躍します(謎)。

【できた!】Perlで「アマゾンのゲーム売れ筋ランキングのゲームタイトルデータを引っこ抜きたーい」

こんにちは、Perl48です。


自分の拙いPerlスクリプトとの奮闘記ですが、
ブログにするといいもんですね。

会社でも休み時間にチェックできるので、
自分が何を考えていたがを忘れなくてすみます。


さて、あれから1週間。

遂に完成しました!


試行錯誤しているスクリプトを一週間寝かせてみるのもいいもんですね〜。
(ただ時間を作れずに、振り返ることができなかったのは内緒)

Perl言語が生まれたのは1987年。
Perlちゃんは今年で23歳なんですねー。

23年も生きていると、色んな人が色んなことを試していて
やっぱりいました!似たようなことをやってた方がっ!

駱駝の背中に乗って行こう

そして、
宮川達彦氏のCPANモジュール配布元
を熟読したら、だいぶ動かし方がわかりました。

「まずはドキュメントに当たれ」というアドバイスは金言だと感じました。


で、できたのがコレです↓


#!/usr/bin/perl -w

use lib 'C:/usr/cpan/build/Web-Scraper-0.32-VSDMOU/lib';

use Web::Scraper;
use URI;
use encoding qw(shiftjis);

# videogameRankと命名したscraperオブジェクトを作成
my $videogameRank = scraper {
# ゲームタイトル部分を gameTitles[] と命名した配列に格納
process "table.zg .productTitle", "gameTitles[]" => 'TEXT';
};

# amazon.co.jpのTVゲームベストセラーページのURLオブジェクトを対象に
# scrapeメソッドでスクレイピングを実行
my $res = $videogameRank -> scrape(URI -> new('http://www.amazon.co.jp/gp/bestsellers/videogames'));

# 配列gameTitles[]に格納されたスカラー値を順番に画面に表示
foreach my $gameTitle(@{$res->{gameTitles}}){
print "$gameTitle"."\n"; # 何が出るかな?
};

キ、キ・・・

キタ━━━━(゚∀゚)━━━━!!

動いたー!!


こんな拙いもんでも、動かせると感動しちゃったりします。

Perlありがたし。

                                                                                                                        • -

■簡単にポイントを説明[備忘録]
(【課題】や「理解できていない部分」は、解決出来しだい追記します)

Web::Scraperモジュール のインストール
しっかりとインストールする。

【課題→解決】モジュールのインストール先はppm任せにし、スクリプト内でインストールパスをわざわざ指定したが、他のモジュールが格納されている場所へのインストールのやり方は無いのか?もしくは移せないのか?

                                                                                              • -

【20100711追記】
PPMを使ったインストールで、Perlモジュールのインストール先を指定できました。

文字コードの宣言
use encoding qw(shiftjis)を宣言することで、文字化けを防いだ。

【課題】スクリプトを動かしてみて、文字化けしなかったからGO!みたいなノリで書いている。他のやり方はないのか?また、文字コードの扱いについての知識も増やすべきだ。

◎HTMLの引っこ抜きたい部分をピンポイントで指定
processの後に、"table.zg .productTitle"を指定。
今回は、元のアマゾンサイトHTMLソース内の


<table class="zg">
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
<div class="productTitle">ほしいゲームタイトル名</div>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
</table>
の文字列「ほしいゲームタイトル名」部分が欲しかったので、そこを指定。

【課題】今回は、HTMLソース内のほしい箇所が1箇所だったので、配列として抜き取ったが2箇所以上になった場合のプラクティスもすべき。たぶんリファレンスが必要になる。

◎理解できてない部分(1)


my $res = $videogameRank -> scrape(URI -> new('http://www.amazon.co.jp/gp/bestsellers/videogames'));
↑「こういうもんだ」で使えばよい気もするが・・・。

◎理解できてない部分(2)


foreach my $gameTitle(@{$res->{gameTitles}}){
↑ここは理解できてないといけない気がする。


リファレンスまわりが課題だなー。