# 课题组采集方法(活的方法件) > 这份是**方法论**,不是某一校的报告。任务书从这里引用,**不要再各写一套**。 > 立此件的起因:用户指出「做事情不可能依次去枚举所有的 URL」—— 对。 > 我此前把爱丁堡跑出来的**结果**(跟了 117 个子域)写成了**要求**,导致 worker 去 sitemap 拉上万个 URL。 > **那是蛮力,不是方法。** --- ## 0. 目标 每所学校产出一份「**导师带的组**」清单,五字段: `课题组名称` · `所在大学及研究中心` · `研究方向` · `联系邮箱` · `最近五年论文数`(暂 null) --- ## 1. 方法:**入口发现**(有限),不是 **URL 全量枚举**(几万) ### 数量级对照(实测) | 做法 | 入口数 | 例 | |---|---|---| | ✅ **官方院系导航 → 各院系 `/research/` → 组目录** | **20–60 / 校** | Bristol 216 个入口 URL;Edinburgh 几十个 | | ❌ sitemap 全量枚举 | **上万 / 校** | Monash 13,568 个 URL —— 绝大部分是新闻/课程/人员页 | ### 步骤 1. **找学校官方的院系导航** `…/faculties/`、`…/schools-departments/`、`…/about/structure`、`…/colleges-schools-and-departments` ⇒ 拿到**该校的院系全清单**(通常 10–60 个)。**这就是完备性的分母。** 2. **每个院系进它的 `/research`**(或 `/research/`、`/our-research`、`/research-and-innovation`) 3. **⭐ 在院系 research 页上找「组目录」** —— 这是整个方法的核心 识别特征(链接文字 / 页面标题 / 路径): - `research-groups` · `research-centres` · `centres` · `groups` · `institutes` · `labs` - **最高价值:`每个组由一位 PI 带` 的目录**(表格或多行列表,几十到几百行) - 页面原话常写作 **"each led by a Principal Investigator"** / "our research groups" - 爱丁堡 Biology 这一个目录 = **140 条**(占全校 643 的近 1/4) 4. **目录条目 → 组自己的页面 → 取五字段** 5. **子域/外站**:**只在院系站的链接指向它时才跟**(如 `biology.ed.ac.uk`、`bristolmathsresearch.org`)。 **不是**去 sitemap 里搜子域列表。爱丁堡那 117 个子域是**跟出来的结果**,不是要去枚举的目标。 --- ## 2. 判据:什么算「一个组」 > **打开页面像人一样看:这是不是一个「导师带的做研究的团队」?** > **粒度上限 = 一个导师能带的规模。** | 收 | 不收 | |---|---| | `Bristol Cyber Security Group` · `Clark group` | `Intelligent Systems Laboratory`(自述 150+ 人、七个单位的联邦) | | `Bristol Glaciology Centre` | 校级研究所(Cabot / Brigstow / Quantum …) | | 有具名负责人 + 方向 + 一个导师能带的规模 | Chemistry/Physics 的 `theme`、`cluster` | | **大一级下面挂着的内层组** | 只有方向文字 + 一长串人员链接、**无具名负责人**的方向页 | **不是组**:服务设施 · 研讨会系列 · 项目 · 学生培养计划 · 单项研究 · 空页重定向 · 主题页。 **共性是页面上有一句「非团队自述」—— 你去看那句话。** ### 字段取法 | 字段 | 取法 | |---|---| | 课题组名称 | 该组**自己页面**的 H1(无 H1 用 ``;JS 渲染/表格行用**目录里的官方组名**并标 `_name_source`) | | 所在大学及研究中心 | 大学 + **真实上级研究单位**;⚠️ 上级是系/院/学部的**不许当研究中心写**,没有真上级就**只写大学** | | 研究方向 | 该组页上的方向文字。**没有 ⇒ 不要**(用户裁) | | 联系邮箱 | 只接受**本组页 / 本组负责人页**的邮箱;不接受学院总邮箱 | | 最近五年论文数 | null(用户裁:先留空) | --- ## 3. 完备性门槛(**交付门槛,不是"尽量"**) 1. **院系台账**:`院系(全部)| research 入口 URL | 状态(取到/取不到+原因) | 组数` —— **缺一行就是没做完**;`未取页 = 0` 2. **合理性校验**:`组数 ÷ 院系数` —— 比值**荒谬地低** ⇒ 大概率漏了「组目录」这一层,**回头找目录**(不是去爬更多 URL) 3. 基准:Bristol ≈5.8/系 · Edinburgh ≈25.7/系(因校而异,只看是否荒谬地低) --- ## 4. 质量:**抽样验,不逐页核**(用户裁) 1. **启发式自动抽**(全量,不逐条判) 2. **随机抽 30 条**逐条开页面核 → **准确率** + **假阳性类型** 3. 准确率 **≥90% 且类型集中** ⇒ **定点修那一类,全量直接用** ⇒ **不要再逐页核**("逐页核 643 条"是迂腐;改成抽样,一个数量级更快) 4. 省下的时间**全部用来把院系覆盖做全** —— 那才是真正的缺口 --- ## 5. 并行安全(出过事故) 5 个 worker 曾**挤在同一个 Space 的同一个 page** 上,297 页跨校串页、整批作废。 - **每个 worker 自己新建 TaskSpace**(不要复用别人已有的) - **每个 URL 独占 `newPage()`**,**不要共用 p1** - **每取一页校验 `page.url()` 与目标一致**;不一致 ⇒ 废掉重取 - 成功收尾调一次 `await task.finish({ keep: [] })`;**因错误停止就别调**,把 `spaceId` 报上来 --- ## 6. 反面清单(**不要做**) - ❌ 从 sitemap 全量枚举 URL(上万个,绝大部分无关) - ❌ 逐页核每一条(用抽样代替) - ❌ 在解析器里写死「哪些名字算组」「哪些学校跳过」的名单(判据必须来自源站结构/页面内容) - ❌ **把 Pure 当主源或唯一源**(⚠️ 2026-09-24 修正,见下) - **已实证**:ANU 的 Pure 最细是 Department,导师个人页的 organisations 只有 1 个行政单位 ⇒ **对 ANU 这类,Pure 里根本没有"组"这一层**,抽出来的全是组织架构 - **但同样已实证(巴斯)**:有 **11 个组只存在于 Pure**(RaCE / EMaCS / BathCTI / CSCT / CEI / CREA / ADBL / MENASP / REVEAL …),**主站 sitemap 里没有任何对应页面**。 照"不用 Pure"字面执行会漏 11 组(119→108,−9.2%) - ⇒ **正确规则(条件式)**: **主源是院系站**(`院系导航 → /research/ → 组目录`); **Pure 作为补充源** —— 只在**同时满足**时收:① 源站 type ∈ 研究类 ② 页面有具名负责人 ③ 粒度是一个导师能带的规模。 **既不当主源,也不整个不用。** - 判别某校该不该用 Pure 补充:**看它 Pure 的 type facet 里有没有研究类 type**(Bristol/Bath 有; ANU/Monash 没有)。没有 ⇒ 该校 Pure 对"组"零贡献。 - ❌ 用一条绝对规则套所有学校(**每一次"ANU 所以所有学校都这样"的推广,都在巴斯被证伪了**)