项目进展2026-09-15

华为与安卓渠道榜单采集可行性验证_20260915

华为应用市场与主流安卓渠道榜单采集的可行性验证:确定成本最低的稳定采集路径(部分渠道可免浏览器直采)。

验证日期:2026-09-15 验证人:白志明(AI 协助) 验证目的:判定华为应用市场与主流安卓渠道的榜单,能否用 Chrome 采集;并找出成本最低的稳定采集路径。


一、结论(先说结果)

渠道能否采集需要 Chrome 吗数据位置
苹果 App Store✅ 能不需要官方 RSS,直接返回 JSON
小米应用商店✅ 能不需要HTML 服务端渲染,92 条榜单条目
应用宝 · 软件榜✅ 能不需要__NEXT_DATA__ JSON,24 条
应用宝 · 游戏榜✅ 能不需要__NEXT_DATA__ JSON,100 条
华为应用市场✅ 能⚠️ 必须页面 JS 渲染,接口带签名校验

一句话回答:华为与安卓渠道都能用 Chrome 采集;但实测下来,只有华为真正需要 Chrome —— 小米和应用宝可以直接抓 HTML 拿到完整榜单,成本几乎为零。

这条结论推翻了本项目此前的判断。此前认为"华为与安卓渠道不可采集",是因为只用了 curl 测试。本次发现:curl 会被小米直接拒绝连接,而 node 的原生 fetch 能正常拿到完整数据。这是工具差异,不是渠道不可用。


二、实测证据(逐渠道)

2.1 华为应用市场 —— 唯一必须 Chrome

免浏览器路线全部封死:

测试项结果
GET https://appgallery.huawei.com/TopHTTP 200,但只有 3012 字节,可见文本全是 CSS(html, body, #app { height: 100%; })→ 纯 JS 空壳
官方数据接口 web-drcn.hispace.dbankcloud.com/edge/...403,{"rtnCode":1002,"rtnDesc":"InterfaceCode Verification failed."}
加浏览器 UA + Referer 重试仍 403(需 InterfaceCode 签名)
5 个候选 URL(/、/ranking、/Featured、/app/rank、/rankList)前三个都 302 到 /Featured,返回同一份骨架

Chrome 路线畅通(实测通过,约 15–25 秒):

1. CDP 连接 *****:*****
2. 打开 https://appgallery.huawei.com/Featured
3. 点击页面中文本为「排行」的元素(<span class="text">)
4. URL 自动跳到 https://appgallery.huawei.com/Top
5. 等待约 7 秒渲染 → 取 innerText

拿到结果:正文 1001 字符 / 153 行,含真实榜单:

应用排行 | 游戏排行
今日流行 | 上升最快 | 本周热议 | 最近更新
1  微信    聊天
2  抖音    视频
3  …

为什么华为必须走浏览器:它的数据接口要求先调 getInterfaceCode 拿一个 JWT(实测返回 423B 的 HS256 JWT),后续每个业务接口都校验它。复现这套机制要维护签名时效与浏览器上下文,性价比远低于直接开一次 Chrome。

2.2 小米应用商店 —— 免浏览器,数据完整

GET https://app.mi.com/catTopList/0?page=1
→ HTTP 200,69,324 字节 HTML,服务端渲染

HTML 里是标准榜单结构,共 92 个 /details?id= 链接:

<li>
  <a href="/details?id=com.tencent.tmgp.sgame"><img alt="王者荣耀" …></a>
  <h5><a href="/details?id=com.tencent.tmgp.sgame">王者荣耀</a></h5>
  <p class="app-desc"><a href="/category/19">网游RPG</a></p>
</li>

这意味着可直接解析出:名次、应用名、包名、分类。前几名:王者荣耀 / 夸克 / 抖音 / 钉钉 / 作业帮 …

⚠️ 关键差异:同一个 URL 用 curl 访问返回 HTTP 000(连接被拒),用 node 的 fetch 却返回 200 + 69KB 完整数据。小米按 TLS 指纹拦客户端,curl 会被拦,node fetch 不会被拦。

2.3 应用宝(腾讯)—— 免浏览器,数据最全

正确入口不是 /top(页面不存在),而是:

URL页面__NEXT_DATA__榜单条数
https://sj.qq.com/app2026手机APP排行榜(软件榜)53,665 字节24 条
https://sj.qq.com/game2026安卓手机游戏排行榜158,792 字节100 条

数据路径:props.pageProps.dynamicCardResponse.data.components[1].data.itemData

每条包含 11 个字段:

pkg_name, app_id, name, icon, md_5, download_url,
is_game, is_cloud_game, channel_info, apk_size, io

这是四个渠道里字段最丰富的(有包名、APK 大小、下载地址、MD5),做竞品分析时价值最高。

失效入口(供避坑):/top、/rank、/rank/soft、/soft 全部是"页面不存在"。

2.4 苹果 App Store —— 免浏览器(此前的成果)

https://itunes.apple.com/cn/rss/topfreeapplications/limit=25/json,5 个榜种 + 任意类目切片,直接是 JSON。

2.5 其他被排除的渠道

渠道结果
豌豆荚 /top404("豌豆们没有找到这个页面")
七麦数据 /rank页面能开,但数据要登录后才可见
应用宝 /top、/rank、/soft全部"页面不存在"

三、踩坑记录(4 条,务必记住)

  1. curl ≠ node fetch。小米对 curl 直接拒连(HTTP 000),对 node fetch 返回完整 HTML。判断"能不能抓"时,两个工具都要试,否则会得出完全错误的结论。
  2. agent-browser 在本机不可用。agent-browser open <url> 卡死 14 分钟无返回(无 daemon 进程产生),只能强杀。本机浏览器自动化必须走 CDP 直连 *****(复用已存在的 Chrome),不要用 agent-browser CLI。
  3. 华为要用 .com 域名、不要用 .cn。web-drcn.hispace.dbankcloud.cn 返回 403,浏览器实际调用的是 .com 域名;且华为的接口即使拿到正确域名,也仍需 InterfaceCode。
  4. 应用宝是 Next.js。数据在 <script id="__NEXT_DATA__"> 里,不要去正则匹配 HTML 文本,直接解析这段 JSON 更可靠。

四、建议的采集方案

日常采集(零成本、秒级):
  苹果  → itunes RSS JSON
  小米  → node fetch HTML 解析
  应用宝 → node fetch → __NEXT_DATA__ JSON
  华为  → 需要时才启动 Chrome,走 CDP 点击「排行」,约 20 秒

频率建议:小米/应用宝/苹果 每日;
         华为 每周 2–3 次(它有 InterfaceCode 机制,降低请求频率更稳妥)

Chrome 环境说明:本机 ***** 端口上已有一个常驻调试 Chrome(profile:%LOCALAPPDATA%\.agent-browser\profiles\chrome-live),CDP 采集直接复用它,用后台标签页方式打开(background: true),不会抢占窗口焦点、不影响正在进行的操作。


五、附:本次验证环境

项值
浏览器Chrome 153.0.8010.36(CDP *****)
运行时Node.js 22.22.2(undici fetch)
采集方式CDP Target.createTarget + background:true + Runtime.evaluate
验证脚本相关事务创意收集整理\_cdp_probe*.mjs、_nobrowser.mjs、_parse.mjs
← 返回文章列表