粘贴任意 Google Play 应用并选择国家。Web Unlocker 返回“4.7”和“500M+”背后的精确评分和安装量,以及版本、价格和 20 条带开发者回复的评价。每 1,000 个应用 $0.98。
1,000 次免费请求 · 仅成功时计费 · 195+ 个国家和地区 · 适配 Claude
简单介绍一下您的团队,即可获得:
Google Play 显示的数字是四舍五入的:“4.7”“500M+”。页面底层保存着精确的数字,一次请求即可返回它们和 20 条评价。无需 Google 账户。
一次请求带回应用的完整页面:评分、安装量、版本、价格和 20 条评价。Web Unlocker 按 1 页计费。Apify 和 Bright Data 把应用和它的每条评价都按一行计费,SerpApi 则按每次搜索计费。
一个带 20 条评价的应用,在 Apify 上是 21 行。
在这里只是 1 页。
页面加载失败不收费。同一个应用换一个国家、它的数据安全页面或一次关键词搜索,都只是再多一页。
1,000 个各带 20 条评价的应用的费用
1,000 个应用页面,含详情和 20 条评价,按公布价格计算
Gologin:Growth 套餐每 1,000 个页面 $0.98。Apify:1,000 行应用数据和 20,000 行评价数据,一个 actor 每行分别 $0.0007 和 $0.00011,另一个每 1,000 条结果 $0.30。SerpApi:在其 $25 套餐下进行 1,000 次应用搜索。Bright Data:21,000 条记录,每 1,000 条 $1.50,即用即付。
准备好用在您自己的应用上了吗?获取 API 密钥和免费请求额度。
我们的 Google Play 采集测试,间隔一小时运行两次:10 个应用各从美国请求三次,3 个应用从德国请求,2 次关键词搜索和 2 个数据安全页面,每个最多请求三次,与上面演示的做法相同。下面是返回的结果和速度。
88 个中有 78 个第一次就返回。
其余 10 个在第二或第三次返回。
开源的 google-play-scraper 库、Apify 的 Google Play actor 和 Bright Data 的 Google Play Scraper API:同样 1,000 个应用各自的费用,以及有哪些事要您自己来做。
| 需要什么 | google-play-scraper | |||
|---|---|---|---|---|
| 您按什么付费 | 一页 | 您自己的服务器 | 每行 | 每条记录 |
| 1,000 个带 20 条评价的应用 | $0.98 | 免费,用您自己的 IP | $2.90 至 $6.30 | $31.50 |
| 每个应用的评价数 | 20 条;配合 Cloud Browser 可获取更多 | 分页,每次调用 200 条 | 最多 100,000 条 | 由您设定 |
| 按关键词搜索 | 是 | 是 | 是 | 否 |
| 免费开始 | 1,000 次请求 | 免费 | 每月 $5 | 每月 5,000 条 |
| 整个页面的 HTML | 是 | 否 | 否 | 否 |
| 任何其他站点价格相同 | 是 | 仅限 Google Play | 否 | 否 |
要采集的不只是 Google Play?Web Unlocker 以同样的方式、同样的价格返回任何页面。
Web Unlocker 返回应用页面上的 20 条评价,其余评价在 Google 的评价数据流中。Cloud Browser 是 Gologin 的另一款产品,有自己的套餐,它从应用页面调用这个数据流:4.5 秒拿到 Duolingo 最新的 2,000 条评价。
评分、安装量、价格、搜索排名和前 20 条评价,单靠 Web Unlocker 就能获得。Cloud Browser 用于完整的评价历史。
Cloud Browser 从打开的应用页面向 Google 的数据流请求评价,每次 100 条,从新到旧:20 次调用,2,000 条评价,4.5 秒。
Cloud Browser 不包含在 Web Unlocker 请求中。由您的 Playwright 或 Puppeteer 代码,或 Claude 驱动。含住宅 IP。
通过 Playwright、Puppeteer 或 Claude 运行。了解 Cloud Browser。
Google Play 把应用的数据以 JSON 的形式放在页面里,开源的 google-play-scraper 读取的正是这份 JSON。Web Unlocker 从您选择的国家返回这个页面,几行代码就能从中读出应用、它的 20 条评价或某个关键词的搜索结果。
填写上面的表单。密钥会在一个工作日内通过邮件送达。
应用页面可获取详情和评价,搜索页面可获取排名,数据安全页面可获取应用收集的数据。
从页面中截取应用的数据;如果返回的页面不带数据,就换一个新的网址再请求一次。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python google_play_app.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport json
import os
import re
import time
from datetime import datetime, timezone
import requests
app_id = "com.duolingo"
country = "us"
def scrape(url):
for attempt in range(3):
address = url if attempt == 0 else f"{url}&fresh={int(time.time())}"
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": address, "geo": country, "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if "key: 'ds:5'" in page:
return page
time.sleep(3)
raise RuntimeError("The page came back without the app data, try again later")
def blocks(page):
for key, data in re.findall(r"AF_initDataCallback\(\{key: '(ds:\d+)'.*?data:(.*?), sideChannel: \{\}\}\);</script>", page, re.S):
yield key, json.loads(data)
def at(node, *path):
for step in path:
if not isinstance(node, list) or step >= len(node):
return None
node = node[step]
return node
def day(stamp):
return datetime.fromtimestamp(stamp[0], timezone.utc).date().isoformat() if stamp else None
page = scrape(f"https://play.google.com/store/apps/details?id={app_id}&hl=en&gl={country.upper()}")
data = dict(blocks(page))
d = at(data["ds:5"], 1, 2)
reviews = next(
(value[0] for value in data.values() if isinstance(at(value, 0, 0, 0), str) and re.match(r"^[0-9a-f]{8}-", at(value, 0, 0, 0))),
[],
)
app = {
"id": app_id,
"title": at(d, 0, 0),
"developer": at(d, 68, 0),
"genre": at(d, 79, 0, 0, 0),
"rating": at(d, 51, 0, 1),
"ratings": at(d, 51, 2, 1),
"installs": at(d, 13, 0),
"installs_exact": at(d, 13, 2),
"price": (at(d, 57, 0, 0, 0, 0, 1, 0, 0) or 0) / 1e6,
"currency": at(d, 57, 0, 0, 0, 0, 1, 0, 1),
"version": at(d, 140, 0, 0, 0) or "Varies with device",
"updated": at(d, 145, 0, 0),
"reviews": [
{
"author": at(review, 1, 0),
"stars": at(review, 2),
"text": at(review, 4),
"date": day(at(review, 5)),
"helpful": at(review, 6),
"app_version": at(review, 10),
"reply": at(review, 7, 1),
}
for review in reviews
],
}
print(json.dumps(app, indent=2, ensure_ascii=False))
print(f"{app['title']}: {app['rating']:.2f} from {app['ratings']:,} ratings, {app['installs_exact']:,} installs, {len(app['reviews'])} reviews from one page")GOLOGIN_SCRAPING_API_KEY=your_key node google-play-apps.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const apps = ['com.duolingo', 'com.babbel.mobile.android.en', 'com.memrise.android.memrisecompanion', 'com.busuu.android.enc', 'com.hellotalk'];
const country = 'us';
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const address = attempt === 1 ? url : `${url}&fresh=${Date.now()}`;
const params = new URLSearchParams({ url: address, geo: country, format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes("key: 'ds:5'")) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const at = (node, ...path) => path.reduce((value, step) => (Array.isArray(value) ? value[step] : undefined), node);
const appData = (page) => {
const block = page.match(/AF_initDataCallback\(\{key: 'ds:5'.*?data:(.*?), sideChannel: \{\}\}\);<\/script>/s)?.[1];
return block ? at(JSON.parse(block), 1, 2) : null;
};
const rows = [];
for (const id of apps) {
const d = appData(await scrape(`https://play.google.com/store/apps/details?id=${id}&hl=en&gl=${country.toUpperCase()}`));
rows.push({
id,
title: at(d, 0, 0),
rating: at(d, 51, 0, 1)?.toFixed(3),
ratings: at(d, 51, 2, 1),
installs: at(d, 13, 2),
version: at(d, 140, 0, 0, 0) ?? 'Varies with device',
updated: at(d, 145, 0, 0),
price: (at(d, 57, 0, 0, 0, 0, 1, 0, 0) ?? 0) / 1e6,
});
}
writeFileSync('apps.csv', ['id,title,rating,ratings,installs,version,updated,price', ...rows.map((row) => Object.values(row).map((value) => JSON.stringify(value ?? '')).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} apps in ${rows.length} pages: $${(rows.length * 0.00098).toFixed(4)} on the Growth plan`);GOLOGIN_SCRAPING_API_KEY=your_key node google-play-rank.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst keyword = 'meditation';
const app = 'com.calm.android';
const countries = ['us', 'gb', 'de', 'ca', 'au'];
async function scrape(url, geo) {
for (let attempt = 1; attempt <= 3; attempt++) {
const address = attempt === 1 ? url : `${url}&fresh=${Date.now()}`;
const params = new URLSearchParams({ url: address, geo, format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes("key: 'ds:4'")) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const results = (page) => {
const block = page.match(/AF_initDataCallback\(\{key: 'ds:4'.*?data:(.*?), sideChannel: \{\}\}\);<\/script>/s)?.[1];
const sections = block ? JSON.parse(block)?.[0]?.[1] : null;
const items = sections?.find((section) => section?.[22]?.[0])?.[22]?.[0];
return (items ?? []).map(([item]) => ({ id: item[0][0], title: item[3], rating: item[4]?.[1] }));
};
for (const country of countries) {
const found = results(await scrape(`https://play.google.com/store/search?q=${encodeURIComponent(keyword)}&c=apps&hl=en&gl=${country.toUpperCase()}`, country));
const place = found.findIndex((item) => item.id === app) + 1;
console.log(`${country.toUpperCase()}: ${app} is #${place || '-'} of ${found.length} for "${keyword}", top app: ${found[0]?.title} (${found[0]?.rating?.toFixed(1)})`);
}
console.log(`${countries.length} countries in ${countries.length} pages: $${(countries.length * 0.00098).toFixed(4)} on the Growth plan`);准备好用在您自己的应用上了吗?获取 API 密钥和免费请求额度。
一个账户,一个代理网络,一套生态。按任务需要选择产品。
Google Play 爬虫,也叫 Play Store 爬虫,是一种读取 Google Play 公开页面并将其转成数据的工具:应用的评分、安装量、版本、价格和评价,或某个关键词搜索显示的应用。Gologin 的 Google Play 爬虫 API 就是 Web Unlocker:向它发送应用的地址,它就返回带有这些数据的页面,每 1,000 个页面 $0.98。
要抓取 Google Play 商店,把应用的地址,即 play.google.com/store/apps/details?id= 加上包名,连同您想要的国家一起发送给 Web Unlocker。它会按访客浏览器加载的样子返回页面,其中带有 Google Play 自己的 JSON:应用的详情和前 20 条评价。上面的代码几行就能读取。
每个应用页面都带有 20 条评价,包括星级、正文、日期、有用票数、应用版本和开发者的回复,Web Unlocker 会连同应用一起返回。每个国家和语言显示各自的 20 条。如需超过 20 条,可加上 Cloud Browser,它是 Gologin 的另一款产品,有自己的套餐:它从应用页面调用 Google 的评价数据流,每次 100 条,从新到旧,在我们的测试中 4.5 秒返回了 Duolingo 最新的 2,000 条评价。
对其他开发者的应用没有:没有面向它们的公开 Google Play Store API。Google Play 评价 API 是 Google Play Developer API 的一部分,只适用于您自己的应用,并且只返回最近一周的评价。其他任何应用的评分、安装量、价格和评价都在它公开的 Google Play 页面上,Google Play 爬虫读取的正是这个页面。
用 requests 库把应用地址发送给 Web Unlocker,再从页面中读取 Google Play 的 JSON。上面的 Python 标签页是一份完整的脚本,已在真实 API 上测试过:它会输出应用的评分、评分人数、精确安装量、版本、价格和 20 条评价。
适用于 Node.js 和 Python 的 google-play-scraper 库是免费的,在您自己的服务器上读取同一份 JSON。Node.js 版本的作者已不再维护它,并提醒 Google Play 改动页面时它会失效;从一个 IP 大量使用,会在大约一小时内收到 503 错误页面。Web Unlocker 从您选择的国家用住宅 IP 加载每个页面,失败的页面不收费。
应用页面提供标题、开发者、类别、精确评分、评分人数、各星级的人数、安装量、价格和币种、应用内购买价格区间、是否含广告、版本、更新和发布日期、内容分级、榜单排名、屏幕截图和 20 条评价。搜索页面按 Google Play 的顺序提供应用,数据安全页面提供应用收集和共享哪些数据。
应用商店优化(ASO)团队追踪应用在每个国家某个关键词下的排名。发行商逐日关注竞争对手的评分、安装量、版本和价格。产品和研究团队从评价中了解用户的抱怨和功能需求,分析师则根据安装量和榜单估算市场规模。上面的代码可以把数据保存为 JSON 或 CSV。
能。Google Play 显示的是 500M+ 这样的四舍五入数字,而把精确数字保存在页面数据中:2026 年 11 月 11 日 Duolingo 为 995,744,335。Web Unlocker 两者都会返回。
能。关键词搜索页面按 Google Play 显示的顺序返回应用,在我们的测试中“meditation”返回 21 到 30 个,每个都带有 ID、标题、评分、类别和价格。在多个国家运行同一个搜索,就能看到一个应用在各国的排名:在上面的“各国排名”标签页中,Calm 在美国排第 7,在德国排第 6,在澳大利亚排第 4。
能。演示提供 10 个国家,API 支持 195+ 个国家和地区中的任何一个。每个国家看到各自的评分、以本国货币显示的价格和以本国语言撰写的评价:Spotify 在德国是 4.17,在美国是 4.35。
每 1,000 个页面 $0.98,每个页面价格相同:一个带 20 条评价的应用算 1 页,一次搜索算 1 页。失败的请求不收费。套餐每月 $49 起,含 50,000 次请求。
Web Unlocker 附带 1,000 次免费请求,足够采集 1,000 个应用及其评价。开源的 google-play-scraper 库也是免费的:它们运行在您自己的服务器和 IP 上,而在 Google Play 变化时让它们保持正常运行要靠您自己。
使用 Web Unlocker 就不需要:它自带来自 195+ 个国家和地区的住宅 IP,并为每次请求选择一个。如果您运行自己的爬虫,Gologin Proxies 就是同一个网络。
能。Claude 和其他智能体像调用任何 API 一样调用 Web Unlocker,MCP & AI Skills 能把一句普通的请求,例如“比较这五个应用在德国的评分”,变成一个可用的工具。
Google Play 上的应用页面、评价和搜索结果无需 Google 账户即可加载:它们是公开页面。您采集什么、如何使用,由您自己决定,请对照适用于您项目的规则自行核对,尤其是涉及评价者姓名时。
简单介绍一下您的团队,即可获得: