0

0

使用 Python 完整抓取 Instagram 单篇帖子全部评论的实战教程

碧海醫心

碧海醫心

发布时间:2026-02-03 17:16:01

|

879人浏览过

|

来源于php中文网

原创

使用 Python 完整抓取 Instagram 单篇帖子全部评论的实战教程

本文详解如何绕过 instaloader 的评论数量限制,通过模拟浏览器+graphql api 调用,稳定获取 instagram 公开帖的全部评论(含嵌套回复),附完整可运行代码与关键注意事项。

Instagram 官方未开放公开评论的完整 API 接口,且 instaloader 默认仅拉取前 100 条顶层评论(不包含子回复),也无法自动翻页加载更多。要获取全部评论(含深层嵌套、点赞数、时间戳、用户信息等),需结合浏览器自动化与 Instagram 内部 GraphQL 查询机制——这是当前最稳定、免依赖第三方账号权限的方案。

✅ 核心原理说明

Instagram 网页版在加载评论时,实际向以下 GraphQL 端点发起请求:

https://www.instagram.com/graphql/query/?query_hash={hash}&variables={encoded_json}

其中 query_hash 是固定哈希值(对应“获取帖子评论”逻辑),variables 包含 shortcode 及分页/深度参数。我们通过 Selenium 模拟登录后访问该 URL,即可获得结构化 JSON 响应。

Upscale
Upscale

AI图片放大工具

下载

✅ 完整可运行代码(含错误处理与注释)

import json
import time
from urllib.parse import quote, urlparse
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

def extract_shortcode(url: str) -> str:
    """从 Instagram 帖子 URL 提取 shortcode(如 C2SGS95NQH_)"""
    path = urlparse(url).path.strip('/')
    if path.startswith('p/'):
        return path.split('/')[1]
    raise ValueError("Invalid Instagram post URL format")

def build_graphql_url(shortcode: str) -> str:
    """构建 GraphQL 请求 URL,启用全量评论加载"""
    variables = {
        "shortcode": shortcode,
        "child_comment_count": 10000,      # 子回复上限(每条评论下的回复)
        "fetch_comment_count": 10000,       # 首次加载的顶层评论数
        "parent_comment_count": 10000,       # 顶层评论总数(用于分页)
        "has_threaded_comments": True
    }
    query_hash = "b3055c01b4b222b8a47dc12b090e4e64"
    encoded_vars = quote(json.dumps(variables))
    return f"https://www.instagram.com/graphql/query/?query_hash={query_hash}&variables={encoded_vars}"

def setup_driver() -> webdriver.Chrome:
    """配置无头 Chrome 驱动(推荐关闭 headless 以便手动登录)"""
    options = Options()
    options.add_argument("--start-maximized")
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options)
    # 隐藏 WebDriver 特征(降低被识别为爬虫概率)
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
        'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
    })
    return driver

def wait_for_manual_login(driver: webdriver.Chrome):
    """暂停等待用户完成 Instagram 登录(关键步骤)"""
    print("✅ 请在打开的浏览器中手动登录 Instagram 账号...")
    print("⚠️  登录后,请确保页面跳转至目标帖子(如 https://www.instagram.com/p/...)")
    input("按回车键继续 → ")

def fetch_comments_data(driver: webdriver.Chrome, graphql_url: str) -> dict:
    """访问 GraphQL URL 并解析返回的 JSON 数据"""
    try:
        driver.get(graphql_url)
        # 等待 
 标签加载(GraphQL 响应直接渲染为 pre 标签)
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.TAG_NAME, "pre"))
        )
        soup = BeautifulSoup(driver.page_source, "html.parser")
        pre_tag = soup.find("pre")
        if not pre_tag or not pre_tag.text.strip():
            raise RuntimeError("GraphQL response not found in 
 tag")
        return json.loads(pre_tag.text)
    except Exception as e:
        raise RuntimeError(f"Failed to fetch comments: {e}")

def save_comments_to_file(data: dict, filename: str = "instagram_comments.json"):
    """保存原始响应数据到 JSON 文件(便于后续解析)"""
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(data, f, indent=2, ensure_ascii=False)
    print(f"✅ 评论数据已保存至 {filename}")

# —— 主流程 ——
if __name__ == "__main__":
    POST_URL = "https://www.instagram.com/p/C2SGS95NQH_/"  # 替换为你需要的帖子链接

    try:
        shortcode = extract_shortcode(POST_URL)
        print(f"? 解析 shortcode: {shortcode}")

        driver = setup_driver()
        driver.get(POST_URL)
        wait_for_manual_login(driver)

        graphql_url = build_graphql_url(shortcode)
        print(f"? 正在请求 GraphQL 接口: {graphql_url[:80]}...")

        comments_data = fetch_comments_data(driver, graphql_url)
        save_comments_to_file(comments_data)

        # ✨ 示例:提取前 5 条顶层评论(含用户名、文本、时间、子回复数)
        edges = comments_data.get("data", {}).get("shortcode_media", {}).get("edge_media_to_parent_comment", {}).get("edges", [])
        print(f"\n? 获取到 {len(edges)} 条顶层评论示例:")
        for i, edge in enumerate(edges[:5]):
            node = edge["node"]
            username = node["owner"]["username"]
            text = node["text"][:60] + "..." if len(node["text"]) > 60 else node["text"]
            created_at = node["created_at"]
            reply_count = node["edge_comment_to_child_comment"]["count"]
            print(f"[{i+1}] @{username} ({time.strftime('%Y-%m-%d', time.gmtime(created_at))}): {text} [回复数: {reply_count}]")

    except Exception as e:
        print(f"❌ 执行出错: {e}")
    finally:
        driver.quit()

⚠️ 关键注意事项

  • 必须手动登录:Instagram 对未登录会话返回空评论,且登录状态需保持(Session Cookie 有效);
  • 反爬策略:代码已加入 WebDriver 特征隐藏,但仍建议使用真实账号、避免高频请求(单帖间隔 ≥ 5 秒);
  • 评论结构:返回 JSON 中 data.shortcode_media.edge_media_to_parent_comment.edges 为顶层评论列表;每个 node.edge_comment_to_child_comment.edges 为该评论下的嵌套回复;
  • 合规提醒:仅限抓取公开帖子,遵守 Instagram Terms of Use 及 GDPR/CCPA 相关条款,禁止存储敏感用户信息或用于商业群发。

✅ 后续建议

  • 如需持续采集,可封装为函数支持批量 URL 输入;
  • 结合 instaloader 获取帖子元数据(发布时间、点赞数、作者信息),与评论数据关联分析;
  • 对大规模评论做情感分析时,建议先清洗(过滤 emoji、URL、广告词)再送入 NLP 模型。

掌握此方法,你将能可靠获取任意公开 Instagram 帖子的全量、结构化评论数据,为舆情分析、用户行为研究提供坚实基础。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

20

2026.01.21

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

425

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

538

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6434

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

352

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

415

2024.02.23

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

4

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号