### 关联与状态 路线图 #2,一期。状态:**进行中**,@zzsky233 认领,PR #101 按审查意见修改中。配置的格式已定(#6,见开发约定 §2.1),LLM 用 DeepSeek V4.1 Flash(#18)。网站那一半是 #38,两边按已经定好的接口各做各的。有问题直接在这里留言。 ### 目标 管理员接入来源时先「试抓」:抓取节点抓下列表页,让 LLM 认出列表、标题、日期和翻页在哪,生成配置;再用这份配置抓一遍,把条目和配置交回网站,管理员看过再保存。之后每天按配置抓,不再问 LLM([总体设计 §7.2](https://github.com/mousebaoyan/mouseclock/blob/main/docs/design.md#72-怎么抓))。这个任务做抓取节点这一半。 ### 已经有的 - **项目骨架**:`crawler/` 是 Python 3.14 + uv 的项目,装依赖 `uv sync`,跑全部检查 `./check.sh`(格式、lint、Pyright 严格模式、测试)。命令见 [AGENTS.md](https://github.com/mousebaoyan/mouseclock/blob/main/AGENTS.md#命令)。 - **一轮的流程**:[`crawl/rounds.py`](https://github.com/mousebaoyan/mouseclock/blob/main/crawler/src/crawler/crawl/rounds.py) 的 `crawl_source` 已经把一个来源的一轮串好:读列表 → 初筛 → 读正文和附件 → 抽取 → 交结果。四步作为 `Steps` 传进来,签名和交接的数据写在那里,测试的写法见 `rounds_test.py`。抓不成时抛 `FetchError` 或 `StepError`,流程会把原因记进抓取记录([开发约定 §2](https://github.com/mousebaoyan/mouseclock/blob/main/docs/development.md#2-抓取和判别))。 - **请求层**:所有对来源网站的请求都经过 [`crawl/fetch.py`](https://github.com/mousebaoyan/mouseclock/blob/main/crawler/src/crawler/crawl/fetch.py) 的 `Fetcher`,它管 UA、同一网站一次一个请求和间隔,不要自己用 httpx 发请求。 - **和网站交接的类型**:[`crawl/contract.py`](https://github.com/mousebaoyan/mouseclock/blob/main/crawler/src/crawler/crawl/contract.py) 由网站的接口定义生成,不手改([接口 §6](https://github.com/mousebaoyan/mouseclock/blob/main/docs/api.md#6-抓取节点))。 - **接口**:领活时 `Work.probes` 里有要试抓的地址、要不要浏览器、可选的配置;结果用 `website.probe()` 交 `ProbeReport`(条目、生成的配置、失败原因、用量)。 ### 范围 1. **试抓**: - 抓下列表页(要浏览器的用 #41); - 带了配置的直接按配置读列表; - 没带的先试通用抓取,取不到再让 LLM 按 #6 定的格式生成配置,用它读一遍。 2. **交结果**:把条目、生成的配置和用量交回网站。抓不成的照实写明原因。 3. **安全**:页面内容只当材料交给模型,不让页面里的文字左右模型([AGENTS.md · 可靠与安全](https://github.com/mousebaoyan/mouseclock/blob/main/AGENTS.md#可靠与安全));模型生成的配置用 #6 的 Pydantic 定义校验。 4. 入口(#45)领到试抓时调这里。 5. **提示词按缓存命中组织**:固定的规则和配置的格式放最前面,每个列表页的内容放最后,前面的部分每次一字不差,好让 DeepSeek 的缓存命中、少花钱。规则见 #44 的范围第 5 条,谁先做谁写进总体设计 §8.6。 ### 建议的第一步 在本 Issue 留言认领。 ### 验收标准 - [ ] 给一个通用抓取取不对的列表页,能生成可用的配置并交回条目 - [ ] 测试用保存的页面和固定的模型响应,`./check.sh` 通过
Activity
zzsky233 commentedon Nov 10, 2026
认领