返回 Skill 列表
extension
分类: 数据与分析无需 API Key

临床试验药物注册查询

从国家药监局药品审评中心「药物临床试验登记与信息公示平台」(chinadrugtrials.org.cn) 提取临床试验登记信息。已验证可绕过该站 WAF(FSSB/安全狗类 JS 挑战),并定位到正确的 GET 查询接口与字段口径。当用户要抓取/提取该平台的临床试验数据(按中药/化药/生物制品、按状态、按时间窗口筛选)时使用。

person作者: user_b9cdf6e8hubcommunity

提取药物临床试验登记信息(chinadrugtrials.org.cn)

从「药物临床试验登记与信息公示平台」抓数据时的全部坑点都已踩过并验证,按本流程可稳定出数。

何时使用

  • 用户要抓 chinadrugtrials.org.cn 的临床试验(按 中药/天然药物、化学药物、生物制品、状态、登记时间窗口筛选)。
  • 典型需求:「近半年中药临床试验」「某适应症的在研化药」「2025 年以来招募中的生物制品」等。

⚠️ 最关键的坑(不照做必卡死)

1. WAF 拦截:纯 HTTP 请求无效,必须用真实浏览器渲染

  • 现象:curl/requests 直连返回 202 + 约 25KB 混淆外壳页(含 _$ur() / _$eO() 等混淆脚本、<body></body> 空),不是数据。这是 FSSB/安全狗类 WAF 的 JS 挑战。
  • 解决:用 Playwright + 系统已装的 Google Chromechannel="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=&currentpage=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-type1 中药/天然药物(默认)|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 挑战时,重跑一次即可(同一浏览器会话内后续请求通常稳定)。