どうも、ご無沙汰してます。
開発2部サーバー担当の山本です。
別の記事で別の山本さんがネタにしてましたが、メンバーが増えるにつれて「山本」が多くなり、同じフロアに4人もいます!
「山本」盛り上がってますね。
で、本題です。
今回はAppStoreのランキングをスクレイピングしてみたので紹介します。
経緯
AppStoreやGooglePlayのランキング情報を閲覧できるサービスは多々存在しますが、「ランクインしているタイトルの販売元の集計」や「ランクインしているタイトルのジャンルの集計」ができるサービスは知りません。(誰か知ってたら教えてください!)
企画の立ち上げやサービス運営において、トレンドや市場を客観的に分析することはとても重要で、「ランキングデータをローカルに持ってたら集計が楽だなー」、「システム化すれば誰でも簡単に見れるじゃん!」ということで作ってみました。
データソース
Appleの公式からRSSGeneratorというページが公開されています。
RSS Generator
このRSSGeneratorでは画面のプルダウンリストから以下のパラメータを設定できるようになっています。
- 国
- メディアタイプ
- フィードタイプ
- サイズ
- ジャンル
設定したパラメータに応じて、RSSフィードに出力されるURLからXMLフォーマットのデータを取得できます。
サンプルデータ(XML)
<feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3.org/2005/Atom" xml:lang="ja"> <id> https://itunes.apple.com/jp/rss/topgrossingapplications/limit=1/genre=6014/xml </id> <title>iTunes Store: トップセールス</title> <updated>2016-08-03T03:10:28-07:00</updated> <link rel="alternate" type="text/html" href="https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?cc=jp&id=25185&popId=38"/> <link rel="self" href="https://itunes.apple.com/jp/rss/topgrossingapplications/limit=1/genre=6014/xml"/> <icon>http://itunes.apple.com/favicon.ico</icon> <author> <name>iTunes Store</name> <uri>http://www.apple.com/jp/itunes/</uri> </author> <rights>Copyright 2008 Apple Inc.</rights> <entry> <updated>2016-08-03T03:10:28-07:00</updated> <id im:id="658511662" im:bundleId="jp.co.mixi.monsterstrike"> https://itunes.apple.com/jp/app/monsutasutoraiku/id658511662?mt=8&uo=2 </id> <title>モンスターストライク - mixi, Inc</title> <summary> ◆祝・利用者3500万人突破!/テレビCM絶賛放映中!◆ 最大4人同時に楽しめる「ひっぱりハンティングRPG!」 モンスターマスターになって様々な能力を持つモンスターをたくさん集めよう! 1000種類を超える個性豊かなモンスターが君を待ってるぞ! 【ゲーム紹介】 ▼ルールは簡単 モンスターを引っぱって敵に当てるだけ! 味方モンスターに当てると、友情コンボが発動! 一見攻撃力の弱いモンスターもコンボが発動すると、意外な力を発揮するかも?! ▼決めろストライクショット! バトルのターンが経過すると必殺技「ストライクショット」が使えるぞ! モンスターによって技は様々、君はすぐ使う派?ボスまで待つ派? 使うタイミングが生死を分ける!? ▼集めて育てて強くなれ! バトルやガチャでGetしたモンスターを合成して育てよう! 強く進化させるにはモンスター以外に進化素材が必要になるぞ。 強いモンスターを育てて君だけの最強チームを作ろう! ▼天空より舞い降りし、異界のモンスター! ボスがステージの最後に出るとは限らないぞ! どんな時も万全の態勢で戦いに挑むべし! ▼友達と一緒に、強敵を倒そう! 近くにいる友達と、最大4人まで同時プレイが可能! なんと1人分のスタミナでクエストに挑めるぞ! 1人では倒せない強敵も、みんなで力を合わせれば倒せるかも!? マルチプレイ専用のレアなクエストも盛りだくさん! レアモンスターを倒してゲットしよう! +++【価格】+++ アプリ本体:無料 ※一部有料アイテムがございます。 +++【推奨端末】+++ iOS 7.0 以降/iPhone 4s以降,iPod touch(第5世代以降),iPad2以降 ※推奨端末以外でのサポート、補償等は致しかねますので何卒ご了承くださいませ。 ご利用前に「アプリケーション使用許諾契約」に 表示されている利用規約を必ずご確認の上ご利用ください。 </summary> <im:name>モンスターストライク</im:name> <link rel="alternate" type="text/html" href="https://itunes.apple.com/jp/app/monsutasutoraiku/id658511662?mt=8&uo=2"/> <im:contentType term="Application" label="アプリケーション"/> <category im:id="6014" term="Games" scheme="https://itunes.apple.com/jp/genre/ios-gemu/id6014?mt=8&uo=2" label="ゲーム"/> <im:artist href="https://itunes.apple.com/jp/developer/mikushi-i/id285951869?mt=8&uo=2">mixi, Inc</im:artist> <im:price amount="0.00000" currency="JPY">入手</im:price> <im:image height="53"> http://is4.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/53x53bb-85.png </im:image> <im:image height="75"> http://is3.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/75x75bb-85.png </im:image> <im:image height="100"> http://is4.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/100x100bb-85.png </im:image> <rights>© mixi, Inc.</rights> <im:releaseDate label="2013年9月27日 ">2013-09-27T00:00:00-07:00</im:releaseDate> <content type="html"> <table border="0" width="100%"> <tr> <td> <table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr valign="top" align="left"> <td align="center" width="166" valign="top"> <a href="https://itunes.apple.com/jp/app/monsutasutoraiku/id658511662?mt=8&uo=2"><img border="0" alt="mixi, Inc - モンスターストライク アートワーク" src="http://is4.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/100x100bb-85.png" /></a> </td> <td width="10"><img alt="" width="10" height="1" src="https://s.mzstatic.com/images/spacer.gif" /></td> <td width="95%"> <b><a href="https://itunes.apple.com/jp/app/monsutasutoraiku/id658511662?mt=8&uo=2">モンスターストライク</a></b><br/> <a href="https://itunes.apple.com/jp/developer/mikushi-i/id285951869?mt=8&uo=2">mixi, Inc</a> <font size="2" face="Helvetica,Arial,Geneva,Swiss,SunSans-Regular"> <br/> <b>ジャンル:</b> <a href="https://itunes.apple.com/jp/genre/ios-gemu/id6014?mt=8&uo=2">ゲーム</a> <br/> <b>リリース日:</b> 2013年9月27日 </font> </td> </tr> </table> </td> </tr> <tr> <td> <font size="2" face="Helvetica,Arial,Geneva,Swiss,SunSans-Regular"><br/>◆祝・利用者3500万人突破!/テレビCM絶賛放映中!◆<br/><br/>最大4人同時に楽しめる「ひっぱりハンティングRPG!」<br/>モンスターマスターになって様々な能力を持つモンスターをたくさん集めよう! <br/>1000種類を超える個性豊かなモンスターが君を待ってるぞ! <br/><br/>【ゲーム紹介】 <br/><br/>▼ルールは簡単 <br/>モンスターを引っぱって敵に当てるだけ! <br/>味方モンスターに当てると、友情コンボが発動! <br/>一見攻撃力の弱いモンスターもコンボが発動すると、意外な力を発揮するかも?! <br/><br/>▼決めろストライクショット! <br/>バトルのターンが経過すると必殺技「ストライクショット」が使えるぞ! <br/>モンスターによって技は様々、君はすぐ使う派?ボスまで待つ派? <br/>使うタイミングが生死を分ける!? <br/><br/>▼集めて育てて強くなれ! <br/>バトルやガチャでGetしたモンスターを合成して育てよう! <br/>強く進化させるにはモンスター以外に進化素材が必要になるぞ。 <br/>強いモンスターを育てて君だけの最強チームを作ろう! <br/><br/>▼天空より舞い降りし、異界のモンスター! <br/>ボスがステージの最後に出るとは限らないぞ! <br/>どんな時も万全の態勢で戦いに挑むべし! <br/><br/>▼友達と一緒に、強敵を倒そう! <br/>近くにいる友達と、最大4人まで同時プレイが可能!<br/>なんと1人分のスタミナでクエストに挑めるぞ! <br/>1人では倒せない強敵も、みんなで力を合わせれば倒せるかも!? <br/>マルチプレイ専用のレアなクエストも盛りだくさん!<br/>レアモンスターを倒してゲットしよう! <br/><br/><br/>+++【価格】+++ <br/>アプリ本体:無料 <br/>※一部有料アイテムがございます。 <br/><br/>+++【推奨端末】+++ <br/>iOS 7.0 以降/iPhone 4s以降,iPod touch(第5世代以降),iPad2以降<br/>※推奨端末以外でのサポート、補償等は致しかねますので何卒ご了承くださいませ。<br/><br/>ご利用前に「アプリケーション使用許諾契約」に <br/>表示されている利用規約を必ずご確認の上ご利用ください。</font><br/> <font size="2" face="Helvetica,Arial,Geneva,Swiss,SunSans-Regular"> © © mixi, Inc.</font> </td> </tr> </table> </content> </entry> </feed>
※データが多いので1件に絞ってます。
URLのカスタマイズ
RSSGeneratorから出力されたURLは簡単な構成で、ある程度カスタマイズできます。
以下のURLを例にカスタマイズのパターンを紹介します。
https://itunes.apple.com/jp/rss/topgrossingapplications/limit=10/genre=6014/xml
国
「jp」の箇所を他の国名コードにすれば他の国のストアの情報を取得できます。
フィードタイプ
「topgrossingapplications」の箇所がフィードタイプになっています。
以下のフィードタイプの需要が高いんじゃないでしょうか。
- topgrossingapplications(トップセールス App)
- topfreeapplications(トップ無料 App)
- toppaidapplications(トップ有料 App)
- newapplications(新規 App)
サイズ
「limit=取得件数」となっています。
取得件数は200件まで増やせましたが、それ以上はエラーとなりました。
ジャンル
「genre=ジャンルID」となっています。
ジャンルIDはゲームの子ジャンル(アクション、ロールプレイングなど)も指定できますが、プルダウンにはありません。
公式からジャンルIDについて公表されており、こちらのIDも使うことができます。
iTunes Affiliate Resources
(一部のジャンルID(キッズ)や特定のフィードタイプ(新規 App)の場合には機能しませんでした。)
フォーマット
URL末尾の「xml」を「json」に変えることでjsonフォーマットでデータを取得できます。
クローラーのプログラム言語で扱いやすいフォーマットを指定するとよいでしょう。
オーツーではPHPを主に使っているので、PHPで簡単に扱えるjsonフォーマットでデータを取得しています。
サンプルデータ(json)
{"feed":{"author":{"name":{"label":"iTunes Store"}, "uri":{"label":"http://www.apple.com/jp/itunes/"}}, "entry":{"im:name":{"label":"モンスターストライク"}, "im:image":[ {"label":"http://is4.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/53x53bb-85.png", "attributes":{"height":"53"}}, {"label":"http://is3.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/75x75bb-85.png", "attributes":{"height":"75"}}, {"label":"http://is4.mzstatic.com/image/thumb/Purple30/v4/21/19/f1/2119f1ca-c088-d744-c3da-e54165b3520b/mzl.hmjkegxr.png/100x100bb-85.png", "attributes":{"height":"100"}}], "summary":{"label":"◆祝・利用者3500万人突破!/テレビCM絶賛放映中!◆\n\n最大4人同時に楽しめる「ひっぱりハンティングRPG!」\nモンスターマスターになって様々な能力を持つモンスターをたくさん集めよう! \n1000種類を超える個性豊かなモンスターが君を待ってるぞ! \n\n【ゲーム紹介】 \n\n▼ルールは簡単 \nモンスターを引っぱって敵に当てるだけ! \n味方モンスターに当てると、友情コンボが発動! \n一見攻撃力の弱いモンスターもコンボが発動すると、意外な力を発揮するかも?! \n\n▼決めろストライクショット! \nバトルのターンが経過すると必殺技「ストライクショット」が使えるぞ! \nモンスターによって技は様々、君はすぐ使う派?ボスまで待つ派? \n使うタイミングが生死を分ける!? \n\n▼集めて育てて強くなれ! \nバトルやガチャでGetしたモンスターを合成して育てよう! \n強く進化させるにはモンスター以外に進化素材が必要になるぞ。 \n強いモンスターを育てて君だけの最強チームを作ろう! \n\n▼天空より舞い降りし、異界のモンスター! \nボスがステージの最後に出るとは限らないぞ! \nどんな時も万全の態勢で戦いに挑むべし! \n\n▼友達と一緒に、強敵を倒そう! \n近くにいる友達と、最大4人まで同時プレイが可能!\nなんと1人分のスタミナでクエストに挑めるぞ! \n1人では倒せない強敵も、みんなで力を合わせれば倒せるかも!? \nマルチプレイ専用のレアなクエストも盛りだくさん!\nレアモンスターを倒してゲットしよう! \n\n\n+++【価格】+++ \nアプリ本体:無料 \n※一部有料アイテムがございます。 \n\n+++【推奨端末】+++ \niOS 7.0 以降/iPhone 4s以降,iPod touch(第5世代以降),iPad2以降\n※推奨端末以外でのサポート、補償等は致しかねますので何卒ご了承くださいませ。\n\nご利用前に「アプリケーション使用許諾契約」に \n表示されている利用規約を必ずご確認の上ご利用ください。"}, "im:price":{"label":"入手", "attributes":{"amount":"0.00000", "currency":"JPY"}}, "im:contentType":{"attributes":{"term":"Application", "label":"アプリケーション"}}, "rights":{"label":"© mixi, Inc."}, "title":{"label":"モンスターストライク - mixi, Inc"}, "link":{"attributes":{"rel":"alternate", "type":"text/html", "href":"https://itunes.apple.com/jp/app/monsutasutoraiku/id658511662?mt=8&uo=2"}}, "id":{"label":"https://itunes.apple.com/jp/app/monsutasutoraiku/id658511662?mt=8&uo=2", "attributes":{"im:id":"658511662", "im:bundleId":"jp.co.mixi.monsterstrike"}}, "im:artist":{"label":"mixi, Inc", "attributes":{"href":"https://itunes.apple.com/jp/developer/mikushi-i/id285951869?mt=8&uo=2"}}, "category":{"attributes":{"im:id":"6014", "term":"Games", "scheme":"https://itunes.apple.com/jp/genre/ios-gemu/id6014?mt=8&uo=2", "label":"ゲーム"}}, "im:releaseDate":{"label":"2013-09-27T00:00:00-07:00", "attributes":{"label":"2013年9月27日"}}}, "updated":{"label":"2016-08-03T03:11:28-07:00"}, "rights":{"label":"Copyright 2008 Apple Inc."}, "title":{"label":"iTunes Store: トップセールス"}, "icon":{"label":"http://itunes.apple.com/favicon.ico"}, "link":[ {"attributes":{"rel":"alternate", "type":"text/html", "href":"https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?cc=jp&id=25185&popId=38"}}, {"attributes":{"rel":"self", "href":"https://itunes.apple.com/jp/rss/topgrossingapplications/limit=1/genre=6014/json"}}], "id":{"label":"https://itunes.apple.com/jp/rss/topgrossingapplications/limit=1/genre=6014/json"}}}
データ項目の説明
かなり項目数が多いので主要な項目だけ説明します。
feed.entry | アプリ情報の配列(サンプルは配列になっていませんが複数件なら配列になります。) |
---|---|
feed.entry.im:name | アプリのタイトル情報 |
feed.entry.im:image | アプリのアイコン情報 |
feed.entry.summary | アプリの紹介文 |
feed.entry.im:price | アプリの価格情報(F2Pアプリは0円になっています。) |
feed.entry.link | アプリのitunesのURL |
feed.entry.im:artist | アプリの販売元の情報 |
feed.entry.im:releaseDate | アプリの公開日の情報 |
feed.updated | このデータの更新日時の情報 |
定刻処理
今回はデータを取得してDBに登録する処理をPHPで実装しました。
そのプログラムをcrondで定期的に実行させてデータを蓄積しています。
DBに入れてしまえば、集計処理も楽々です。
トップセールスのゲームジャンルのタイトルをリリース年毎に集計するSQLの例
SELECT DATE_FORMAT(a.release_date, '%y') AS release_year, count(*) release_count FROM sales_crawl sc JOIN sales_ranking sr ON sc.crawl_id = sr.crawl_id JOIN application a ON sr.application_id = a.application_id WHERE sc.ranking_date = '2016-08-03 18:40:07' AND sc.genre_id = 6014 GROUP BY release_year
実行結果
release_year | release_count |
---|---|
11 | 4 |
12 | 13 |
13 | 34 |
14 | 50 |
15 | 67 |
16 | 32 |
DBのデータだけだとエンジニア以外は使えないので、社内システムからWEBで閲覧できるようにして使っています。
まとめ
AppStoreを対象にランキングデータをスクレイピングし、社内システムから閲覧できるようにしてみました。
今後はChatworkAPIを使ってタイトルの担当メンバーに通知したりしようかなぁ、などと考えてます。
今回はこのへんで、ではでは。