粘贴公开主页或帖子链接。Web Unlocker 无需登录即可返回 X 页面:主页的关注者数、简介和最新 5 条帖子,每条帖子都带有精确的喜欢数、转帖数、回复数和查看次数。每 1,000 个页面 $0.98。
1,000 次免费请求 · 仅成功时计费 · 195+ 个国家和地区 · 适配 Claude
简单介绍一下您的团队,即可获得:
公开页面,无需登录,无需 X 账户,也无需 X API 密钥。社交聆听团队、代理机构、品牌和 AI 智能体读取这两类页面,每个都按 1 页计费。





想亲自试试?领取含 1,000 次免费请求的 API 密钥。
Web Unlocker 对一个帖子页面只计费一次,页面带有精确的回复数、转帖数、喜欢数和查看次数,每 1,000 个页面 $0.98。Apify 上的 Twitter 爬虫对每个单独的帖子链接收费 $0.05,Bright Data 每 1,000 条记录收费 $1.50。
X API 每 1,000 条帖子收费 $5.00。
这里 1,000 条只需 $0.98。
服务无法响应的请求不收费。在我们的测试中,50 次首次请求里有 6 次很快被拒绝,再请求一次就拿到了页面。
1,000 条 X 帖子的费用
1,000 条带喜欢数、转帖数、回复数和查看次数的公开帖子,按公布价格计算
Gologin:每 1,000 个页面 $0.98,一条帖子算一页。Bright Data 按每条记录计费,每 1,000 条 $1.50。X API 每读取一条帖子收费 $0.005。Apify 上的 Twitter Scraper Lite 对每个单独的帖子链接收费 $0.05,另加每条帖子 $0.0004。
准备好用在您自己的帖子上了吗?获取 API 密钥和免费请求额度。
我们的 Twitter 网页采集测试:20 个品牌和创作者主页、每个主页各一条最新帖子,以及 10 个较小的账户,每个页面最多请求三次,与上面演示的做法相同。下面是返回的结果和速度。
50 个中有 44 个第一次就返回。
其余 6 个在第二或第三次返回。
官方 X API、Apify 的 Twitter 爬虫和 Bright Data 的 X Scraper API:同样 1,000 条帖子和 1,000 个主页各自如何计费,以及开始之前对您有什么要求。
| 需要什么 | ||||
|---|---|---|---|---|
| 您按什么付费 | 一页 | 每条帖子或主页 | 每次查询和每条帖子 | 每条记录 |
| 按链接读取 1,000 条帖子 | $0.98 | $5.00 | $50.40 | $1.50 |
| 1,000 个主页 | $0.98 | $10.00 | $4.40 | $1.50 |
| 开发者账户 | 不需要 | 需要 | 不需要 | 不需要 |
| 重复检查同一账户 | 是 | 是 | 有限 | 是 |
| 按关键词搜索 | 否 | 是 | 是 | 是 |
| 精确的关注者数 | 四舍五入 | 是 | 是 | 是 |
| 免费开始 | 1,000 次请求 | 否 | 每月 $5 | 每月 5,000 条 |
| 在任何其他站点上同价 | 是 | 否 | 否 | 否 |
要采集的不只是 X?Web Unlocker 以同样的方式、同样的价格返回任何页面。
一个主页页面带来该账户最新 5 条帖子,以及精确的喜欢数、转帖数、回复数和查看次数。100 个账户为您带来 500 条最新帖子,只需 $0.098,想多久检查一次都行。Apify 主要的 Twitter 爬虫则要求您不要重复同一个查询。
X API 每 1,000 条帖子收费 $5。
这里从 200 个主页获取 1,000 条,只需 $0.20。
X 把数据放在页面的 HTML 里发给未登录的访客,每条帖子下都有精确的数字。Web Unlocker 返回这份 HTML,几行代码就能读取。“账户列表”标签页是一个小型 Twitter 爬取工具:输入账户,输出包含最新帖子的 CSV。
填写上面的表单。密钥会在一个工作日内通过邮件送达。
主页可获取关注者数和最新 5 条帖子,帖子可获取精确的喜欢数、转帖数、回复数和查看次数。
检查页面是否带有数据;如果服务很快拒绝了请求,就再请求一次。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python x_profile.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html
import json
import os
import re
import time
from datetime import datetime, timezone
import requests
username = "NASA"
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": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if 'role="group"' in page:
return page
time.sleep(3)
raise RuntimeError("The page came back without data, try again later")
def meta(page, name):
found = re.search(rf'<meta (?:property|name)="{name}" content="([^"]*)"', page)
return html.unescape(found.group(1)) if found else None
def count(page, word):
found = re.search(rf">([\d.,]+[KMB]?)</span>\s*<span[^>]*>{word}<", page)
return found.group(1) if found else None
def text_of(chunk):
start = chunk.find('aria-label="More"')
if start < 0:
return ""
start = chunk.find("</button>", start) + len("</button>")
ends = [chunk.find(mark, start) for mark in ('inert=""', "data-press-control", "<video", 'role="group"', "<article")]
end = min([chunk.rfind("<", 0, at) for at in ends if at > 0] or [len(chunk)])
words = re.sub(r"<script.*?</script>|<[^>]+>", "", chunk[start:end], flags=re.S)
return html.unescape(words).strip()
page = scrape(f"https://x.com/{username}")
posts = []
start = 0
for match in re.finditer(r'aria-label="([^"]*)"[^>]*role="group"', page):
chunk = page[start : match.start()]
start = match.end()
link = re.search(r'href="/(\w+)/status/(\d+)', chunk)
stamp = re.search(r'"timestamp":(\d+)', chunk)
counts = {word.rstrip("s").replace("replie", "reply"): int(value) for value, word in re.findall(r"(\d+) (\w+)", match.group(1))}
posts.append(
{
"url": f"https://x.com/{link.group(1)}/status/{link.group(2)}",
"time": datetime.fromtimestamp(int(stamp.group(1)) / 1000, timezone.utc).isoformat() if stamp else None,
"pinned": ">Pinned</span>" in chunk[: chunk.find("data-post-avatar")],
"text": text_of(chunk),
"replies": counts.get("reply", 0),
"reposts": counts.get("repost", 0),
"likes": counts.get("like", 0),
"bookmarks": counts.get("bookmark", 0),
"views": counts.get("view"),
}
)
profile = {
"username": meta(page, "profile:username"),
"name": meta(page, "author"),
"bio": meta(page, "description"),
"followers": count(page, "Followers"),
"following": count(page, "Following"),
"posts": meta(page, "twitter:data1"),
"joined": meta(page, "twitter:data2"),
"latest_posts": posts,
}
print(json.dumps(profile, indent=2, ensure_ascii=False))
print(f"@{username}: {profile['followers']} followers, {len(posts)} latest posts with exact counts from one page")GOLOGIN_SCRAPING_API_KEY=your_key node x-posts.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const links = [
'https://x.com/NASA/status/2120305504295510080',
'https://x.com/SpaceX/status/2120808224324510133',
'https://x.com/Spotify/status/2120607242374504556',
];
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: 'us', 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('role="group"')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
throw new Error(`${url} came back without data, try again later`);
}
const meta = (page, name) => page.match(new RegExp(`<meta (?:property|name)="${name}" content="([^"]*)"`))?.[1] ?? '';
const count = (label, word) => Number(label.match(new RegExp(`(\\d+) ${word}`))?.[1] ?? 0);
const posts = [];
for (const url of links) {
const page = await scrape(url);
const label = page.match(/aria-label="([^"]*)"[^>]*role="group"/)[1];
posts.push({
url,
author: meta(page, 'og:title').replace(/ on X$/, ''),
date: meta(page, 'article:published_time').slice(0, 10),
replies: count(label, 'repl'),
reposts: count(label, 'repost'),
likes: count(label, 'like'),
bookmarks: count(label, 'bookmark'),
views: count(label, 'view'),
});
}
writeFileSync('posts.csv', ['url,author,date,replies,reposts,likes,bookmarks,views', ...posts.map((post) => Object.values(post).map((value) => JSON.stringify(value)).join(','))].join('\n'));
console.table(posts);
console.log(`${posts.length} posts in ${posts.length} pages: $${(posts.length * 0.00098).toFixed(4)} on the Growth plan`);GOLOGIN_SCRAPING_API_KEY=your_key node x-accounts.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const accounts = ['NASA', 'NatGeo', 'SpaceX', 'Spotify', 'YouTube'];
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: 'us', 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('role="group"')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const count = (label, word) => Number(label.match(new RegExp(`(\\d+) ${word}`))?.[1] ?? 0);
const rows = [];
for (const account of accounts) {
const page = await scrape(`https://x.com/${account}`);
const followers = page.match(/>([\d.,]+[KMB]?)<\/span>\s*<span[^>]*>Followers</)?.[1] ?? '';
let start = 0;
for (const group of page.matchAll(/aria-label="([^"]*)"[^>]*role="group"/g)) {
const chunk = page.slice(start, group.index);
start = group.index + group[0].length;
const [, author, id] = chunk.match(/href="\/(\w+)\/status\/(\d+)/) ?? [];
const time = chunk.match(/"timestamp":(\d+)/)?.[1];
rows.push({
account,
followers,
post: `https://x.com/${author}/status/${id}`,
date: time ? new Date(Number(time)).toISOString().slice(0, 10) : '',
replies: count(group[1], 'repl'),
reposts: count(group[1], 'repost'),
likes: count(group[1], 'like'),
views: count(group[1], 'view'),
});
}
}
writeFileSync('latest-posts.csv', ['account,followers,post,date,replies,reposts,likes,views', ...rows.map((row) => Object.values(row).map((value) => JSON.stringify(value)).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} posts from ${accounts.length} accounts in ${accounts.length} pages: $${(accounts.length * 0.00098).toFixed(4)} on the Growth plan`);准备好用在您自己的账户上了吗?获取 API 密钥和免费请求额度。
一个账户,一个代理网络,一套生态。按任务需要选择产品。
Twitter 爬虫(现在也叫 X 爬虫)是一种读取 X(原 Twitter)公开页面并将其转成数据的工具:主页的名称、简介、关注者数和最新帖子,帖子的正文、时间、回复数、转帖数、喜欢数和查看次数。Gologin Web Unlocker 是一个 Twitter 爬虫 API:向它发送页面地址,它就返回带有这些数据的页面,每 1,000 个页面 $0.98。
能,而且无需登录。X 会向未登录的访客显示公开主页和帖子,数据就在页面本身里。Web Unlocker 以未登录访客的身份从美国 IP 打开它们,所以您不需要 X 账户、Cookie,也不需要 X API 密钥:在我们的测试中,50 个页面全部带数据返回。
用 requests 库把主页或帖子地址发送给 Web Unlocker,再从页面中读取数字。上面的 Python 标签页是一个完整的 Python Twitter 爬虫,已在真实 API 上测试过:它会输出主页的关注者数和最新 5 条帖子,以及每条帖子精确的喜欢数、转帖数、回复数和查看次数。
能。官方 X API 是读取帖子的一种方式,公开页面是另一种。Web Unlocker 读取页面,所以您不需要开发者账户,不用支付 X API 的费用,也不受它每月 300 万次帖子读取的上限限制。
如果要大规模读取帖子,不能。X API 现在按用量计费:每读取一条帖子 $0.005,每个主页 $0.010,每月最多读取 300 万条帖子。Web Unlocker 附带 1,000 次免费请求,足够采集 1,000 条帖子或主页。
Twitter API 的价格现在就是 X API 的价格,按用量计费:1,000 条帖子 $5.00,1,000 个主页 $10.00。Web Unlocker 无论哪种都按每 1,000 个页面 $0.98 计费,而且一个主页页面已经带有该账户最新 5 条帖子:从 200 个主页获取 1,000 条帖子只需 $0.20。
如果每条帖子都从它自己的链接读取,按每 1,000 个页面 $0.98 计算,需要 $980。如果从主页页面读取,100 万条帖子需要 200,000 个页面、每页 5 条:$196。同样的 100 万条帖子,X API 收费 $5,000。
能。每次请求都会加载实时页面,所以数字就是 X 在那一刻显示的数字:在我们的测试中,同一条 NASA 帖子有 4,337 次喜欢,二十分钟后变成 4,341 次。
用 Web Unlocker 不能。X 只有登录后才会打开搜索页和话题标签页,所以未登录的请求会落到注册页面。请从您关注的账户和帖子入手:它们的页面是公开的,上面的“账户列表”示例可以检查整份账户列表。
部分可以。一个帖子页面带有排在最前面的 3 到 4 条回复,每条都有作者、正文以及精确的喜欢数、转帖数和查看次数。完整的回复列表只有登录后才会显示。
不能以列表形式抓取:谁在关注一个账户,只有登录后才能看到。关注者数是公开的,每个主页都会返回,并按 X 向未登录访客显示的方式四舍五入(92.2M、28M):页面上没有精确数字。每条帖子的数字都是精确的。
最新 5 条,与 X 向未登录访客显示的一致,每条都带有精确的回复数、转帖数、喜欢数、书签数和查看次数。置顶帖子排在最前面,并标注为置顶。更早的帖子请使用它们的链接:每个帖子页面是一次请求。
这取决于您的需求。Apify 的爬虫按关键词搜索,并按每条帖子计费。X API 可以读取所有内容,每 1,000 条帖子 $5。Web Unlocker 以每页一个价格返回带有精确数字的公开主页或帖子页面,在 X 和任何其他站点上都一样。
有。Apify 主要的 Twitter 爬虫只接受搜索,每次查询至少 50 条帖子,并要求您不要重复同一个查询;单条帖子要通过它的 Lite 版本,每个链接 $0.05。Web Unlocker 接受任何主页或帖子链接,每 1,000 个页面 $0.98,想用多少次都行。
无需登录即可加载的主页和帖子都是公开页面。2024 年 5 月,在 X Corp. 诉 Bright Data 一案中,美国联邦法官驳回了 X 就抓取公开数据提起的诉讼。您采集什么、如何使用,由您自己决定,请对照适用于您项目的规则自行核对。
能。智能体把主页或帖子地址发送给同一个 API,再从页面中读取数字。借助 MCP & AI Skills,Claude 可以根据任务描述构建这个工具。
简单介绍一下您的团队,即可获得: