提取药物临床试验登记信息(chinadrugtrials.org.cn)
从「药物临床试验登记与信息公示平台」抓数据时的全部坑点都已踩过并验证,按本流程可稳定出数。
何时使用
- 用户要抓 chinadrugtrials.org.cn 的临床试验(按 中药/天然药物、化学药物、生物制品、状态、登记时间窗口筛选)。
- 典型需求:「近半年中药临床试验」「某适应症的在研化药」「2025 年以来招募中的生物制品」等。
⚠️ 最关键的坑(不照做必卡死)
1. WAF 拦截:纯 HTTP 请求无效,必须用真实浏览器渲染
- 现象:
curl/requests直连返回 202 + 约 25KB 混淆外壳页(含_$ur()/_$eO()等混淆脚本、<body></body>空),不是数据。这是 FSSB/安全狗类 WAF 的 JS 挑战。 - 解决:用 Playwright + 系统已装的 Google Chrome(
channel="chrome")+headless=False渲染。系统 Chrome 本身足以骗过检测,无需 stealth 插件。(macOS 上 Chrome 在/Applications/Google Chrome.app。) - 进入页面后
time.sleep(6)等挑战脚本执行完,再用context.request发后续请求(共享同一 cookie,不会被二次挑战)。
2. 查询接口是 GET,不是 POST(POST 会被忽略过滤条件)
- 正确:
GET https://www.chinadrugtrials.org.cn/clinicaltrials.searchlist.dhtml?reg_no=&indication=&case_no=&drugs_name=&drugs_type=1&appliers=&communities=&researchers=&agencies=&state=¤tpage=N drugs_type取值(来自高级查询页<select name=drugs_type>的 option value,不是中文):1=中药/天然药物、2=化学药物、3=生物制品、``=全部。currentpage从 1 开始,每页 20 条;列表按「登记号」降序。- POST 同样参数会忽略 drugs_type 等条件,返回全平台 36198 条——务必用 GET。
3. 详情页取日期/申请人
- 详情:
GET https://www.chinadrugtrials.org.cn/clinicaltrials.searchlistdetail.dhtml?id=<列表行 <a> 的 id 属性> - 日期口径是 「首次公示信息日期」(注意:不是「登记日期」)。
- 申请人字段是 「申请人名称」(不是「申请人联系人」,后者只是联系人)。
- 列表行没有日期列,必须逐条抓详情页才能按日期过滤。列表降序≈日期降序,命中早于窗口即停止抓取详情可省大量请求。
前置依赖
# 用 WorkBuddy 管理的 Python 建 venv 并装依赖(系统需已装 Google Chrome)
PY=/Users/penghui/.workbuddy/binaries/python/versions/3.13.12/bin/python3
VENV=/Users/penghui/.workbuddy/binaries/python/envs/default
$PY -m venv $VENV
$VENV/bin/pip install playwright beautifulsoup4
若系统无 Chrome,先安装 Google Chrome(macOS:
/Applications/Google Chrome.app)。不要改用 Playwright 自带的 headless Chromium——易被 WAF 识别。
用法(直接跑本 skill 附带脚本)
脚本位置:<skill_dir>/scrape_cde_trials.py
VENV=/Users/penghui/.workbuddy/binaries/python/envs/default
# 近半年中药(默认 drugs-type=1;--since 触发按日期过滤)
$VENV/bin/python <skill_dir>/scrape_cde_trials.py --drugs-type 1 --since 2026-02-18 --out /tmp/out
# 全部化药列表(不传 --since 则只抓列表列,快)
$VENV/bin/python <skill_dir>/scrape_cde_trials.py --drugs-type 2 --out /tmp/out
# 某状态 + 时间窗口
$VENV/bin/python <skill_dir>/scrape_cde_trials.py --drugs-type 3 --state 招募中 --since 2025-01-01 --until 2025-12-31 --out /tmp/out
参数:
--drugs-type:1中药/天然药物(默认)|2化药|3生物制品|""全部--state:试验状态过滤(进行中/招募中/已完成…),空=全部--since/--until:首次公示信息日期窗口(YYYY-MM-DD);传--since才会逐条抓详情按日期过滤--max-detail-pages:日期过滤时最多抓前 N 页详情(默认 6,足以覆盖 6 个月窗口)--out:输出目录;产物trials_t<type>.csv/.json(UTF-8-BOM,Excel 可直接打开)
输出字段
登记号、首次公示信息日期、药物名称、适应症、试验状态、试验分期、申请人、药物类型、试验通俗题目、详情链接。
注意
- 列表总量较大(中药累计 1330、全平台 36198),按日期过滤时脚本只抓窗口内的详情,不会全量抓。
- 申办方选择不公示申请人时,该字段为空(CSV 显示空)。
- 仍偶发 WAF 挑战时,重跑一次即可(同一浏览器会话内后续请求通常稳定)。
微信扫一扫