# 行业信息推送 · M1–M5 交付说明

生成日期：2026-10-13　｜　执行：MiniMax Code　｜　边界遵守：任务包 0 节全部 6 条

## 交付文件

| 文件 | 内容 |
| --- | --- |
| `m1_competitor_sources.json` | 8 家竞品可程序化采集入口，55 条 |
| `m2_public_sources.json` | 监管/披露/招投标/行业媒体源，58 条（20 + 31省 + 7媒体） |
| `m3_keyword_matrix.csv` | 8 品牌 × 5 类动态检索词，730 行 |
| `m4_event_rules.json` | 5 类动态判定规则，每类 2 正例 + 2 负例 |
| `m5_collector_skeleton.py` | 采集骨架（可选任务），已实测可运行 |
| `build_m1_m2.py` / `build_m3.py` / `build_m4.py` | 生成脚本 |

**所有「实测状态码」由生成脚本运行时真实发起 HTTP 请求写入，未经手工填写。**
已用 curl 作为独立客户端抽查 25 条标记为 200 的条目，25/25 一致。

---

## 五个必须先知道的结论

### 1. 最有价值的发现：巨潮公告 API 可直接跑通
```
POST http://www.cninfo.com.cn/new/hisAnnouncement/query
     stock=688105,9900046657 & tabName=fulltext & column=sse & category=...
```
诺唯赞（688105）实测返回 `totalAnnouncement=582`，含 PDF 原件直链。
年报 `category_ndbg_szsh`、半年报 `category_bndbg_szsh` 可直接按类别过滤。
先用 `topSearch/query` 查 `orgId`（实测返回 `9900046657, delisted=false`）。

**注意：该接口 GET 会返回 500，必须用 POST。** 本清单已标注 `请求方法` 字段。

### 2. 任务包三处备注与本次实测不符，以实测为准
| 任务包备注 | 本次实测 |
| --- | --- |
| 宝生物官网国际 403 | `takara.co.jp` 实测 **200**（带/不带 UA 均 200） |
| `bio.vazyme.com/product/<id>` 需加 `.html` 或尾斜杠 | 两种形式**均 200**，规避不再必要 |
| 迈迪安官网 200 | 实测 **403**（Cloudflare「Just a moment...」挑战页，200/403 交替） |

宝生物退市信息**属实**，且补充核实：是东证 Prime **4974.T**（非 4587），2026-06-12 退市，
原因为 374:1 股份合并后被母公司 Takara Holdings 要约收购私有化。

### 3. 分页机制三家各不相同，直接影响采集方案
- **全式金**：分页最规范，`/news/list_<N>.html` 服务端分页已验证（各页文章集合不同），共约 912 条 → **首选**
- **翌圣**：`?page=N` **无效**（page=1/2/3 文章集合哈希完全一致）；且 robots.txt 明确 `Disallow: /*?*` → 改走分类页 `/news/<catId>` + `/products/list/<id>`
- **诺唯赞**：列表页服务端渲染含文章链接，但分页 `/news/p-<offset>-6.html` 返回 200 却无文章链接（前端渲染）→ 需 JS 渲染或改走 sitemap

### 4. 「招投标」不要逐省抓，全国平台就够且更稳
`ggzy.gov.cn` 实测 200，`/deal/dealList.html?HEADER_DEAL_TYPE=01` 及全部 11 个类型码均 200，
公告详情 URL 规律：`/information/deal/html/a/<省码>/<类型码>/<日期>/<uuid>.html`
其中 **0202 = 政府采购中标结果公告**（最贴合本任务需求）、2502 = 成交公告、9001 = 其他交易公告。

31 省逐省实测：**19 省 200**，10 省本机 DNS 解析失败（江苏/吉林/黑龙江/福建/湖北/广西/青海/天津/河北等，域名待确认），
甘肃 412、中国政府采购网 403、北交所子页 302 死循环。

### 5. 公开社媒：实测无可用入口，故一条未写
LinkedIn 公司页对未登录请求一律 **999**（实测 vazyme/thermofisher/yeasen/roche 四家均是）；
微信公众号为登录态+动态渲染，不构成公开可抓取入口。
按「无 URL 不写入」的要求，M1 中社媒部分只给结论、不列 URL。

---

## 其他要点

**NMPA 是本任务包最难的一环。** 主站与数据查询页实测均 **412**（风控拦截，非验证码墙，加完整浏览器请求头仍 412）。
同一主管机关下 `zwfw.nmpa.gov.cn` 实测 200，可作替代入口。`udi.nmpa.gov.cn` 超时不可达。
「客户拿证信号」目前**没有稳定的公开可程序化入口**，建议标记为待解决。

**赛默飞与罗氏的 IR 需分开处理：** `ir.thermofisher.com` 实测 403；罗氏 `roche.com/investors` 实测 200。

**罗氏诊断有语言段陷阱：** `diagnostics.roche.com` 根路径会跳到已失效的 `roche-diagnostics.cn/zh/home.html`（404），
必须带 `/global/en/`；其 sitemap 有 2240 条且直接含 2026 年新闻详情，是新闻枚举首选。

**采集骨架内含 robots 合规检查**（`--dry-run` 可预览）：
46 个计划 URL 中 45 个 robots 允许，1 个未知。
注意：必须用与采集一致的 UA 读 robots.txt——Python urllib 默认 UA 会被诺唯赞等站点拦截，
导致「读不到 robots」被误判成「全站禁止」，从而静默跳过最重要的信源。此坑已在 M5 中修复并加注释。

---

## 待确认项

1. 10 个省份公共资源交易中心的正确域名（本机 DNS 解析失败，未确认是域名写错还是网络限制）
2. NMPA 医疗器械注册证查询是否存在官方开放接口或稳定镜像入口
3. `ggzy.gov.cn/information/pubTradingInfo/getTradList` 的完整调用参数（实测 404）
4. 迈迪安在遵守「不绕验证码」前提下，是否接受人工核验后录入

*客户 → 赛道 → 对标公司的映射表未涉及，按任务包要求属本地完成范围。*