粘贴公开的 Facebook 主页、帖子或 Reels 链接。Web Unlocker 无需登录即可返回:主页的精确粉丝数,以及最新帖子的心情数、评论数和分享数。每 1,000 个页面 $0.98。
1,000 次免费请求 · 仅成功时计费 · 195+ 个国家和地区 · 适配 Claude
简单介绍一下您的团队,即可获得:
公开页面,无需登录,也无需 Facebook 账户。品牌监测团队、代理机构和销售团队读取这三类页面,每个都按 1 页计费。



想亲自试试?领取含 1,000 次免费请求的 API 密钥。
Web Unlocker 对一个 Facebook 主页只计费一次,页面带有精确粉丝数和最新帖子,每 1,000 个页面 $0.98。Apify、Bright Data 和 ScrapeCreators 上的 Facebook 主页爬虫,对同样的主页收费更高。
Apify 每 1,000 个主页收费 $12.00。
这里 1,000 个只需 $0.98。
失败的请求不收费。当 Web Unlocker 暂时不可用时,上面的演示和代码示例会再请求一次,只有成功返回的页面才计费。
1,000 个 Facebook 主页的费用
1,000 个带粉丝数和最新帖子的公共主页,按公布价格计算
Gologin:Growth 套餐每 1,000 个页面 $0.98。Bright Data 按每条记录计费,每 1,000 条 $1.50。ScrapeCreators 按每次请求计费,在其 $47 套餐下每 1,000 次 $1.88。Apify 自己的 Facebook Pages Scraper 在免费套餐下每 1,000 个主页收费 $12.00。
准备好用在您自己的主页上了吗?获取 API 密钥和免费请求额度。
我们的 Facebook 采集测试:20 个品牌主页、通过 Facebook 公开嵌入获取的 14 条帖子和 10 个 Reels,每个最多请求三次。
44 个中有 37 个第一次就返回。
另有 6 个在第二次返回。
Facebook 的 Graph API、Apify 的 Facebook 爬虫和 Bright Data 的 Facebook Scraper API:同样 1,000 个主页各自如何计费,以及开始之前对您有什么要求。
| 需要什么 | ||||
|---|---|---|---|---|
| 您按什么付费 | 一页 | 限额内免费 | 每条结果 | 每条记录 |
| 1,000 个主页 | $0.98 | 免费 | $12.00 | $1.50 |
| 应用审核和企业验证 | 否 | 是 | 否 | 否 |
| 您自己的 Facebook 账户 | 不需要 | Meta 应用 | 不需要 | 不需要 |
| 通过链接获取主页的全部帖子 | 仅最新一条 | 审核通过后 | 是 | 是 |
| 按类型区分的心情 | 仅总数 | 是 | 是 | 是 |
| 免费开始 | 1,000 次请求 | 应用审核后 | 每月 $5 | 每月 5,000 条 |
| 整个页面的 HTML | 是 | 否 | 否 | 否 |
要采集的不只是 Facebook?Web Unlocker 以同样的方式、同样的价格返回任何页面。
每个主页一次请求,带回它的精确粉丝数,以及最新帖子的心情数和评论数。100 个品牌主页,100 次请求,$0.098。
Facebook 把 NASA 的粉丝数四舍五入为 28M。
爬虫返回 28,728,835。
Facebook 把公共主页的数据以 JSON 的形式放在 HTML 里。Web Unlocker 返回这份 HTML,几行代码就能从中读出主页或帖子。“品牌主页”标签页是一个处理列表的小型 Facebook 主页爬虫:输入主页名称,输出 CSV。
填写上面的表单。密钥会在一个工作日内通过邮件送达。
主页可获取粉丝数和最新帖子,帖子或 Reels 可获取点赞数、评论数和分享数。帖子通过 Facebook 的公开嵌入获取。
检查页面是否带有数据;如果 Web Unlocker 暂时不可用,就换一个新的网址再请求一次。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python facebook_page.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html
import json
import os
import re
import time
from datetime import datetime, timezone
import requests
page_url = "https://www.facebook.com/NASA/"
def scrape(url, marker):
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 marker in page:
return page
time.sleep(3)
raise RuntimeError("The page came back without data, try again later")
def blocks(page):
for block in re.findall(r'<script type="application/json"[^>]*>(.*?)</script>', page, re.S):
try:
yield json.loads(block)
except json.JSONDecodeError:
pass
def find(node, key):
if isinstance(node, dict):
for name, value in node.items():
if name == key:
yield value
yield from find(value, key)
elif isinstance(node, list):
for item in node:
yield from find(item, key)
def first(node, key, field):
return next(item for item in find(node, key) if isinstance(item, dict) and field in item)
page = scrape(page_url, "talking about this")
data = list(blocks(page))
meta = dict(re.findall(r'<meta property="(og:\w+)" content="([^"]*)"', page))
about = html.unescape(meta["og:description"])
count = lambda words: int(re.search(rf"([\d,]+) {words}", about).group(1).replace(",", ""))
details = first(data, "delegate_page", "category_name")
story = first(data, "timeline_list_feed_units", "edges")["edges"][0]["node"]
feedback = first(story, "feedback", "reaction_count")
facebook_page = {
"name": html.unescape(meta["og:title"]),
"followers": count("followers"),
"talking_about_this": count("talking about this"),
"category": details["category_name"],
"intro": details["best_description"]["text"],
"websites": [
item["renderer"]["context_item"]["plaintext_title"]["text"]
for item in find(data, "timeline_context_item")
if item["renderer"]["__typename"] == "WebsiteContextItemRenderer"
],
"latest_post": {
"url": next(find(story, "permalink_url")),
"date": datetime.fromtimestamp(story["creation_time"], timezone.utc).isoformat(),
"text": first(story, "message", "text")["text"],
"reactions": feedback["reaction_count"]["count"],
"comments": first(story, "comments", "total_count")["total_count"],
"shares": feedback["share_count"]["count"],
},
}
print(json.dumps(facebook_page, indent=2, ensure_ascii=False))
print(f"{facebook_page['name']}: {facebook_page['followers']:,} followers and the latest post from one page")GOLOGIN_SCRAPING_API_KEY=your_key node facebook-posts.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const posts = [
'https://www.facebook.com/NASA/posts/pfbid05YJTkWebVNj83FA2ifGfHBxTdYFWuNrAMo4yAKnbRuY9XXK8nXohgsLxADToV4vfl',
'https://www.facebook.com/Starbucks/posts/pfbid02v2F2jafXiaaRi3PAramXqszA3W5rRcJtaF8MXE1s453xiHbK9JJNmMqnuzV5i8Gxl',
'https://www.facebook.com/McDonalds/posts/pfbid04kS5YA29jgtMNfHTQCf8JthvEM71jgVJzQN6L53wU7ck5ocPBY49sdFUcmt6L8Nsl',
'https://www.facebook.com/walmart/posts/pfbid02Tcu3cY8cHDhE43MsF7qSQnUDpvMZux6P7FfFsWswowv5QJTVKMeDou73PW6M5c22l',
'https://www.facebook.com/Spotify/posts/pfbid0WmiXu2TVoUdrNDBEJepHYbrukgikHR6euuvJGuLiVNtvTbXkXFywG5rEKCZcRijhl',
'https://www.facebook.com/adidas/posts/pfbid02zsJxukrC4EagRJPwg958TiWViTm9NSCPETubYgPmazax2DKqhZwaNCHBHHaXntvl',
];
const embed = (post) => `https://www.facebook.com/plugins/post.php?${new URLSearchParams({ href: post, show_text: 'true', width: '500' })}`;
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('data-testid="post_message"')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const count = (page, name) => page.match(new RegExp(`sx_post-plugin_${name}"></i>([^<]+)<`))?.[1] ?? '';
const plain = (html = '') =>
html
.replace(/<\/p>\s*<p>|<br\s*\/?>/g, ' ')
.replace(/<[^>]+>/g, '')
.replace(/&/g, '&')
.replace(/&#(\d+);/g, (_, code) => String.fromCodePoint(code))
.replace(/\s+/g, ' ')
.trim();
const rows = [];
for (const post of posts) {
const page = await scrape(embed(post));
const posted = page.match(/data-utime="(\d+)"/)?.[1];
rows.push({
page: plain(page.match(/<span class="_2_79 _50f7">([^<]+)<|<a title="([^"]+)" class="_5pb8|aria-label="([^"]+)" role="img"/)?.slice(1).find(Boolean)),
date: posted ? new Date(posted * 1000).toISOString().slice(0, 10) : '',
likes: count(page, 'like'),
comments: count(page, 'comment'),
shares: count(page, 'share'),
text: plain(page.match(/data-testid="post_message"[^>]*>([\s\S]*?)<\/div>/)?.[1]).slice(0, 80),
});
}
writeFileSync('posts.csv', [Object.keys(rows[0]).join(','), ...rows.map((row) => Object.values(row).map((value) => JSON.stringify(value)).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} posts in ${rows.length} requests: $${(rows.length * 0.00098).toFixed(4)} on the Growth plan`);GOLOGIN_SCRAPING_API_KEY=your_key node facebook-pages.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const pages = ['NASA', 'Starbucks', 'nike', 'netflix', 'redbull', 'LEGO'];
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('talking about this')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const number = (text) => (text ? Number(text.replaceAll(',', '')) : '');
const rows = [];
for (const name of pages) {
const page = await scrape(`https://www.facebook.com/${name}/`);
const about = page.match(/<meta property="og:description" content="([^"]*)"/)?.[1] ?? '';
const feed = page.slice(page.indexOf('"timeline_list_feed_units"'));
const posted = feed.match(/"creation_time":(\d+)/)?.[1];
rows.push({
page: name,
followers: number(about.match(/([\d,]+) followers/)?.[1]),
talking: number(about.match(/([\d,]+) talking about this/)?.[1]),
category: page.match(/"category_name":"([^"]+)"/)?.[1].replaceAll('\\/', '/') ?? '',
posted: posted ? new Date(posted * 1000).toISOString().slice(0, 10) : '',
reactions: number(feed.match(/"reaction_count":\{"count":(\d+)/)?.[1]),
comments: number(feed.match(/"comments":\{"total_count":(\d+)/)?.[1]),
shares: number(feed.match(/"share_count":\{"count":(\d+)/)?.[1]),
});
}
writeFileSync('pages.csv', [Object.keys(rows[0]).join(','), ...rows.map((row) => Object.values(row).map((value) => JSON.stringify(value)).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} brand pages in ${rows.length} requests: $${(rows.length * 0.00098).toFixed(4)} on the Growth plan`);准备好用在您自己的主页上了吗?获取 API 密钥和免费请求额度。
一个账户,一个代理网络,一套生态。按任务需要选择产品。
Facebook 爬虫是一种读取 Facebook 公开页面并将其转成数据的工具:主页的粉丝数、类别和最新帖子,帖子的文字、点赞数、评论数和分享数。Gologin Web Unlocker 是一个 Facebook 爬虫 API:向它发送主页、帖子或 Reels 的地址,它就返回带有这些数据的页面,每 1,000 个页面 $0.98。
把公共主页或 Reels 的地址发送给 Web Unlocker,帖子则通过 Facebook 的公开嵌入发送。Web Unlocker 会按未登录访客看到的样子返回页面,其中带有数据:粉丝数、最新帖子、心情数、评论数和分享数。上面的代码几行就能读取,并保存为 JSON 或 CSV。
用 requests 库把主页地址发送给 Web Unlocker,再从页面中读取数据。上面的 Python 标签页是一个完整的 Python Facebook 爬虫,已在真实 API 上测试过:它会输出主页的精确粉丝数、类别、网站和最新帖子及其心情数。
有。公共主页属于品牌、组织和公众人物,任何人都能加载,所以 Web Unlocker 会返回它们,包括 facebook.com/profile.php?id=... 这样的链接。个人主页对未登录访客显示的内容很少或没有,本爬虫不涵盖它们。
有,就是 Graph API,但有限制。读取其他公共主页的公开帖子需要 Page Public Content Access 功能,Meta 会在 App Review(应用审核)和企业验证通过后授予。Groups API 已于 2024 年 4 月移除,CrowdTangle 已于 2024 年 8 月关闭。
能。公共主页、帖子和 Reels 无需登录即可加载,Web Unlocker 以未登录访客的身份打开它们:您不需要 Facebook 账户,也不会让自己的任何账户承担风险。私密个人主页和私密小组仍然无法查看。
仅凭主页链接不行:未登录访客只能看到主页的最新帖子或置顶帖子,Web Unlocker 会返回这一条,带有精确的心情数、评论数和分享数。要获取更多帖子,请发送每条帖子的链接:一条帖子一次请求,每 1,000 条 $0.98。
本爬虫不行。小组内的帖子无法通过 Facebook 的公开嵌入返回,私密小组只对成员开放。本页面涵盖主页、帖子和 Reels;Web Unlocker 能以同样的单页价格返回其他公开页面,所以不妨用 1,000 次免费请求试试您的页面。
数量可以:主页会返回其最新帖子的精确心情数、评论数和分享数,Reels 会返回精确的心情数和评论数。通过嵌入获取的帖子显示的是 Facebook 四舍五入后的点赞数,例如 1.4K。完整的评论列表只为已登录用户加载。
每 1,000 个页面 $0.98,每个页面价格相同:一个带最新帖子的主页算 1 页,一条帖子或一个 Reels 也算 1 页。失败的请求不收费。套餐每月 $49 起,含 50,000 次请求。
Web Unlocker 附带 1,000 次免费请求,足够采集 1,000 个主页或帖子。Python 的 facebook-scraper 等开源库是免费的:它们运行在您自己的服务器上,常常需要您的 Facebook Cookie,而且在 Facebook 变化时让它们保持正常运行要靠您自己。
能。只需安装一个技能,Claude Code、Cursor 或任何 MCP 客户端就能通过 Web Unlocker 读取 Facebook 主页。请查看 MCP & AI Skills。
有。Apify 的 Facebook Pages Scraper 在免费套餐下每 1,000 个主页收费 $12.00,它的 Facebook Posts Scraper 每 1,000 条帖子收费 $5.00。Web Unlocker 返回带有精确粉丝数和最新帖子的公共主页,或通过链接返回一条帖子,每 1,000 个 $0.98。
不是。Meta 的 Sharing Debugger(分享调试器)常被称为 Facebook 爬虫,它显示您自己的链接在 Facebook 上分享时的样子,并刷新这个预览:地址是 developers.facebook.com/tools/debug/。像 Web Unlocker 这样的 Facebook 爬虫 API 读取的是 Facebook 公开页面上的数据。
无需登录即可加载的主页、帖子和 Reels 都是公开页面。2024 年 1 月,在 Meta 诉 Bright Data 一案中,美国联邦法院认定 Meta 的条款并不禁止在未登录状态下抓取公开数据。您采集什么、如何使用,由您自己决定,请对照适用于您项目的规则自行核对。
用 Web Unlocker 不需要:它从您所选国家或地区的地址发送每个请求,可在 195+ 个国家和地区中选择,所以您无需自己租用和轮换代理。上面的演示从美国发出请求。
简单介绍一下您的团队,即可获得: