You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js的Puppeteer库抓取Instagram评论的回复?

抓取Instagram评论及回复的解决方案

完全可以通过监听GraphQL响应获取评论回复,Instagram的API返回中,主评论对象本身就嵌套了对应的回复数据。你的当前代码只是简单拆分响应文本,没有正确解析JSON结构,也未提取嵌套的回复节点,下面是修改后的实现:

核心思路

  1. 正确解析GraphQL响应的JSON数据,而非拆分文本行
  2. 在主评论的edge_threaded_comments字段中提取回复内容
  3. 处理默认折叠的回复: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:50:19