メニュー

AppStoreランキングのスクレイピング

appstoreランキングのスクレイピング

どうも、ご無沙汰してます。
開発2部サーバー担当の山本です。

別の記事で別の山本さんがネタにしてましたが、メンバーが増えるにつれて「山本」が多くなり、同じフロアに4人もいます!
「山本」盛り上がってますね。

で、本題です。
今回はAppStoreのランキングをスクレイピングしてみたので紹介します。

経緯

AppStoreやGooglePlayのランキング情報を閲覧できるサービスは多々存在しますが、「ランクインしているタイトルの販売元の集計」や「ランクインしているタイトルのジャンルの集計」ができるサービスは知りません。(誰か知ってたら教えてください!)

企画の立ち上げやサービス運営において、トレンドや市場を客観的に分析することはとても重要で、「ランキングデータをローカルに持ってたら集計が楽だなー」、「システム化すれば誰でも簡単に見れるじゃん!」ということで作ってみました。

 データソース

Appleの公式からRSSGeneratorというページが公開されています。
RSS Generator

20160803_170745

この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&amp;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を使ってタイトルの担当メンバーに通知したりしようかなぁ、などと考えてます。

今回はこのへんで、ではでは。

この記事をシェアする

  • twitter
  • facebook
  • Google+
  • B!はてブ
  • pocket
トップへ戻る

CONTACT

ゲーム開発、Webサイト制作に関するご相談等ございましたら、お気軽にお問い合わせください。

ゲーム開発に関する
お問い合わせはこちら

Webサイト制作に関する
お問い合わせはこちら