Python爬取头条新闻评论时返回信息为空,如何解决?

我在爬头条新闻评论时遇到一个奇怪的问题,用 postman 模拟请求可以正常获得数据, 但用 python requests 模块写的请求获取到的数据总是空的,有返回信息,但里面没有有用的价值。 接口类似于这种: https://www.toutiao.com/api/comment/list/?group_id=6533396129860551182&item_id=6533396129860551182

postman 返回数据: { message: "success", data: { has_more: true, total: 65, comments: [ { text: "充电一回,能用半年,我们就买。", digg_count: 293, reply_data: { reply_list: [ ] }, ....省略很多}

python 程序返回数据: {"message": "success", "data": { "has_more": false, "total": 0, "comments": []}}


Python爬取头条新闻评论时返回信息为空,如何解决?

6 回复

抓 postman 和 py 请求的数据包,比较有啥不同,然后慢慢改


遇到爬取头条评论返回空数据的问题,通常是因为请求缺少必要的参数或头信息。头条的评论接口一般是动态加载的,需要模拟真实浏览器的请求。下面是一个可运行的示例,重点在于构造完整的请求:

import requests
import json

def fetch_toutiao_comments(news_id, max_count=20):
    """
    获取头条新闻评论
    news_id: 新闻ID(从新闻URL中提取)
    max_count: 想获取的评论数量
    """
    # 评论API地址(需要根据实际情况调整)
    url = f'https://www.toutiao.com/article/v2/tab_comments/'
    
    # 关键参数
    params = {
        'aid': 24,  # 固定值
        'group_id': news_id,  # 新闻ID
        'item_id': news_id,
        'offset': 0,
        'count': max_count,
        'sort': 'new',  # 按时间排序
    }
    
    # 必须的请求头(缺少这些会返回空)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Referer': f'https://www.toutiao.com/article/{news_id}/',
        'Accept': 'application/json, text/javascript',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
    }
    
    try:
        resp = requests.get(url, params=params, headers=headers, timeout=10)
        resp.raise_for_status()
        
        data = resp.json()
        # 解析评论数据
        if data.get('data') and data['data'].get('comments'):
            comments = data['data']['comments']
            for cmt in comments:
                print(f"用户: {cmt.get('user_name', '')}")
                print(f"评论: {cmt.get('text', '')}")
                print("-" * 40)
            return comments
        else:
            print("未找到评论数据,响应结构:", json.dumps(data, indent=2, ensure_ascii=False))
            return []
            
    except Exception as e:
        print(f"请求失败: {e}")
        return []

# 使用示例
if __name__ == '__main__':
    # 替换成你要爬取的新闻ID
    news_id = "1234567890"  # 示例ID,需要从实际新闻URL获取
    fetch_toutiao_comments(news_id)

关键点说明:

  1. 获取正确的news_id:从新闻页URL中提取,通常是数字ID
  2. 必须的请求头User-AgentReferer是必须的,缺少会导致空响应
  3. 参数验证aid=24是固定值,group_iditem_id通常相同
  4. 响应处理:检查返回的JSON结构,头条的评论通常在data.comments路径下

调试建议:

  • 先用浏览器开发者工具查看真实的评论请求,复制完整的URL和headers
  • 如果还是返回空,尝试添加Cookie(可能需要登录状态)
  • 注意频率控制,避免被封IP

总结:检查请求参数和头信息是否完整。

UA 问题吧

估计没带 UA

如果 UA 是 PC 浏览器,如果没有登录,头条是限制评论显示的,不仅禁评,还不给你看,逼用户装手机 app。。。

检查一下 cookies 和 user-agent,使用代理 IP,抓取信息的时候一定要带上

回到顶部