粘贴公开主页、帖子或 Reels 链接。Web Unlocker 无需登录即可返回 Instagram 页面:主页的精确粉丝数和最新 12 条帖子,帖子的精确点赞数、评论数和配文。每 1,000 个页面 $0.98。
1,000 次免费请求 · 仅成功时计费 · 195+ 个国家和地区 · 适配 Claude
简单介绍一下您的团队,即可获得:
公开页面,无需登录,也无需 Instagram 账户。网红营销平台、品牌、社交聆听工具和研究人员读取这四类页面,每个都按 1 页计费。










想亲自试试?领取含 1,000 次免费请求的 API 密钥。
Web Unlocker 对一个主页页面只计费一次,页面带有精确粉丝数和最新 12 条帖子,每 1,000 个页面 $0.98。Apify、Bright Data 和 ScrapeCreators 上的 Instagram 主页爬虫,对同样的主页收费更高。
Apify 每 1,000 个主页收费 $2.60。
这里 1,000 个只需 $1.14。
Instagram 大约每七个主页页面就有一个返回空白。换一个新的网址再请求一次,数据就会返回:上面的价格已计入这些重试。
1,000 个 Instagram 主页的费用
1,000 个带粉丝数和简介的公开主页,按公布价格计算
Gologin:每 1,000 个页面 $0.98,另外大约每七个主页需要一次重试。Bright Data 按每条记录计费,每 1,000 条 $1.50。ScrapeCreators 按每次请求计费,在其 $47 套餐下每 1,000 次 $1.88。Apify 自己的 Instagram 主页爬虫在免费套餐下每 1,000 个主页收费 $2.60。
准备好用在您自己的主页上了吗?获取 API 密钥和免费请求额度。
我们的 Instagram 采集测试:20 个主页,从它们的网格中选取的 20 条帖子和 20 个 Reels,以及 10 个话题标签页面,每个最多请求三次,与上面演示的做法相同。下面是返回的结果和速度。
60 个中有 51 个第一次就返回。
其余 9 个在第二或第三次返回。
Instagram 自己的 API、Apify 的 Instagram 爬虫和 Bright Data 的 Instagram Scraper API:同样 1,000 个主页各自如何计费,以及开始之前对您有什么要求。
| 需要什么 | ||||
|---|---|---|---|---|
| 您按什么付费 | 一页 | 限额内免费 | 每条结果 | 每条记录 |
| 1,000 个主页 | $1.14 | 免费 | $2.60 | $1.50 |
| 个人账户 | 是 | 否 | 是 | 是 |
| 您自己的 Instagram 账户 | 不需要 | 专业账户 | 不需要 | 不需要 |
| 免费开始 | 1,000 次请求 | 需要 Meta 应用 | 每月 $5 | 每月 5,000 条 |
| 整个页面的 HTML | 是 | 否 | 否 | 否 |
要采集的不只是 Instagram?Web Unlocker 以同样的方式、同样的价格返回任何页面。
一个主页页面带来最新 12 条帖子,每个帖子页面带来它精确的点赞数和评论数。13 个页面,$0.0127,您就能逐条看到这位创作者真实的互动数据。
Instagram 把数字四舍五入为 268M。
爬虫返回 268,157,304。
Instagram 把公开页面的数据以 JSON 的形式放在 HTML 里。Web Unlocker 返回这份 HTML,几行代码就能从中读出主页或帖子。“主页列表”标签页是一个小型 Instagram 爬取工具:输入账户列表,输出 CSV。
填写上面的表单。密钥会在一个工作日内通过邮件送达。
主页可获取粉丝数和最新帖子,帖子或 Reels 可获取点赞数和评论数。
检查页面是否带有数据;如果 Instagram 返回的是空页面,就换一个新的网址再请求一次。
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python instagram_profile.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport json
import os
import re
import time
import requests
username = "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)
data = list(blocks(scrape(f"https://www.instagram.com/{username}/", '"follower_count"')))
user = next(item for item in find(data, "xig_user_by_username") if "follower_count" in item)
posts = {}
for timeline in find(data, "polaris_ordered_timeline_connection"):
for edge in timeline["edges"]:
post = edge["node"]
reel = post.get("product_type") == "clips"
posts[post["code"]] = {
"url": f"https://www.instagram.com/{'reel' if reel else 'p'}/{post['code']}/",
"type": "reel" if reel else "post",
"caption": (post.get("caption") or {}).get("text", "").split("\n")[0],
"image": post.get("display_uri"),
}
profile = {
"username": user["username"],
"full_name": user["full_name"],
"biography": user["biography"],
"verified": user["is_verified"],
"followers": user["follower_count"],
"following": user["following_count"],
"latest_posts": list(posts.values())[:12],
}
print(json.dumps(profile, indent=2, ensure_ascii=False))
print(f"@{username}: {profile['followers']:,} followers, {len(profile['latest_posts'])} latest posts from one page")GOLOGIN_SCRAPING_API_KEY=your_key node instagram-engagement.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const username = 'natgeo';
async function scrape(url, marker) {
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(marker)) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
throw new Error(`${url} came back without data, try again later`);
}
function* find(node, test) {
if (Array.isArray(node)) for (const item of node) yield* find(item, test);
else if (node && typeof node === 'object') {
if (test(node)) yield node;
for (const value of Object.values(node)) yield* find(value, test);
}
}
const data = (page) =>
[...page.matchAll(/<script type="application\/json"[^>]*>([\s\S]*?)<\/script>/g)].flatMap(([, json]) => {
try {
return [JSON.parse(json)];
} catch {
return [];
}
});
const profile = data(await scrape(`https://www.instagram.com/${username}/`, '"follower_count"'));
const user = find(profile, (node) => typeof node.follower_count === 'number').next().value;
const codes = [...new Set([...find(profile, (node) => node.code && node.display_uri)].map((post) => post.code))].slice(0, 12);
const posts = [];
for (const code of codes) {
const page = data(await scrape(`https://www.instagram.com/p/${code}/`, '"like_count"'));
const post = find(page, (node) => typeof node.like_count === 'number' && node.code === code).next().value;
posts.push({ url: `https://www.instagram.com/p/${code}/`, date: new Date(post.taken_at * 1000).toISOString().slice(0, 10), likes: post.like_count, comments: post.comment_count });
}
const csv = ['url,date,likes,comments', ...posts.map((post) => `${post.url},${post.date},${post.likes},${post.comments}`)].join('\n');
writeFileSync(`${username}-posts.csv`, csv);
const average = posts.reduce((sum, post) => sum + post.likes + post.comments, 0) / posts.length;
console.table(posts);
console.log(`@${username}: ${user.follower_count.toLocaleString('en-US')} followers, ${Math.round(average).toLocaleString('en-US')} likes and comments a post`);
console.log(`Engagement rate ${((average / user.follower_count) * 100).toFixed(2)}% from ${posts.length + 1} pages: $${((posts.length + 1) * 0.00098).toFixed(4)} on the Growth plan`);GOLOGIN_SCRAPING_API_KEY=your_key node instagram-profiles.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const usernames = ['nasa', 'natgeo', 'nike', 'spotify', 'starbucks', 'redbull'];
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('"follower_count"')) return page;
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return '';
}
const field = (page, name) => page.match(new RegExp(`"${name}":("(?:[^"\\\\]|\\\\.)*"|\\d+|true|false)`))?.[1];
const rows = [];
for (const username of usernames) {
const page = await scrape(`https://www.instagram.com/${username}/`);
rows.push({
username,
name: page && JSON.parse(field(page, 'full_name')),
verified: page && field(page, 'is_verified') === 'true',
followers: page && Number(field(page, 'follower_count')),
following: page && Number(field(page, 'following_count')),
posts: page.match(/([\d.,]+[KMB]?) Posts/)?.[1],
});
}
writeFileSync('profiles.csv', ['username,name,verified,followers,following,posts', ...rows.map((row) => Object.values(row).map((value) => JSON.stringify(value ?? '')).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} profiles in ${rows.length} pages: $${(rows.length * 0.00098).toFixed(4)} on the Growth plan`);准备好用在您自己的主页上了吗?获取 API 密钥和免费请求额度。
一个账户,一个代理网络,一套生态。按任务需要选择产品。
还要采集其他站点?请查看 Facebook、Google Play、Twitter (X)、YouTube、Reddit 和 Google Maps 采集工具,或全部网页采集工具。
Instagram 爬虫是一种读取 Instagram 公开页面并将其转成数据的工具:主页的粉丝数、简介和最新帖子,帖子的点赞数、评论数和配文。Gologin Web Unlocker 是一个 Instagram 爬虫 API:向它发送页面地址,它就返回带有这些数据的页面,每 1,000 个页面 $0.98。
把公开主页、帖子或 Reels 的地址发送给 Web Unlocker。它会按未登录访客看到的样子返回页面,连同 Instagram 以 JSON 形式放在页面里的数据:粉丝数、帖子、点赞数、评论数和配文。上面的代码几行就能读取。
用 requests 库把主页地址发送给 Web Unlocker,再从页面中读取 JSON。上面的 Python 标签页是一份完整的脚本,已在真实 API 上测试过:它会输出主页的粉丝数、关注数、简介和最新 12 条帖子。
只能部分获取。Instagram API 中的 Business Discovery 可以读取商业账户和创作者账户,但只能通过 Meta 应用从您自己的专业账户读取。个人账户不在范围内,话题标签搜索每周最多 30 个标签。旧的 Basic Display API 已于 2024 年 12 月 4 日停止服务。
能。公开主页、帖子、Reels 和话题标签的热门页面无需登录即可加载。Web Unlocker 以未登录访客的身份打开它们,所以您不需要 Instagram 账户,也不会让自己的任何账户承担风险。私密主页仍然无法查看:其帖子只对获批准的粉丝开放。TikTok 也是同样的方式:TikTok 爬虫无需登录即可读取公开主页和视频。
Instagram 时不时会发送一个不含数据的页面:在我们的测试中,大约每七个主页页面就有一个。上面的演示和代码示例会检查数据,并换一个新的网址再请求一次。帖子和 Reels 在 40 次中有 36 次第一次就返回。
不能以列表形式抓取:一个账户的粉丝列表只对已登录用户开放。精确的粉丝数是公开的,Web Unlocker 会在每个主页中返回它。
评论数可以:每个帖子和 Reels 页面都带有精确的数字。评论内容本身只为已登录用户加载,所以 Web Unlocker 不会返回它们。
对于许多话题标签,Instagram 会向未登录访客显示一个热门页面,其中有 12 个热门 Reels 及其播放次数,Web Unlocker 会返回这个页面。话题标签的完整动态只对已登录用户开放。
能。主页页面上的每条帖子和每个帖子页面都带有其图片文件的链接,所以您的代码可以把它们保存下来。
每 1,000 个页面 $0.98,每个页面价格相同:一个带最新 12 条帖子的主页算 1 页,一条帖子算 1 页。失败的请求不收费。套餐每月 $49 起,含 50,000 次请求。
Web Unlocker 附带 1,000 次免费请求,足够采集 1,000 个主页或帖子。Instaloader 和 instagrapi 等开源工具是免费的:它们运行在您自己的服务器上,常常需要登录 Instagram,而且在 Instagram 变化时让它们保持正常运行要靠您自己。
这取决于您的需求。Instagram API 对您能从自己账户访问到的商业账户和创作者账户免费。Apify 和 Bright Data 出售现成的数据行,并按每条结果计费。Web Unlocker 以每页一个价格返回整个公开页面,在 Instagram 和任何其他站点上都一样。
有。Apify 的 Instagram 主页爬虫在免费套餐下每 1,000 个主页收费 $2.60。Web Unlocker 返回同样的公开主页页面,带有精确粉丝数和最新 12 条帖子,每 1,000 个主页 $1.14,已计入重试。
无需登录即可加载的主页、帖子和 Reels 都是公开页面。2024 年 1 月,在 Meta 诉 Bright Data 一案中,美国联邦法院认定 Meta 的条款并不禁止在未登录状态下抓取公开数据。您采集什么、如何使用,由您自己决定,请对照适用于您项目的规则自行核对。
简单介绍一下您的团队,即可获得: