项目文件夹

文件
2026-07-13 21:35:51 +08:00

2.8 KiB

name, description
name description
reddit-fetch 使用 curl JSON API 从 Reddit 抓取内容。适用于访问 Reddit URL、在 Reddit 上研究话题,或当 Reddit 返回 403/拦截错误时使用。

Reddit 抓取

Reddit 的公开 JSON API 通过在任意 Reddit URL 后附加 .json 即可调用。

获取热门/最新/置顶帖子

curl -s -L -H "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" \
  "https://old.reddit.com/r/SUBREDDIT/hot.json?limit=15"

根据需要将 hot 替换为 newtoprising。若为 top,可添加 &t=day(或 weekmonthyearall)。

获取特定帖子及其评论

curl -s -L -H "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" \
  "https://old.reddit.com/r/SUBREDDIT/comments/POST_ID.json?limit=20"

返回结果为 JSON 数组:[0] 为帖子主体,[1] 为评论树。

在子版块内搜索

curl -s -L -H "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" \
  "https://old.reddit.com/r/SUBREDDIT/search.json?q=QUERY&restrict_sr=on&sort=new&limit=15"

解析 JSON

使用 jq 提取所需内容:

# 列出帖子
curl -s -L -o /tmp/reddit_result.txt -w "%{http_code}" \
  -H "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" \
  'https://old.reddit.com/r/SUBREDDIT/hot.json?limit=15'

jq -r '.data.children[] | .data | "\(.title)\n   \(.score) pts | \(.num_comments) comments | u/\(.author) | id: \(.id)\n"' /tmp/reddit_result.txt

# 列出特定帖子的评论([1] 元素包含评论)
jq -r '.[1].data.children[] | select(.kind == "t1") | .data | "u/\(.author) (\(.score) pts):\n  \(.body[:300])\n"' /tmp/reddit_thread.txt

关键细节:

  • 先抓取到临时文件再解析——避免管道相关的编码问题
  • -o /tmp/file-w "%{http_code}" 用于保存响应内容并输出 HTTP 状态码(调试空响应时很有用)
  • -L 跟随重定向(old.reddit.com 有时会重定向)
  • 使用单引号包裹 URL 可避免 shell 对查询字符串中的 & 进行解释
  • .body[:300] 用于截断长评论正文(jq 1.7+

频率限制

Reddit 的 JSON API 对频率限制较为严格:

  • 不要发起并行请求。 应依次执行,每次请求之间使用 sleep 2sleep 3 暂停。
  • 如果请求返回空内容(0 字节),等待 3–5 秒后重试。
  • 如果收到 HTTP 429,暂停 10–15 秒。
  • 推荐模式:先抓取一个搜索结果列表并解析,然后逐个抓取单个帖子,每次之间加入延时。