华为与安卓渠道榜单采集可行性验证_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/Top | HTTP 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/app | 2026手机APP排行榜(软件榜) | 53,665 字节 | 24 条 |
https://sj.qq.com/game | 2026安卓手机游戏排行榜 | 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 其他被排除的渠道
| 渠道 | 结果 |
|---|---|
豌豆荚 /top | 404("豌豆们没有找到这个页面") |
七麦数据 /rank | 页面能开,但数据要登录后才可见 |
应用宝 /top、/rank、/soft | 全部"页面不存在" |
三、踩坑记录(4 条,务必记住)
- curl ≠ node fetch。小米对 curl 直接拒连(HTTP 000),对 node fetch 返回完整 HTML。判断"能不能抓"时,两个工具都要试,否则会得出完全错误的结论。
- agent-browser 在本机不可用。
agent-browser open <url>卡死 14 分钟无返回(无 daemon 进程产生),只能强杀。本机浏览器自动化必须走 CDP 直连 *****(复用已存在的 Chrome),不要用 agent-browser CLI。 - 华为要用
.com域名、不要用.cn。web-drcn.hispace.dbankcloud.cn返回 403,浏览器实际调用的是.com域名;且华为的接口即使拿到正确域名,也仍需 InterfaceCode。 - 应用宝是 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 |