如何抓取Instagram:个人资料、帖子、评论等
Advanced Data Extraction Specialist
TL;DR:
- Instagram 通过其内部 JSON API 进行渲染——所以直接调用它们。 个人主页通过
web_profile_info被加载;帖子和评论来自 GraphQL 端点。您在渲染的会话内获取 JSON,而不是抓取 DOM。 - API 调用生效的两个要素:
x-ig-app-id头和页面的 cookies。 首先加载instagram.com以使会话拥有 cookies,然后在页面内部通过fetch()调用 API,设置credentials: 'include'和 app-id 头。 - 地区和真实浏览器是必需的。 Instagram 强烈依赖 IP 声誉和指纹;来自一个出口的同一调用在另一个出口是正常的。固定
proxyCountry并在反检测浏览器上运行。 - 您返回的是结构化对象,而不是 HTML。
web_profile_info返回完整的user对象——粉丝、关注、帖子计数、验证、个人简介——完全按照 Instagram 自己前端所需的格式。 - 一个模式覆盖个人资料、帖子和评论。 创建一个会话,访问匹配的内部端点,解析 JSON。表面会变化;技术则不会。
- 免费开始。 新的 Scrapeless 账户包括免费的抓取浏览器运行时——可在 app.scrapeless.com 注册。
介绍:通过其 API 抓取 Instagram
Instagram 的网页是通过内部 JSON 端点加载的 React 外壳。抓取渲染的 DOM 是困难且脆弱的方式——选择器会变化,而且大多数数据甚至不在初始标记中。可靠的方法是调用前端调用的相同端点:个人资料使用 web_profile_info,帖子及其评论使用 GraphQL 查询。它们返回干净、结构化的 JSON。
问题在于这些端点只会响应看起来是来自 Instagram 网页应用的请求。这意味着三点:请求携带 x-ig-app-id 头,包括会话的 cookies,并且起始于一个 Instagram 信任的 IP 和浏览器指纹。错过任何一项,您将得到一个空响应或一个检查点。
本指南基于 Scrapeless 抓取浏览器运行——反检测的 Chromium 通过住宅出口——通过 CDP 连接到 Puppeteer。您加载 instagram.com 以获取真实会话,然后从页面内部调用其内部 API。下面的个人资料提取是实时捕获的。仅公开数据。
您可以用它做什么
- 拉取个人资料——粉丝、关注、帖子计数、验证、个人简介、外部链接。
- 通过短代码获取单个帖子,包含其媒体、标题和统计数据。
- 收集帖子的评论,包括作者、文本和点赞计数。
- 按分页浏览用户的帖子,通过时间线端点。
- 按规模丰富个人资料,通过在句柄列表上循环调用个人资料接口。
为什么选择 Scrapeless 抓取浏览器
Scrapeless 抓取浏览器是一个可定制的、反检测的云浏览器,专为网络爬虫和 AI 代理设计。专门针对 Instagram,它提供:
- 自开发的 Chromium——一个真正的浏览器,启动会话并保持 API 调用所需的 cookies。
- 反检测指纹技术——请求看起来像是 Instagram 网页应用,因此内部端点响应,而不是返回检查点。
- 覆盖 195 个国家的住宅代理——按国家固定出口;正确的地区才会获得干净响应。
- 可配置的会话 TTL——使会话在多个端点调用之间保持活跃。
- 标准 Puppeteer 连接——使用 SDK 创建会话,然后通过 CDP 进行
puppeteer.connect();其余就是普通的 Puppeteer。
在免费的计划中获取 API 密钥,访问 app.scrapeless.com。
先决条件
- Node.js 18 或更高版本
- 一个 Scrapeless 账户和 API 密钥——在 app.scrapeless.com 注册
- 熟悉 Puppeteer 和 JSON 的基础知识
安装
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
第 1 步——创建会话并加载 Instagram
SDK 创建云会话;Puppeteer 通过 CDP 连接。首先导航到 instagram.com 是为了给会话提供内部 API 所需的 cookies:
javascript
import { Scrapeless } from '@scrapeless-ai/sdk';
import puppeteer from 'puppeteer-core';
const client = new Scrapeless({ apiKey: process.env.SCRAPELESS_API_KEY });
const { browserWSEndpoint } = await client.browser.create({
proxyCountry: 'US', // 固定出口——地区影响 API 的响应
sessionTTL: 180,
});
const browser = await puppeteer.connect({ browserWSEndpoint });
const page = await browser.newPage();
javascript
await page.goto('https://www.instagram.com/', {
waitUntil: 'domcontentloaded',
timeout: 60000,
});
如果调用卡住或返回空结果,请在更改其他内容之前先切换 proxyCountry —— 区域是最常见的原因。
第2步 — 从 web_profile_info 抓取个人资料
在会话保持活跃的情况下,从页面内 fetch() 个人资料端点。两个关键的细节是 x-ig-app-id 头部和 credentials: 'include'(以便页面的 cookies 也能传递):
javascript
const user = await page.evaluate(async (username) => {
const res = await fetch(
`https://i.instagram.com/api/v1/users/web_profile_info/?username=${username}`,
{
headers: { 'x-ig-app-id': '936619743392459' }, // 公共 Web 应用 ID
credentials: 'include',
},
);
const data = JSON.parse(await res.text());
return data.data.user;
}, 'nasa');
console.log({
username: user.username,
full_name: user.full_name,
verified: user.is_verified,
followers: user.edge_followed_by.count,
following: user.edge_follow.count,
posts: user.edge_owner_to_timeline_media.count,
});
// {
// username: 'nasa',
// full_name: 'NASA',
// verified: true,
// followers: 104420451,
// following: 91,
// posts: 4817
// }
这将准确返回 Instagram 的完整 user 对象 — 其结构与其前端呈现的结构相同。
在免费计划中获取您的 API 密钥: app.scrapeless.com
第3步 — 通过 GraphQL 获取帖子和评论
单个帖子及其评论来自 Instagram 的 GraphQL 端点。形态相同 — 从页面内 fetch() — 但这是一个 POST 请求,变量中包含帖子的短代码:
javascript
const shortcode = 'C1234567abc'; // 来自 instagram.com/p/<shortcode>/
const post = await page.evaluate(async (shortcode) => {
const variables = JSON.stringify({ shortcode });
// doc_id 标识 Web 应用使用的持久化 GraphQL 查询
const body = `variables=${encodeURIComponent(variables)}&doc_id=YOUR_DOC_ID`;
const res = await fetch('https://www.instagram.com/graphql/query', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body,
credentials: 'include',
});
return JSON.parse(await res.text());
}, shortcode);
doc_id 是 Instagram 前端发送的持久查询 ID;从真实帖子视图的网络面板中捕获当前的 ID。从响应中读取媒体对象(xdt_shortcode_media)以获取标题、媒体 URL 和评论边缘。
您获得的返回
个人资料调用返回 Instagram 的 user 对象。以下形态是一个真实捕获;计数随着时间变化:
json
{
"username": "nasa",
"full_name": "NASA",
"is_verified": true,
"is_private": false,
"biography": "Making the seemingly impossible, possible...",
"external_url": "https://...",
"edge_followed_by": { "count": 104420451 },
"edge_follow": { "count": 91 },
"edge_owner_to_timeline_media": { "count": 4817 }
}
// 来自 web_profile_info 的真实捕获 (@nasa)。完整的用户对象包含更多字段;根据需要读取所需字段。
一些诚实的观察:
user对象很大。 它包括业务标志、AI 代理字段、高亮计数等 — 读取必要的部分,忽略其余部分。- 计数存储在
edge_*.count中。 粉丝、关注和帖子分别嵌套在edge_followed_by、edge_follow和edge_owner_to_timeline_media下。 - 私人帐户返回个人资料框架,但不返回媒体。 在期望帖子之前检查
is_private。 - 区域与头部一样重要。 固定
proxyCountry;不幸的区域是身体为空的常见原因。
结论:调用 Instagram 已经公开的 API
干净地抓取 Instagram 意味着从真实、活跃的会话中调用其内部 JSON 端点 — web_profile_info 用于个人资料,GraphQL 用于帖子和评论 — 配置 x-ig-app-id 头部和页面自己的 cookies。使用 Scrapeless Scraping Browser 进行这些调用是有效的:反检测的 Chromium 加上住宅出访,因此 Instagram 把请求当作其自己的 Web 应用。有关在其他社交平台上使用相同 SDK-over-CDP 模式的信息,请参见 TikTok 抓取指南;抓取浏览器产品页面 和 文档 涵盖了完整的 SDK 功能。固定区域,保持会话活跃,发送应用 ID 头部,并读取 JSON。
准备好构建您的 AI 驱动的数据管道了吗?
加入我们的社区,获取免费计划,并与构建社交数据管道的开发者连接:Discord · Telegram。
在 app.scrapeless.com 注册以获取免费的抓取浏览器运行时,并将上述模式调整为您的工作流程所需的个人资料、帖子和标签。请查看 定价 以获取规模信息。
常见问题
问:抓取 Instagram 合法吗?
收集公开可见的数据通常是被允许的,但 Instagram 的服务条款适用,各个司法管辖区的规则有所不同。仅抓取公共数据,查看服务条款,并针对您的用例咨询律师。
问:为什么个人资料 API 返回空响应或检查点?
通常有三种情况:缺少 x-ig-app-id 头部、没有会话 Cookie(您未先加载 instagram.com)、或 Instagram 不信任的出口地区。发送头部,使用 credentials: 'include',并固定 proxyCountry。
问:我需要登录吗?
对于公共个人资料和帖子,网络应用的端点可以响应匿名但暖启动的会话。已登录的抓取属于不同的高风险路径;本指南仅针对公共数据。
问:帖子中的 doc_id 从哪里来?
它是 Instagram 前端发送到 GraphQL 的持久化查询 ID。请在真实的帖子视图中查看网络面板上的当前值——它会随时间而变化。
问:我需要代理吗?
是的。Instagram 对 IP 声誉非常重视;通过 proxyCountry 固定住宅出口,以便内部端点作出响应。
问:我可以发出多少请求?
保持适度——每个地区少量会话和调用之间留有延迟——以确保 IP 声誉信号保持清晰。
问:我可以在没有 AI 代理的情况下运行吗?
可以。这是 Scrapeless SDK 加上简单的 Puppeteer 通过 CDP——不需要代理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



