
Reddit页面的评论时间戳无法通过常规BeautifulSoup解析获取,因其由JavaScript动态加载;正确方法是请求Reddit的JSON API接口,解析嵌套的created_utc字段并转换为可读时间。
reddit页面的评论时间戳无法通过常规beautifulsoup解析获取,因其由javascript动态加载;正确方法是请求reddit的json api接口,解析嵌套的`created_utc`字段并转换为可读时间。
Reddit 的前端页面(如 https://www.reddit.com/r/...)采用大量 JavaScript 渲染内容,尤其是评论区——这意味着你通过 requests.get() 获取的 HTML 源码不包含实际评论数据,仅含占位符或初始骨架。这也是为什么使用 BeautifulSoup 查找类名 _3yx4Dn0W3Yunucf5sVJeFU(该类名本身也是动态生成、每次部署可能变更)时始终返回空列表:目标元素根本未存在于原始 HTML 中。
✅ 正确路径:直接调用 Reddit 官方支持的 JSON API
Reddit 为每个帖子提供对应的 .json 接口,只需在原 URL 末尾添加 .json 即可(例如:https://www.reddit.com/r/NewTubers/comments/1bfhcwz/.../.json)。该接口返回结构化 JSON 数据,其中:
- html_json[0] 对应主帖(post)元信息;
- html_json[1] 对应完整评论树(包括所有一级评论及其子评论);
- 每条评论数据位于 html_json[1]['data']['children'][i]['data'] 中;
- 关键时间字段为 'created_utc'(Unix 时间戳,单位:秒)。
以下是生产就绪的完整示例代码(含错误处理、时间排序与 CSV 输出):
import json
import csv
import datetime
from urllib.parse import urljoin
import requests
# 替换为你的目标帖子URL(注意末尾不带.json)
post_url = "https://www.reddit.com/r/NewTubers/comments/1bfhcwz/feedback_friday_post_your_videos_here_if_you_want/"
# 构造JSON API地址(自动补全 .json)
json_url = urljoin(post_url.rstrip('/'), '.json')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
try:
response = requests.get(json_url, headers=headers, timeout=15)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
raise SystemExit(f"❌ 请求失败: {e}")
except json.JSONDecodeError:
raise SystemExit("❌ JSON 解析失败:响应非有效JSON格式(可能被限流或需登录)")
# 提取评论部分(索引1)
if len(data) <p>? <strong>关键注意事项</strong>:</p>
- 必须设置 User-Agent:Reddit 会拒绝无头请求(403 Forbidden),模拟真实浏览器是基本要求;
- .json 接口默认只返回前几层评论(约数百条):若需全部评论(含深层嵌套),需递归请求 more 对象或使用 limit 参数(如 ?limit=1000),或改用 PRAW 库;
- created_utc 是 UTC 时间戳:datetime.fromtimestamp() 默认转为本地时区,建议显式使用 tz=datetime.timezone.utc 并调用 .isoformat() 保证时区明确;
- 不要依赖 HTML 类名:Reddit 频繁更新前端,CSS 类名(如 _3yx4Dn0W3Yunucf5sVJeFU)属内部哈希值,无稳定性保障;
- 反爬与合规性:单次请求间隔 ≥ 2 秒,避免高频调用;遵守 robots.txt(https://www.reddit.com/robots.txt),研究用途建议优先查阅 Reddit API 文档 及申请正式 OAuth 凭据。
? 进阶提示:若需毫秒级精确时间(如悬停显示的“X seconds ago”),created_utc 已足够——其精度为秒,结合服务器响应时间可估算;而完整评论树(含所有子回复)需解析 replies 字段并递归遍历,这超出了基础 JSON 接口能力,此时推荐使用官方 SDK PRAW 或 Selenium + WebDriverWait 动态渲染方案。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










