拾贝:面向独立开发者的灵感收集工具
2026/8/10 11:39:47 网站建设 项目流程

一个面向独立开发者的命令行工具:抓取社区帖子,让 LLM 提炼出创意点子、用户痛点、独立开发机会、技术趋势四类洞察,输出一份带可点击原帖链接的 Markdown 报告。
代码:github.com/Angryshark128/shibei(MIT,v0.1.0)


一、要解决的问题

独立开发者做选题时,最常遇到的情况:V2EX 程序员节点一天几十上百条新帖,刷一遍一两个小时,读完却记不住几条;不刷又怕错过真正有用的信息——某个反复被吐槽的痛点,可能就是一个产品的起点。

信息不是稀缺品,注意力才是。这个项目的初衷很简单:把「读社区」这件事外包给机器,把「判断什么值得做」留给人。它不替你做决定,只负责把噪音过滤掉,按时给你一份「今天社区里有哪些值得看一眼的东西」的简报。

使用示例

一条命令,自动完成「爬取 → 分析 → 报告」:

$ uv run python analyzer.py 首次运行或数据为空,自动全量爬取 ... [V2EX] 新增 20 帖 共 20 个帖子待分析(来源: v2ex(programmer, python))... 报告已写入:~/Project/shibei/data/analysis/analysis.md

生成的报告analysis.md,每条洞察都带着可点击的原帖链接,可以直接跳回去看上下文:

# 拾贝 · 多来源分析 来源: v2ex(programmer, python) 基于 20 个帖子自动生成 ## 好的创意/产品点子 - 把 Python 脚本编译成无依赖的单文件可执行工具 — [怎么搞定纯 Python 代码解码 jpg 图片](https://www.v2ex.com/t/1224588) - 在线 Python 编辑器 + 运行终端 — [用 GPT5.6 填了之前的坑:在线的 Python 编辑器和运行终端](https://www.v2ex.com/t/1226355) ## 用户痛点 - 申请 TG API 用 Google Voice 一直失败 — [TG api 我用 google Voice 老申请失败](https://www.v2ex.com/t/1229505) ## 个人开发者机会 - 开源的 AI 文本拟人化工具集,适合独立开发者推广 — [humanize-text 一个开源的 AI 文本拟人化工具集](https://www.v2ex.com/t/1213910) ## 趋势洞察 - 社区开始关注「AI 生成内容」与「跨境工具出海」方向 — [9.9 元起!跨境卖家疯抢的纯净住宅 IP 辣椒 HTTP](https://www.v2ex.com/t/1212876)

以上为示例输出;实际内容由你配置的 LLM 从抓取的帖子中提炼。


二、解决方案:项目与技术架构

定位

服务独立开发者,四类洞察直指选题三问:做什么、做给谁、值不值得做。设计上坚持三条主线:来源可插拔、数据结构统一、LLM 接口只用 OpenAI 协议。

数据流

V2EX (或其他社区) ──爬取──▶ data/v2ex/{node}/{id}.json ──分析──▶ LLM 提炼 4 类洞察 │ ▼ data/analysis/analysis.md(可点击原帖链接)
  1. 爬虫抓取帖子与回复,归一为统一 JSON 结构。
  2. 分析模块按 4 个维度分批并行调 LLM,批次结果层级合并去重。
  3. 报告里的来源链接由代码层还原,不经过 LLM。

模块划分

模块职责
sources/来源抽象层。Source抽象基类定义fetch_topics/fetch_replies/list_nodes三个方法,sources/__init__.py是注册表
models.py统一数据结构Post/Reply,所有来源的输出都归一到这里
crawler.py来源无关的爬虫主循环:分页、去重、缓存、断点续传
analyzer.py分析模块,同时也是唯一入口:自动爬取 → 分析 → 打印报告路径
config.json按来源分节配置节点、页数、请求间隔;llm节配置模型

三个关键设计的取舍:

来源可插拔。新增一个社区 = 新建一个来源类(继承Source实现三个方法)+ 注册 + 加一节配置,主流程和分析模块一行不用改。代价是把「来源差异」隔离在sources/内部。

统一数据结构。所有来源的帖子最终归一为同一个 JSON,字段名与来源无关(V2EX 的member归一到authorid统一为字符串)。分析模块只认这一种结构,不感知具体社区。

单一入口。用户不需要知道「要不要先爬取」。analyzer.py内部判断:没有本地数据就全量爬,有数据就增量爬,然后只分析新增。用户每天只需跑一条命令。

真实抓取的帖子(data/v2ex/programmer/1231499.json):

{"id":"1231499","source":"v2ex","node":"programmer","title":"codex 现在怎么这么慢了,用的 sol 中、高都很慢","content":"","author":"longpc","created":1785632990,"replies_count":7,"url":"https://www.v2ex.com/t/1231499","reply_list":[{"id":"17928070","author":"oop12","content":"慢就算了 额度砍了一大堆","created":1785633792},{"id":"17928087","author":"idragonet","content":"是的,所以我用反重力了 3.6F 快!","created":1785635177}]}

几个值得说的工程点

  • 零第三方运行时依赖。爬虫、分析、来源全部只用标准库urllib。装好 Python 就能跑,这给部署和 CI 省掉了大量麻烦。
  • 省成本。正文截断 500 字符、每帖最多取 10 条回复、每条回复截断 200 字符;15 帖一批、4 个类别并行;批次结果每 3 个一组层级合并,避免单次 prompt 过大。今日列表缓存 + 分析 run_id 缓存,重跑不重复请求。
  • 报告链接不经过 LLM。LLM 只负责提炼文字,输出里用[#帖子ID]做锚点标注来源;最终输出时由代码把锚点替换成[标题](原帖URL)。URL 来自抓取的真实数据,杜绝 LLM 杜撰链接。

三、期间面临的挑战

1. 「兜底默认值」制造了一个隐蔽 bug

最初ANALYZE_MODEL可选、兜底gpt-4o-mini。但项目定位是用户自带 LLM——用第三方厂商时,gpt-4o-mini在对方那里根本不存在,直接返回 400model not found。更糟的是这类错误很容易被当成偶发网络问题。

结论:模型名和 URL 一样属于「用户自带」信息,不同厂商各不相同,不该有内置默认。改成必填,缺失即退出并打印配置说明,把配置错误暴露在第一时间。

2. 两步命令不符合真实使用习惯

原设计是先跑crawler.py再跑analyzer.py。但用户实际操作时经常跳过第一步,然后因为数据为空得到一句「请先运行 crawler.py 抓取」——这个体验很差。

结论:把「是否爬取」的决策交给程序。analyzer.py成为唯一入口,自动判断:有数据走增量,数据为空自动退化为全量。用户只需要一条命令。

3. 要不要为「未来可能有」的多个来源做抽象

当前只有 V2EX 一个来源。如果一开始就把 V2EX 的 API 路径写死,将来接 Hacker News、Reddit 时得大改;但如果抽象过度,就是给不确定的将来付成本。

结论:抽象一层,但只到「够用」为止。引入Source抽象基类 + 注册表,但接口只留三个真正被用到的方法,每个来源是一个独立的实现类。新增来源的成本从「改主流程」降为「加一个类」。

4. 外部 API 的不可靠是常态

V2EX v1 API 大约限制 600 次/小时/IP,大量爬取会 403;LLM API 也时有 5xx、限流、超时。爬虫遇到 403/404 直接返回空、不重试(帖子被删或限流,重试无意义);分析侧 4xx 直接报原因终止(重试无用),429/5xx 指数退避重试。单来源失败不影响其他来源。

5. LLM 会一本正经地编造链接

把原帖 URL 直接交给 LLM 让它填进报告,它可能会拼错、编造不存在的链接。这是 LLM 工具的常见翻车点。

结论:让 LLM 只做「判断和提炼」,所有确定性的事情(URL、链接、幂等、去重)交给代码。URL 不注入 prompt,锚点由代码还原。


四、经验收获

  1. 默认值不总是「更友好」,有时是 bug 的温床。一个面向「用户自带服务」的工具,内置厂商默认值等于假设了用户的厂商——这个假设迟早会错。必填并报错,比静默用错更好。

  2. 边界要划清:用户自带什么,项目提供什么。LLM 的 URL、Key、模型全部由用户提供,项目不内置任何账号。这既解决了成本问题,也让「配置即文档」成立——README 里列清三件套即可,不用猜。

  3. 真实的使用路径,比「文档引导」更可靠。用户只会记一条命令。把判断逻辑内置进程序(自动增量/全量),比在文档里写「记得先跑 crawler.py」有效得多。

  4. 把不可靠的环节交给确定性代码。LLM 输出不可靠,就让它只负责提炼,链接、去重、幂等全用代码兜底。这个原则适用于所有 LLM 应用。

  5. 抽象跟着需求走,不要超前。单来源起步、抽一层够用的抽象,而不是一开始就铺满设计模式。抽象的价值是在「新增来源」这个真实动作发生时兑现的,在那之前它是负债。

  6. 零依赖是长尾收益。标准库实现带来的不是「看起来简洁」,而是部署、测试、CI、环境迁移全部变简单——对一个工具类项目,这比少写几行代码重要得多。


五、代码与安装

  • 仓库:github.com/Angryshark128/shibei,MIT 协议,v0.1.0。
  • 依赖:Python 3.10+,运行时零第三方依赖;uv仅用于开发(ruff / pytest / pyright)。
# 1. 克隆gitclone https://github.com/Angryshark128/shibei.gitcdshibei# 2. 安装(仅 dev 工具;直接运行可跳过)uvsync# 3. 配置 LLM —— URL、Key、模型三件套,全部用户自带exportOPENAI_API_KEY=sk-xxxexportOPENAI_BASE_URL=https://api.deepseek.com/v1# 或用 config.json 的 llm.base_urlexportANALYZE_MODEL=deepseek-v4-flash# 或用 config.json 的 llm.model# 4. 运行(唯一入口:自动爬取 + 分析 + 打印报告路径)uv run python analyzer.py# 强制全量重分析uv run python analyzer.py--full

每天跑一条analyzer.py即可。报告输出在data/analysis/analysis.md(增量报告analysis_today.md)。


拾贝后续计划接入 Hacker News、Reddit 等更多来源,并做 Docker 定时部署。欢迎 issue 与 PR。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询