如何爬取Debank动态加载的帖子评论?
爬取Debank帖子全部评论的解决方案
针对Debank虚拟滚动(滚动时旧评论DOM被移除)导致只能获取少量评论的问题,最可靠的方案是直接抓取后端评论API,或通过浏览器DevTools监听网络请求获取完整数据,以下是具体实现:
方法一:直接调用评论API(推荐)
Debank的评论数据通过后端接口异步加载,绕过页面DOM的限制,直接请求接口就能批量获取所有评论。
步骤:
抓包定位评论API:
打开目标帖子页面(如https://debank.com/stream/2057406),按F12打开开发者工具,切换到「Network」标签并筛选「XHR/Fetch」请求。滚动页面加载新评论,找到返回评论列表的接口(通常URL包含stream/{帖子ID}/comments),记录请求参数(如cursor分页游标、limit每页条数)和返回结构(评论数据、下一页游标next_cursor)。编写请求代码:
模拟浏览器请求头(需包含登录后的Cookie,若评论需权限查看),循环请求接口直到无新评论返回:
import requests import json import time # 替换为你的浏览器请求头和登录Cookie headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://debank.com/stream/2057406', 'Cookie': 'your_login_cookie_here' # 从浏览器复制登录后的Cookie字符串 } stream_id = 2057406 all_comments = [] cursor = None limit = 20 # 每页评论数,根据实际接口调整 while True: params = {'limit': limit} if cursor: params['cursor'] = cursor api_url = f'https://api.debank.com/stream/{stream_id}/comments' try: resp = requests.get(api_url, headers=headers, params=params) resp.raise_for_status() data = resp.json() except Exception as e: print(f"请求失败: {e}") break current_comments = data.get('comments', []) if not current_comments: break all_comments.extend(current_comments) cursor = data.get('next_cursor') if not cursor: break time.sleep(1) # 加延迟避免触发限流 # 保存评论到本地文件 with open('debank_comments.json', 'w', encoding='utf-8') as f: json.dump(all_comments, f, ensure_ascii=False, indent=2) print(f"共获取{len(all_comments)}条评论")
方法二:用Selenium监听网络请求
如果API存在签名验证无法直接调用,可以用Selenium配合Chrome DevTools监听所有评论接口的响应,捕获完整数据:
from selenium import webdriver import json import time driver = webdriver.Chrome() # 启用网络监听 driver.execute_cdp_cmd('Network.enable', {}) all_comments = [] # 监听评论接口的响应事件 def capture_comment_response(event): url = event['response']['url'] if f'/stream/2057406/comments' in url: resp_body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': event['requestId']}) data = json.loads(resp_body['body']) all_comments.extend(data.get('comments', [])) driver.add_event_listener('Network.responseReceived', capture_comment_response) # 打开目标页面 driver.get('https://debank.com/stream/2057406') time.sleep(2) # 等待页面初始加载 # 模拟滚动加载所有评论 last_scroll_height = driver.execute_script('return document.body.scrollHeight') while True: driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') time.sleep(2) # 等待新评论加载 new_scroll_height = driver.execute_script('return document.body.scrollHeight') if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height driver.quit() # 保存结果 with open('debank_comments_selenium.json', 'w', encoding='utf-8') as f: json.dump(all_comments, f, ensure_ascii=False, indent=2) print(f"共获取{len(all_comments)}条评论")
关键注意事项
- Cookie权限:部分帖子的评论需要登录才能查看,需从浏览器复制登录后的Cookie到请求头中。
- 限流处理:添加合理的请求延迟,避免触发Debank的反爬机制导致IP被封禁。
- 接口更新:Debank的API可能会迭代,若代码失效需重新抓包确认最新接口参数。
内容的提问来源于stack exchange,提问作者user24899514
相关产品推荐
相关产品推荐

