抓取linux.do帖子指南
抓取 linux.do(LINUX DO)帖子指南
适用场景:用户发来 linux.do 帖子链接,要求抓取帖子内容和评论并保存。
背景
linux.do 是 Discourse 论坛,部署在 Cloudflare 后面。直接用 curl 访问会返回 403,浏览器打开也会卡在 “Just a moment…” 验证页。
Discourse 论坛有内置 JSON API:https://linux.do/t/<topic_id>.json,可以拿到完整帖子数据(HTML、用户名、时间、点赞数等),但 Cloudflare 同样拦截。
核心流程(已验证可行)
1. navigate → linux.do 帖子页面2. set_user_agent → desktop_safari(关键!触发 Cloudflare 自动验证)3. wait_for_selector → #main-outlet(确认验证通过,等 5-15 秒)4. fetch → /t/<topic_id>.json(获取 Discourse API JSON,50-100KB)5. Python 解析 cooked HTML → strip 标签 → 生成 Markdown6. file_write 保存到目标目录第 1 步:打开帖子页面
browser_use → navigate → https://linux.do/t/topic/<id>/<page>页面会卡在 Cloudflare “请稍候…” 验证页,这是正常的。
第 2 步:切换桌面 UA(关键步骤)
browser_use → set_user_agent → desktop_safari这一步是绕过 Cloudflare 的关键。切换 UA 后 Cloudflare 验证会在数秒内自动通过,页面标题变成帖子标题即表示成功。
⚠️ mobile_safari 不行,必须 desktop_safari。
第 3 步:确认验证通过
browser_use → wait_for_selector → #main-outlet(timeout 15000)如果 found=true 说明验证通过;如果超时,可以截图检查页面状态,或重复步骤 2。
第 4 步:获取 Discourse JSON API 数据
browser_use → fetch → https://linux.do/t/<topic_id>.json必须用 fetch 动作(不是 navigate,不是 curl,不是 execute_js),因为 fetch 会复用浏览器的 session 和 cookies。
返回的 JSON 包含:
title:帖子标题views、like_count、posts_count:统计数据created_at、tags、category_id:元信息post_stream.posts[]:帖子列表username、name:作者cooked:帖子 HTML 内容created_at:发布时间like_count:点赞数post_number:楼层号
JSON 文件会自动保存到 workspace 的 offload 目录,工具返回中包含 artifactUri 路径。
第 5 步:Python 解析
import json, html, re
with open('<artifactUri 路径>') as f: data = json.load(f)
posts = data.get('post_stream', {}).get('posts', [])for p in posts: cooked = p.get('cooked', '') text = re.sub(r'<[^>]+>', '', cooked) # strip HTML text = html.unescape(text).strip() text = re.sub(r'\s+', ' ', text) # 合并空白 # text 就是纯文本内容第 6 步:保存
用 file_write 生成结构化 Markdown 保存到目标目录。
踩坑记录
❌ curl 直接请求 → 403
curl "https://linux.do/t/2303618.json" -H "Cookie: cf_clearance=xxx"# 返回 403,即使带了 cf_clearance cookie原因:Cloudflare 的 cf_clearance cookie 绑定 IP。浏览器的 IP 和 Alpine 终端(proot)的出口 IP 不同,cookie 无法跨 IP 复用。
结论:不要尝试用 curl,必须通过浏览器完成所有请求。
❌ 浏览器内 execute_js → 返回 null
// 这些在 linux.do 页面上都返回 nulldocument.querySelectorAll('.cooked') // nullfetch('/t/2303618.json') // null原因:linux.do 页面的 CSP 或 Discourse 框架限制,导致 execute_js 的返回值无法正常序列化。
结论:不用 execute_js 提取内容,用 fetch 动作获取 JSON API 数据再用 Python 解析。
❌ Google 缓存 / Wayback Machine
- Google 缓存:触发 Google 自己的验证,同样不可用
- Wayback Machine:抓取的是旧版本,可能不包含最新评论
❌ navigate 到 API URL
browser_use → navigate → https://linux.do/t/2303618.json# 会触发新的 Cloudflare 验证原因:navigate 会改变当前页面,可能触发新的验证流程。
结论:先 navigate 到帖子页面,通过验证后再用 fetch 请求 API。
分页处理
- 默认 JSON API 返回前 20 条帖子
- 超过 20 条时,用
?page=1、?page=2参数获取更多(但实测 21 条帖子只返回了 20 条) - 用户链接
/t/topic/2303618/8中的/8表示跳转到第 8 楼,不影响 API 获取
用户链接格式
| 格式 | 含义 | topic_id |
|---|---|---|
linux.do/t/topic/2303618 | 帖子首页 | 2303618 |
linux.do/t/topic/2303618/8 | 跳转到第 8 楼 | 2303618 |
linux.do/t/topic/2303618/20 | 跳转到第 20 楼 | 2303618 |
API 请求统一用 https://linux.do/t/2303618.json(去掉 /topic/ 和楼层号)。
完整示例(实际成功案例)
2026-06-05 抓取帖子 2303618「老哥们 新改了一版简历 这次有啥大毛病吗」:
- 577 浏览 · 26 赞 · 21 条回复
- JSON 大小 54KB
- 全部 20 条评论成功提取
- 保存到
/workspace/小万工作间/L站精华/简历优化建议_L站帖子2303618.md
最后更新:2026-06-05 来源:实际抓取 linux.do 帖子 2303618 的完整过程
Share Article
If this article helped you, please share it with others!