Files
edu-industry/docs/crawler-source-implementation.md
lofyerandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> b9fbd4c6af refactor: simplify product copy
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-25 11:37:59 +08:00

167 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 招聘数据源采集实现方案
> 调研基线:2026-08-24。站点条款、robots.txt、页面结构和合作接口可能随时变化,上线前必须重新复核并留存审批证据。
## 1. 实现目标
`admin-tools/crawler/` 负责把来源数据接入 Raw 与 Source 层,再映射到统一契约:
- 外部岗位来源输出 `JOB-SIGNAL V3.0`;
- 校内就业来源输出 `SCHOOL-EMPLOYMENT V2.2`;
- 校内实习来源输出 `SCHOOL-INTERNSHIP V2.1`;
- 原始响应只追加保存,标准记录、隔离记录和运行摘要分别输出;
- 每次运行携带任务编号、连接器版本、采集时间、来源 URL 和 SHA-256。
- 薪资上下限统一折算为税前月薪,同时保留源端 `salary_period` 作为折算证据。
它不是用于绕过站点控制的通用抓取工具。代码不包含验证码处理、登录模拟、浏览器指纹伪装、私有接口逆向、代理池轮换或访问限制规避。
## 2. 强制接入边界
每个外部来源必须同时满足:
1. 已取得适用于目标用途、字段范围和保存期限的书面授权,或确认存在允许该用途的开放许可;
2. 使用官方 API、授权数据包或明确允许自动访问的公开页面;
3. 运行时 robots.txt 允许当前 User-Agent 和 URL;
4. 来源域名在连接器 allowlist 中,禁止任意 URL 和内网地址;
5. 使用可识别的 User-Agent 和可联系的技术邮箱;
6. 遵守来源级请求速率、并发、时间窗、停止条件和数据保留策略;
7. 页面出现登录、验证码、访问验证、封禁提示或条款变化时立即停止,不尝试绕过。
校内来源必须取得学校的数据处理授权,并使用只读账号、租户隔离和最小字段集。平台禁止接收姓名、身份证号、手机号和明文学号。
## 3. 九个来源的实现方式
| 来源代码 | 数据源 | 实现类 | 接入方式 | 默认网络状态 | 上线前置 |
|---|---|---|---|---|---|
| `BOSS` | BOSS直聘 | `BossConnector` | 官方合作 API 或授权 JSON/NDJSON 数据包 | 禁用 | 合作协议、接口文档、字段与留存授权 |
| `ZHAOPIN` | 智联招聘 | `ZhaopinConnector` | 官方合作 API 或授权 JSON/NDJSON 数据包 | 禁用 | 书面许可;不得使用匿名网页爬虫 |
| `BRZP` | 全国中小企业招聘平台 | `BrzpConnector` | 官方数据接口优先;经许可后可读取公开 JobPosting/列表页 | 禁用 | 来源审批、robots 通过、入口 URL 白名单 |
| `NCSS` | 国家大学生就业服务平台 | `NcssConnector` | 官方合作接口优先;经许可后可读取公开职位/专场页 | 禁用 | 来源审批、robots 通过、入口 URL 白名单 |
| `MOHRSS` | 中国公共招聘网 | `MohrssConnector` | 官方数据交换或提供单位授权数据;公开页面仅用于获准范围 | 禁用 | 对应提供单位或招聘单位授权 |
| `IGUOPIN` | 国聘 | `IguopinConnector` | 官方合作 API 或授权数据包 | 禁用 | 合作协议;不得逆向动态页面私有接口 |
| `HZRC` | 杭州人才网 | `HzrcConnector` | 官方合作接口或书面许可的数据包/公开页面 | 禁用 | 书面许可、低速策略、robots 通过 |
| `SCHOOL_EMPLOYMENT` | 校内就业管理系统 | `SchoolEmploymentConnector` | 只读数据库视图导出、API 或 NDJSON 文件 | 无公网访问 | 租户授权、字段映射、学生令牌化 |
| `SCHOOL_INTERNSHIP` | 校内实习管理系统 | `SchoolInternshipConnector` | 租户 API 或 NDJSON 文件 | 无公网访问 | 租户授权、字段映射、学生令牌化 |
“默认网络状态为禁用”表示仓库代码不会因为安装或定时任务误配置而直接访问来源。操作者必须显式传入来源授权确认、入口 URL 和联系邮箱;商业来源还必须提供授权 feed URL。
### 3.1 BOSS直聘
- 不实现账号登录、扫码、Cookie 复用、验证码识别或页面安全验证绕过;
- 不固化网页私有接口、签名算法或浏览器指纹;
- 连接器只读取合同约定的 API/feed,或离线处理授权交付的 JSON/NDJSON;
- 字段重点为岗位、企业、地区、薪资、职责、技能和源端状态。
### 3.2 智联招聘
- [智联平台用户服务协议](https://rd6.zhaopin.com/aboutus/legal/service) 对未经书面许可的爬虫、自动化脚本和数据抓取有限制;
- 因此 `ZhaopinConnector` 只允许授权 feed/API 和离线数据包,不提供匿名页面采集模式;
- 授权材料编号应写入部署配置和审计系统,不写入代码仓库。
### 3.3 全国中小企业招聘平台
- 官方入口为 [全国中小企业网上百日招聘服务平台](https://brzp.chinasme.cn/);
- 优先申请结构化数据交换;公开页面模式只解析标准 `JobPosting` JSON-LD 或经版本化配置确认的页面;
- 活动页和岗位页分开建立水位,避免每日重复抓取全部历史活动。
### 3.4 国家大学生就业服务平台
- 官方入口为 [国家大学生就业服务平台](https://www.ncss.cn/);
- 职位、实习、专场和联合招聘应分别分片;
- 只处理无需登录且获准自动访问的页面或官方合作接口,不采集求职者、简历和账号数据。
### 3.5 中国公共招聘网
- 官方入口为 [中国公共招聘网](http://job.mohrss.gov.cn/);
- 其[网站声明](http://www.job.mohrss.gov.cn/cjobs/jobfairinfo/wzsyzn)提示招聘信息转载需联系相应提供单位或招聘单位取得合法授权;
- 生产接入优先使用官方数据交换。页面连接器必须绑定具体授权范围,不得因站点可公开浏览就默认允许批量复制。
### 3.6 国聘
- 官方入口为 [国聘](https://www.iguopin.com/);
- 页面高度动态化时不逆向私有 JSON 接口,也不使用浏览器登录会话;
- 只接入官方合作 API、企业授权导出或离线数据包。
### 3.7 杭州人才网
- 官方入口为 [杭州人才网](https://www.hzrc.com/);
- 站内招聘活动页面存在“未经书面许可严禁转载和复制”提示,因此必须先取得许可;
- 即使获准,默认仍采用低并发、长间隔、延迟熔断和单分片重试,响应异常时停止而不是提升并发。
### 3.8 校内就业管理系统
- 不是网页爬虫,使用学校提供的只读视图、API 或标准文件;
- 来源记录在学校侧先生成不可逆 `student_token`;
- 连接器拒绝包含姓名、身份证、手机号、邮箱或明文学号的输入;
- 使用 `tenant_id + source_record_id + source_updated_at` 判断增量更新和重复请求。
### 3.9 校内实习管理系统
- 不是网页爬虫,使用租户 API 或标准文件;
- 只接收学生令牌、专业、企业、岗位、起止日期、状态、工资和业务评价;
- 单租户认证、任务、水位、Raw、隔离区和输出目录均独立;
- 不接收敏感附件,证据只保存学校系统内的引用编号。
## 4. 运行路径
```text
来源审批
→ probe(robots / allowlist / 内容类型 / 小样本结构)
→ collect(严格记录数、页面数、速率和时间上限)
→ raw snapshot(原始载荷 + 元数据 + SHA-256)
→ parse(来源字段)
→ normalize(JOB-SIGNAL / SCHOOL-*)
→ schema validate
→ standard.ndjson / quarantine.ndjson / summary.json
→ 发布质量检查与候选版本
```
失败分类至少包括:
- `AUTHORIZATION_REQUIRED`:没有显式授权确认;
- `ROBOTS_DENIED`:robots.txt 不允许;
- `HOST_NOT_ALLOWED`:入口或重定向不在来源 allowlist;
- `PRIVATE_ADDRESS_BLOCKED`:域名解析到内网、回环或保留地址;
- `AUTH_OR_CHALLENGE`:登录、验证码或访问验证;
- `SOURCE_STRUCTURE_CHANGED`:页面或数据字段不满足版本化解析规则;
- `SCHEMA_VALIDATION_FAILED`:标准记录不满足目标契约;
- `PII_REJECTED`:校内输入包含禁止字段。
## 5. 输出和证据
每个任务目录:
```text
外部来源:output/<source>/<task-id>/
校内来源:output/<source>/<tenant-id>/<task-id>/
├── raw/
│ ├── <sha256>.<json|html|bin>
│ └── <sha256>.metadata.json
├── standard.ndjson
├── quarantine.ndjson
└── summary.json
```
安全要求:
- URL 中的 token、key、signature 等敏感查询参数在日志和元数据中脱敏;
- Authorization、Cookie 和代理凭据仅从环境变量读取,不写入 Raw、日志或异常文本;
- 原始页面不得包含简历、求职者联系方式或校内明文身份信息;
- 任务重试使用相同幂等键,不重复生成业务记录;
- Raw 文件只追加,水位仅在任务完整成功后提交。
## 6. 上线验收
每个来源必须提供:
1. 授权编号、授权范围、有效期、允许字段、允许用途和删除要求;
2. robots.txt 与站点条款快照;
3. 100 条脱敏样本和目标字段映射;
4. 正常、空结果、失效岗位、限流、超时、结构变化和重复数据测试;
5. 请求速率与业务方确认记录;
6. 解析器历史快照回放;
7. Schema、完整性、唯一性、时效和敏感字段检查;
8. 连接器版本、镜像摘要、责任人、告警和回滚版本。
只有以上证据齐全,来源注册中心才能把连接器从 `disabled` 提升到 `approved`,调度器才允许创建公网任务。