抓取linux.do帖子指南

983 words
5 minutes
抓取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 标签 → 生成 Markdown
6. 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:帖子标题
  • viewslike_countposts_count:统计数据
  • created_attagscategory_id:元信息
  • post_stream.posts[]:帖子列表
    • usernamename:作者
    • 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#

Terminal window
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 页面上都返回 null
document.querySelectorAll('.cooked') // null
fetch('/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!

抓取linux.do帖子指南
https://estars-blog.pages.dev/posts/航海图-操作指南-抓取linux-do帖子指南/
Author
Estars
Published at
2026-06-10
License
CC BY-NC-SA 4.0
Profile Image of the Author
Estars
这条路要走完,才能看到世界的终点,是海纳百川,还是星火燎原。
公告
欢迎来到我的博客!这是一则示例公告。
Music
Cover

Music

No playing

0:00 0:00
No lyrics available
Categories
Tags
Site Statistics
Posts
91
Categories
5
Tags
44
Total Words
374,063
Running Days
0 days
Last Activity
0 days ago

Table of Contents