AppStoreのレビューを取得するperlスクリプト
とある理由でAppStore上のユーザレビューを
大量に取得する必要があり、調べてたら、
で詳しい方法とPerlスクリプトが公開されてました。
でも、最近になってiTunes Storeの構造が変わったため、
そのままではうまく行かない。
現状に対応したやり方がなかなか見当たらなかったけど、
ちょっといじったら取得できるようになったのでメモっておきます。
(基本的には上記のページを参考に)
問題の原因は、今までレビューは圧縮された状態で提供されていたけど、
最近になってそれが無くなったこと。ただそれだけです。
だから、参考ページのスクリプトで、 gunzipしてる部分を消すだけです。
ついでに、参考ページのスクリプトだとレビュー本文の1行目しか取得できないので、HTML::TagParserを使って本文全体を取得できるように修正してみました。
(本文だけを綺麗に取ってくることはできたのですが、
タイトルや投稿者名だけを取り出すのはちょっと面倒だったので今回はパスしました)
書いたスクリプトを載せておきます。
(CPANでHTML::TagParserモジュールをインストールしておく必要があります)
実はperl触ったのこれが初めてなんで色々おかしいかもしれないですが…
ソースコード(getappreview.pl)
#! /usr/bin/perl # 引数に与えられたIDのアプリについてのレビュー(本文のみ)を # AppStoreから取得し、標準出力とファイルの両方に出力します。 use HTML::TagParser; #コマンドライン引数からアプリIDを取得 $appid=$ARGV[0]; if(!$appid && $appid eq "") { print "error: App ID was not specified in ARGV[0]\n"; exit(0); } $currentSoftware = $appid; getAllReviews(); sub getAllReviews() { #AppStoreでの国の設定(日本) $store = 143462; open(OUT,">review$currentSoftware.txt"); #ページ番号を変えながら、最大100件目までを取得する #(1ページ10件。ループの値を変えて最大値を変更します) for($i=0;$i<10;$i++){ fetchReviews($i); } close(OUT); } sub fetchReviews() { #ユーザエージェントを偽装してAppStoreから情報を取得 my $pageid = $_[0]; my $doit = qq{curl -s -A "iTunes/9.1.0.79" -H "X-Apple-Store-Front: $store-1" 'http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=$currentSoftware&pageNumber=$pageid&sortOrdering=4&type=Purple+Software' | xmllint --format -}; my $riz = `$doit`; #取得したXMLをHTML::TagParserによって解析し、本文のみを抽出する my $source = HTML::TagParser->new($riz); my @textViews = $source->getElementsByTagName("TextView"); foreach my $textView (@textViews) { if($textView->getAttribute("topInset") eq "2" and $textView->getAttribute("styleSet") eq "normal11") { print $textView->innerText; print OUT $textView->innerText; print "\n-----\n"; print OUT "\n-----\n"; } } }
実行方法
% perl getappreview.pl アプリID
実行すると review(アプリID).txtという名前のファイルに取得したレビューが出力されます。
アプリIDは、iTunesStoreでアプリを右クリックして、
「URLをコピー」して得られるURL中に記述されているものです。
例えば駅.LockyだとURLは
http://itunes.apple.com/jp/app/id335126084?mt=8
で、idは335126084になります。