粘贴主页或视频链接。Web Unlocker 无需登录即可返回页面:主页的精确粉丝数、获赞数和最新 16 条视频及其播放量,视频的播放量、点赞数、评论数、分享数和收藏数。每 1,000 个页面 $0.98。
1,000 次免费请求 · 仅成功时计费 · 195+ 个国家和地区 · 适配 Claude
简单介绍一下您的团队,即可获得:
公开页面,无需登录,也无需 TikTok 账户。网红营销平台、代理机构、品牌和研究人员读取这两类页面,每个都按 1 页计费。





想亲自试试?领取含 1,000 次免费请求的 API 密钥。
一个主页页面带来创作者的精确粉丝数和获赞数,以及最新 16 条视频及其播放量,只计费一次,每 1,000 个页面 $0.98。Apify 和 Bright Data 上的 TikTok 爬虫则把其中每条视频各算作一条结果来计费。
Apify 对 1,000 位创作者收费 $48。
这里只需 $0.98。
失败的页面不收费。TikTok 返回错误时,再请求一次即可:您只为带数据返回的页面付费。
1,000 位 TikTok 创作者的费用
1,000 个主页,含最新 16 条视频及其播放量,按公布价格计算
Gologin:每位创作者一个主页页面,每 1,000 个页面 $0.98。Bright Data 把每个主页和每条视频都按一条记录计费,每 1,000 条 $1.50。在 Apify 的免费套餐下,其 TikTok Profile Scraper 按每条视频计费,每 1,000 条 $3.00;最常用的 TikTok Scraper 每 1,000 条 $3.70。
准备好用在您自己的创作者上了吗?获取 API 密钥和免费请求额度。
一个主页页面带来创作者的精确粉丝数和获赞数,以及最新 16 条视频及其播放量。每个视频页面再补上它的点赞数、评论数、分享数和收藏数。17 个页面,$0.0167,您就能逐条看到这位创作者真实的互动数据。
TikTok 显示 146.2M 粉丝。
爬虫返回 146,194,232。
TikTok 自己的 API 只面向获批的研究人员和每位用户自己的账户。下面是每条路线在开始之前对您有什么要求,以及同样 1,000 位创作者各自如何计费。
| 需要什么 | ||||
|---|---|---|---|---|
| 其他创作者的数据 | 是 | 仅限研究人员 | 是 | 是 |
| 您按什么付费 | 一页 | 获批后免费 | 每条视频 | 每条记录 |
| 1,000 位创作者,各 16 条视频 | $0.98 | 不面向商业用途 | $48 至 $59.20 | $25.50 |
| 无需申请即可开始 | 是 | 否,约 4 周 | 是 | 是 |
| 免费开始 | 1,000 次请求 | 获批后 | 每月 $5 | 每月 5,000 条 |
| 整个页面的 HTML | 是 | 否 | 否 | 否 |
要采集的不只是 TikTok?Web Unlocker 以同样的方式、同样的价格返回任何页面。
TikTok 把公开页面的数据以 JSON 的形式放在 HTML 里。Web Unlocker 返回这份 HTML,几行代码就能从中读出主页或视频。“创作者列表”标签页是一个小型 TikTok 爬取工具:输入账户列表,输出 CSV。
填写上面的表单。密钥会在一个工作日内通过邮件送达。
主页可获取粉丝数和最新视频,视频可获取播放量、点赞数、评论数、分享数和收藏数。
检查页面是否带有数据;如果 TikTok 返回错误,就再请求一次:您只为返回的页面付费。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python tiktok_profile.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html
import json
import os
import re
import time
import requests
username = "mrbeast"
def scrape(url, marker):
for attempt in range(3):
address = url if attempt == 0 else f"{url}?fresh={int(time.time())}"
try:
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": address, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=60,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
except requests.RequestException:
page = ""
if marker in page:
return page
time.sleep(3)
raise RuntimeError("TikTok did not send the page, try again later")
page = scrape(f"https://www.tiktok.com/@{username}", '"followerCount"')
script = re.search(r'<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>(.*?)</script>', page, re.S)
info = json.loads(script.group(1))["__DEFAULT_SCOPE__"]["webapp.user-detail"]["userInfo"]
user, stats = info["user"], info["statsV2"]
videos = []
for item in page.split('data-e2e="user-post-item"')[1:]:
video = re.search(r'/video/(\d+)"', item)
views = re.search(r'data-e2e="video-views"[^>]*>([^<]*)<', item)
caption = re.search(r'<img alt="([^"]*)"', item)
if video:
videos.append({
"url": f"https://www.tiktok.com/@{username}/video/{video.group(1)}",
"views": views.group(1) if views else None,
"caption": html.unescape(caption.group(1)).split(" created by ")[0].strip() if caption else "",
})
profile = {
"username": user["uniqueId"],
"nickname": user["nickname"],
"bio": user["signature"],
"verified": user["verified"],
"followers": int(stats["followerCount"]),
"following": int(stats["followingCount"]),
"likes": int(stats["heartCount"]),
"videos": int(stats["videoCount"]),
"latest_videos": videos,
}
print(json.dumps(profile, indent=2, ensure_ascii=False))
print(f"@{username}: {profile['followers']:,} followers, {len(videos)} latest videos from one page")GOLOGIN_SCRAPING_API_KEY=your_key node tiktok-engagement.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const username = 'mrbeast';
async function scrape(url, marker) {
for (let attempt = 0; attempt < 3; attempt += 1) {
const api = new URL('https://parsing.webunlocker.gologin.com/v1/scrape');
api.search = new URLSearchParams({ url: attempt === 0 ? url : `${url}?fresh=${Date.now()}`, geo: 'us', format: 'json' });
try {
const response = await fetch(api, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
signal: AbortSignal.timeout(60_000),
});
const page = response.ok ? ((await response.json()).data?.html ?? '') : '';
if (page.includes(marker)) return page;
} catch {}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
throw new Error(`TikTok did not send ${url}, try again later`);
}
const data = (page) =>
JSON.parse(page.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>([\s\S]*?)<\/script>/)[1]).__DEFAULT_SCOPE__;
const profile = await scrape(`https://www.tiktok.com/@${username}`, '"followerCount"');
const followers = Number(data(profile)['webapp.user-detail'].userInfo.statsV2.followerCount);
const links = profile
.split('data-e2e="user-post-item"')
.slice(1)
.map((item) => item.match(/\/video\/(\d+)"/)?.[1])
.filter(Boolean)
.map((id) => `https://www.tiktok.com/@${username}/video/${id}`);
const rows = [];
for (const url of links) {
const video = data(await scrape(url, '"playCount"'))['webapp.video-detail'].itemInfo.itemStruct;
const stats = video.statsV2;
rows.push({
url,
date: new Date(video.createTime * 1000).toISOString().slice(0, 10),
plays: Number(stats.playCount),
likes: Number(stats.diggCount),
comments: Number(stats.commentCount),
shares: Number(stats.shareCount),
saves: Number(stats.collectCount),
caption: video.desc,
});
}
const cell = (value) => `"${String(value).replaceAll('"', '""')}"`;
writeFileSync(
`${username}-videos.csv`,
[Object.keys(rows[0]).join(','), ...rows.map((row) => Object.values(row).map(cell).join(','))].join('\n'),
);
const sum = (key) => rows.reduce((total, row) => total + row[key], 0);
const engagement = (sum('likes') + sum('comments') + sum('shares') + sum('saves')) / sum('plays');
console.table(rows.map(({ caption, ...row }) => row));
console.log(
`@${username}: ${followers.toLocaleString('en')} followers, ${rows.length} videos, ${(engagement * 100).toFixed(1)}% engagement, ${rows.length + 1} pages, saved to ${username}-videos.csv`,
);GOLOGIN_SCRAPING_API_KEY=your_key node tiktok-creators.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const creators = ['mrbeast', 'nasa', 'khaby.lame', 'zachking', 'charlidamelio'];
async function scrape(url, marker) {
for (let attempt = 0; attempt < 3; attempt += 1) {
const api = new URL('https://parsing.webunlocker.gologin.com/v1/scrape');
api.search = new URLSearchParams({ url: attempt === 0 ? url : `${url}?fresh=${Date.now()}`, geo: 'us', format: 'json' });
try {
const response = await fetch(api, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
signal: AbortSignal.timeout(60_000),
});
const page = response.ok ? ((await response.json()).data?.html ?? '') : '';
if (page.includes(marker)) return page;
} catch {}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return null;
}
const UNITS = { K: 1e3, M: 1e6, B: 1e9 };
const number = (text) => Number.parseFloat(text) * (UNITS[text.at(-1)] ?? 1);
const rows = [];
for (const username of creators) {
const page = await scrape(`https://www.tiktok.com/@${username}`, '"followerCount"');
if (!page) {
console.log(`@${username}: no page this time, run it again later`);
continue;
}
const script = page.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>([\s\S]*?)<\/script>/)[1];
const { user, statsV2 } = JSON.parse(script).__DEFAULT_SCOPE__['webapp.user-detail'].userInfo;
const views = [...page.matchAll(/data-e2e="video-views"[^>]*>([^<]+)</g)].map(([, text]) => number(text)).sort((a, b) => a - b);
rows.push({
username: user.uniqueId,
name: user.nickname,
verified: user.verified,
followers: Number(statsV2.followerCount),
likes: Number(statsV2.heartCount),
videos: Number(statsV2.videoCount),
median_views: views.length ? views[Math.floor(views.length / 2)] : '',
});
}
const cell = (value) => `"${String(value).replaceAll('"', '""')}"`;
writeFileSync('creators.csv', [Object.keys(rows[0]).join(','), ...rows.map((row) => Object.values(row).map(cell).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} of ${creators.length} creators, one page each, saved to creators.csv`);准备好用在您自己的创作者上了吗?获取 API 密钥和免费请求额度。
一个账户,一个代理网络,一套生态。按任务需要选择产品。
TikTok 爬虫,也叫 TikTok 爬取工具,是一种读取 TikTok 公开页面并将其转成数据的工具:主页的粉丝数、获赞数和最新视频,视频的播放量、点赞数、评论数、分享数和收藏数。Gologin Web Unlocker 是一个 TikTok 爬虫 API:向它发送主页或视频地址,它就返回带有这些数据的页面,每 1,000 个页面 $0.98。
TikTok 数据抓取每个页面只需一次请求:把公开主页或视频的地址发送给 Web Unlocker。它会按未登录访客看到的样子返回页面,连同 TikTok 以 JSON 形式放在页面里的数据。上面的代码几行就能读取。TikTok 返回错误时,再请求一次即可:您只为返回的页面付费。
用 requests 库把主页地址发送给 Web Unlocker,再从页面中读取 JSON。上面的 Python 标签页是一份完整的脚本,已在真实 API 上测试过:它会输出创作者的精确粉丝数、获赞数和视频数,以及最新 16 条视频及其播放量。
精确的粉丝数、关注数、获赞数和视频数,名称、简介和认证标志,以及最新 16 条视频的链接、配文和播放量。TikTok 在页面上显示的是四舍五入后的数字,页面里的数据才是精确值。
TikTok 视频爬虫可获取播放量、点赞数、评论数、分享数和收藏数,配文、话题标签、声音、日期和时长,封面图,以及作者及其粉丝数。对于数字较大的视频,TikTok 会把播放量和点赞数四舍五入,与页面上显示的一致。
能。公开主页和视频无需登录即可加载,Web Unlocker 以未登录访客的身份打开它们。您不需要 TikTok 账户,也不会让自己的任何账户承担风险。私密账户仍然无法查看。
只面向获批的研究人员。Research API 对美国、欧洲和少数其他国家的学术及非营利研究团体开放,审核大约需要 4 周。Display API 只能读取登录您应用的用户自己的主页和视频。两者都不适用于针对其他创作者数据的商业用途。
把创作者最新视频的点赞数、评论数、分享数和收藏数相加,再除以它们的播放量。Web Unlocker 从主页页面带来最新 16 条视频,再从每条视频自己的页面带来它的数据:17 个页面,$0.0167。上面的 Node.js 标签页完成求和并写出 CSV;MrBeast 的结果是 14.7%。
评论数可以:每个视频页面都带有这个数字。评论内容本身在滚动时才加载,并且需要已登录的会话,所以 Web Unlocker 不会返回它们。
每 1,000 个页面 $0.98,每个页面价格相同:一个带最新 16 条视频的主页算 1 页,一条带数据的视频也算 1 页。失败的请求不收费。您可以从 1,000 次免费请求开始,套餐每月 $49 起,含 50,000 次请求。
这取决于您的需求。Apify 和 Bright Data 出售来自主页、视频、话题标签和评论的现成数据行,并按每一条计费。Web Unlocker 以每页一个价格返回整个公开主页或视频页面,在 TikTok 和任何其他站点上都一样,所以核查创作者只需几美分。
有。Apify 的 TikTok Scraper 按每条视频计费,在其免费套餐下每 1,000 条 $3.70,所以一位创作者的最新 16 条视频就是 16 条结果。Web Unlocker 把主页连同这 16 条视频及其播放量作为一个页面返回:每 1,000 位创作者 $0.98。
无需登录即可加载的主页和视频都是公开页面。2024 年 1 月,在 Meta 诉 Bright Data 一案中,美国联邦法院认定平台的条款并不禁止在未登录状态下抓取公开数据。您采集什么、如何使用,由您自己决定,请对照适用于您项目的规则自行核对。
简单介绍一下您的团队,即可获得: