【问题标题】:How to get top 400 lists from iTunes如何从 iTunes 获取前 400 名列表
【发布时间】:2015-05-02 03:14:38
【问题描述】:

如何从 iTunes 获取前 400 个(或更多)应用列表?我需要每个类别和整体的最高付费、免费和总收入列表。

我知道 rss 提要存在,地址为 https://rss.itunes.apple.com/,但它只提供前 200 名。然而,AppFigures 和 AppAnnie 等网站有前 400 名或前 500 名的列表,应用商店中的应用会显示前 400 名.

我尝试了 EPF 提要,流行度表上只有 20 行,从其他论坛看来,该提要已经有几个月不可用了,而且它也没有像其他网站那样经常更新。

我正在寻找直接来自 Apple 的解决方案,而不是通过第三方。我有 99% 的把握 Apple 每小时提供此数据,但我不知道终点。

【问题讨论】:

    标签: app-store itunes


    【解决方案1】:

    2015 年 10 月 12 日更新:根据 Apple 开发者支持,截至 2015 年 10 月 9 日,该问题已得到解决。


    RSS 提要目前确实上限为 200 个结果(尽管过去它们已设置为最多 400 个),

    关于 EPF 关系 - 一些服务(例如 Chomp)过去曾依赖它。我不确定它的当前状态,但是如果您尝试使用它,请确保您获得完整的每周版本(其大小必须在 5 GB 以上的范围内),而不仅仅是增量版本。也许这就是你只得到几行的原因?

    目前我不知道直接从 Apple 获取此信息的其他方法。您可以尝试f6s 的免费服务或使用其他付费服务提供的 API。

    更新 - 收到 Apple 反馈

    这对我来说是一个有趣的话题,所以我昨天联系了 Apple,询问他们有没有办法直接从他们那里检索这些数据。今天早上,我收到了来自 Apple 的 iTunes Affiliate 团队关于图表数据可用性的反馈。他们确认了 RSS 提要的局限性,并在 EPF 问题上发表了以下看法:

    如果您是会员,您可以查看 EPF Relational 以开发您自己的搜索结果。

    EPF 是一套完整的数 GB 下载 来自 iTunes Store、App Store 和 Mac App Store 的元数据。公积金是 可供附属公司充分整合 iTunes 的各个方面 和 App Store 目录到网站或应用程序中。此工具仅适用于 精通技术的附属公司,以及关系数据库设置的知识 必需的。 Apple 不会为设置或 维护这个工具。

    EPF 访问权限仅适用于获得批准的联属网络营销计划 出版商。有关 EPF 的更多信息,请访问 企业合作伙伴源文档页面。查看文档 在那里找到,如果您想访问 EPF,请提供 以下信息:...

    通过对ERPF technical documentation 的进一步调查,我发现数据库中的一张表包含按类型划分的前 1000 个应用程序:

    因此,您应该首先将数据导入您自己的数据库中,从每周(数 GB)发布开始,然后应用自每周发布以来可用的任何每日(数 MB)更新。根据苹果的说法,两者之间的区别是:

    馈送模式

    iTunes 以两种模式生成 EPF 数据:

    • 完整模式

    • 增量模式

    每周生成完整的导出,并且 包含截至日期的 iTunes 元数据的完整快照 一代。增量导出每天生成并包含 自上次完全导出后添加或修改的记录。 增量导出相对于完整导出位于 他们所依据的。

    如果您已将数据导入到关系数据库中,您应该能够使用类似于此的简单 SELECT 语句获取所需的数据:

    SELECT application.title, applicationpopularityper_genre.application_rank 
    FROM applicationpopularityper_genre 
    JOIN application 
      ON application.application_id = applicationpopularityper_genre.application_id
    WHERE applicationpopularityper_genre.genreid = XX
    ORDER BY applicationpopularityper_genre.application_rank ASC;
    

    关于每小时更新 - 通过查看关系结构,我发现有一个 export_date 列可用。在执行上面的选择时,您应该检查是否为每个应用程序获取多个日期 - 如果这样做,则您的数据粒度比一天更细。如果不是(这更有可能),并且这对您来说是一个交易破坏者,您应该考虑使用 Appannie 和我已经提出的其他服务,使用他们通过 itunes connect 从开发人员那里获得的数据来丰富这些数据。如果你想要免费的信息,你可以尝试从 Appannie 上抓取(有一些free tools 这样做,但你应该知道从长远来看这可能不是很可靠,所以你可能会更好地付费);

    更新 2:

    iTunes 附属团队确认他们知道此表存在的问题。

    希望这能回答你的问题。

    【讨论】:

    • 存在什么 URL 可以从 Apple 那里抓取这些数据,前 200 名以外的任何内容? Apple 似乎没有公开公共 URL - 你能引用这样的 URL 吗?
    • 从文档看来数据应该在 EPF 提要中,但我已经下载并提取了它们。 application_popularity_per_genre 数据文件只有 4k,当我提取它时,它只在我的数据库中放入 20 行。苹果开发者论坛上有人说这个问题从 11 月就存在了,在此之前该表有 550 万行。 (devforums.apple.com/message/1131742#1131742)
    • 我还查看了增量版本,在这些版本中,流行下载与完整版本中的大小相同,歌曲和书籍也是如此。我认为这是因为排名每天都在完全更新。
    • 这很奇怪!确保您看的不是表格的某种演示版本。您是否设法检查了已提交的错误报告(Apple bugreporter 中的 19843267) - 我似乎找不到它。也许这确实是一个错误。我将与 Apple 附属团队核实,希望他们回答。当我得到更多信息时,我会更新。
    • 让我们跟踪有问题的线程,看看会发生什么。如果我有任何新消息,我会通知你。
    【解决方案2】:

    这是你如何做的......你可以点击如下的 URL 并提供一个 iOS5 用户代理。

    _IOS_DEEP_RANK_URL_BASE = 'https://itunes.apple.com/WebObjects/MZStore.woa/wa/topChartFragmentData?genreId=%s&popId=%s&pageNumbers=%d&pageSize=%d'
    
    _IOS_DEEP_RANK_USERAGENT =  'iTunes-iPad/5.1.1 (64GB; dt:28)'
    

    您还需要根据您想要的国家/地区设置店面。

    "X-Apple-Store-Front: 143441-1,9"
    

    【讨论】:

    • 有趣 - 您需要越狱设备,还是任何具有旧 iOS 版本的设备都可以?在我看来,这是一个非常老套且不可靠的解决方案——听起来有点像使用密钥解密 iTunes 流量。我记得苹果最近将他们在设备应用商店中的排行榜限制在前 150 名(如果我没记错的话),你如何获得 1000?请详细说明 - 顺便说一句,当我要求我们讨论臭名昭著的桌子的替代品时,Apple 不再回复我了。
    • @PlamenPetrov 来自 Apple:'旧版 (WebObjects) 链接这些链接自 iTunes Store 成立以来就一直存在,仍然受到支持,并且将无限期使用。这些链接的首选主机现在是“itunes.apple.com”,但仍然支持“phobos.apple.com”链接。 affiliate.itunes.apple.com/resources/documentation/…您不需要越狱设备,您可以在发出请求时指定用户代理标头
    • @PlamenPetrov 还要查看请求中的参数。 “pageNumbers”和“pageSize”。如果您使用 pageNumbers=0 和 pageSize=1500,您最多可以获得 1500 个应用程序
    • @CharltonProvatas 这个答案现在有点老了——30个月。事情可能已经改变了。
    • @PlamenPetrov 我可以确认此端点确实可以使用 Postman(不一定是越狱设备)。事实上,用户代理标头不是必需的。更新 popId 将显示 iPhone/iPad 付费/免费/总票房等。据我所知,它唯一不支持的是日期。
    【解决方案3】:

    从 AppAnnie 抓取数据可以吗?

    使用 phantomjs 和 casperjs 抓取免费、付费和总收入的前 500 名。

    1. 在您的系统中安装 phantomjs 和 casperjs
    2. 在终端:casperjs appAnnieTop500Scraper.js

    样本输出

    Free Apps
    500 apps found:
    // not shown: app names in json array format
    // json array on file: freeTop500.json
    Paid Apps
    500 apps found:
    // not shown: app names in json array format
    // json array on file: paidTop500.json
    Grossing Apps
    500 apps found:
    // not shown: app names in json array format
    // json array on file: grossingTop500.json
    

    appAnnieTop500Scraper.js

    var free = [];
    var paid = [];
    var grossing = [];
    
    var FREE_COLUMN_INDEX = 1;
    var PAID_COLUMN_INDEX = 2;
    var GROSSING_COLUMN_INDEX = 3;
    
    var fs = require('fs');
    var casper = require('casper').create();
    casper.on("click", function() {
      this.echo();
    });
    casper.on("page.error", function() {
      this.echo();
    });
    
    function getAppListScraper(columnIndex) {
      var selector = document.querySelectorAll('tbody#storestats-top-table tr td:nth-child(' + columnIndex + ') div.item-info div.main-info span.title-info');
      return Array.prototype.map.call(selector, function(e) {
        return e.getAttribute('title');
      });
    }
    
    function printToConsole(casper, appList) {
      casper.echo(appList.length + ' apps found:');
      casper.echo(JSON.stringify(appList));
    }
    
    function writeToFile(fileName, content) {
      fs.write(fileName, content, 'w');
    }
    
    casper.start('https://www.appannie.com/apps/ios/top/?device=iphone', function() {
      // click load all button to load 500 apps list
      this.click('div#load-more-box span.btn-load p a.load-all');
    
      // wait 5000ms for the apps list to load then scrape it
      this.wait(5000, function() {
        free = this.evaluate(getAppListScraper, FREE_COLUMN_INDEX);
        paid = this.evaluate(getAppListScraper, PAID_COLUMN_INDEX);
        grossing = this.evaluate(getAppListScraper, GROSSING_COLUMN_INDEX);
      });
    });
    
    casper.run(function() {
      this.echo('Free Apps');
      printToConsole(this, free);
      writeToFile("freeTop500.json", JSON.stringify(free));
    
      this.echo('Paid Apps');
      printToConsole(this, paid);
      writeToFile("paidTop500.json", JSON.stringify(paid));
    
      this.echo('Grossing Apps');
      printToConsole(this, grossing);
      writeToFile("grossingTop500.json", JSON.stringify(grossing));
    
      this.exit();
    });

    【讨论】:

    • 我已经在之前的编辑中提出了这个刮板解决方案,但我被否决了。我认为原始发布者不想依赖第三方来获取这些数据......
    • 是的,您的答案必须保留,因为它肯定是一种选择,即使您依赖第 3 方,如果您需要它用于任何严重的事情,它可能不是最好的主意。根据 Apple 的说法,您必须能够自己检索数据 - 请参阅我更新的答案。
    • 很好,但这对我们的目的不起作用。
    【解决方案4】:

    我知道这是一个老问题,但我最近遇到了同样的问题。 加入许多网站的点后,我的解决方案是这样的:

    您将需要以下流派列表: https://affiliate.itunes.apple.com/resources/documentation/genre-mapping/

    国家代码列表如下: https://affiliate.itunes.apple.com/resources/documentation/linking-to-the-itunes-music-store/#Legacy

    此链接为您提供了基本的 RSS 概述和生成器,但缺少很多: https://rss.itunes.apple.com/en-us

    以下是我设法拼凑的示例:

    Top 100 Christian & Gospel
    https://itunes.apple.com/au/rss/topsongs/genre=22/explicit=true/limit=100/xml
    
    Or, the same one with JSON results
    https://itunes.apple.com/au/rss/topsongs/genre=22/explicit=true/limit=100/json
    
    Or, without the explicit songs:
    https://itunes.apple.com/au/rss/topsongs/genre=22/limit=100/json    
    
    Top 100 CCM
    https://itunes.apple.com/au/rss/topalbums/genre=1094/explicit=true/limit=100/xml
    

    只需更改类型 ID 和国家代码。

    https://itunes.apple.com/{country code}/rss/topalbums/genre={genre code}/explicit=true/limit=100/xml
    

    【讨论】:

    • 超级有帮助。太棒了!
    猜你喜欢
    • 2017-12-19
    • 2011-09-03
    • 1970-01-01
    • 2021-07-09
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多