如何用Node.js的Puppeteer库抓取Instagram评论的回复?
抓取Instagram评论及回复的解决方案
完全可以通过监听GraphQL响应获取评论回复,Instagram的API返回中,主评论对象本身就嵌套了对应的回复数据。你的当前代码只是简单拆分响应文本,没有正确解析JSON结构,也未提取嵌套的回复节点,下面是修改后的实现:
核心思路
- 正确解析GraphQL响应的JSON数据,而非拆分文本行
- 在主评论的
edge_threaded_comments字段中提取回复内容 - 处理默认折叠的回复:Instagram会隐藏部分回复,需要触发加载更多操作
修改后的代码
const puppeteer = require("puppeteer"); const getComment = async ({ link }) => { const mainResponse = { comments: [] }; const launchOptions = { headless: false }; const browser = await puppeteer.launch(launchOptions); const page = await browser.newPage(); // 监听GraphQL响应,提取评论数据 page.on('response', async (response) => { const url = response.url(); // 过滤评论相关的GraphQL请求 if (url.includes('graphql') && url.includes('query_hash')) { try { const data = await response.json(); // 定位主评论列表 const commentEdges = data?.data?.shortcode_media?.edge_media_to_parent_comment?.edges; if (commentEdges) { commentEdges.forEach(commentEdge => { const mainComment = { text: commentEdge.node.text, username: commentEdge.node.owner.username, // 提取该主评论的回复 replies: commentEdge.node.edge_threaded_comments.edges.map(replyEdge => ({ text: replyEdge.node.text, username: replyEdge.node.owner.username })) }; mainResponse.comments.push(mainComment); }); } } catch (err) { // 跳过非JSON格式的响应 } } }); await page.goto(link, { waitUntil: 'networkidle2' }); // 处理折叠的回复:点击所有"查看更多回复"按钮 const loadMoreReplyButtons = await page.$$('button:has-text("查看更多回复")'); for (const button of loadMoreReplyButtons) { try { await button.click(); await page.waitForTimeout(1000); // 等待加载完成 } catch (err) { // 处理按钮不可点击的情况 } } await browser.close(); return mainResponse; };
关键说明
- 解析JSON:直接将响应解析为JSON对象,才能访问嵌套的评论和回复结构
- 回复节点位置:每个主评论的
node.edge_threaded_comments.edges就是该评论的所有回复列表 - 加载更多回复:默认情况下,超过一定数量的回复会被折叠,需要点击对应按钮触发加载,确保获取完整回复
- 请求过滤:通过
query_hash判断是否为评论请求,避免处理无关的GraphQL响应
内容的提问来源于stack exchange,提问作者ferdinand
相关产品推荐
相关产品推荐

