skillhub-040-reddit-fetch
2.8 KiB
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 替换为 new、top 或 rising。若为 top,可添加 &t=day(或 week、month、year、all)。
获取特定帖子及其评论
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 2或sleep 3暂停。 - 如果请求返回空内容(0 字节),等待 3–5 秒后重试。
- 如果收到 HTTP 429,暂停 10–15 秒。
- 推荐模式:先抓取一个搜索结果列表并解析,然后逐个抓取单个帖子,每次之间加入延时。