
本文揭示了 vivli 搜索平台(search.vivli.org)数据实际由 azure search 后端 api 动态提供,无需模拟滚动或 selenium 驱动浏览器;通过分析网络请求,可直接调用其 restful 接口批量获取全部研究记录(7000+ 条),高效、稳定、零渲染开销。
本文揭示了 vivli 搜索平台(search.vivli.org)数据实际由 azure search 后端 api 动态提供,无需模拟滚动或 selenium 驱动浏览器;通过分析网络请求,可直接调用其 restful 接口批量获取全部研究记录(7000+ 条),高效、稳定、零渲染开销。
Vivli 平台表面呈现为一个需点击搜索按钮、再不断滚动加载的单页应用(SPA),这让许多开发者误入“模拟滚动→等待加载→提取 DOM”的传统 Selenium/Rselenium 路径。但真实情况是:所有研究元数据均来自后端 Azure Search 服务的 XHR 接口,而非前端 JavaScript 渲染生成。这意味着——只要定位到该 API,并构造合法请求,即可跳过整个浏览器自动化流程,实现秒级、全量、可复现的数据获取。
✅ 推荐方案:直连 Azure Search API(Python)
以下 Python 脚本通过 requests 直接调用 Vivli 的搜索索引接口,采用分页参数 &$skip= 和 &$top=1000 实现批量拉取(共约 7,000+ 条记录),并使用 pandas.json_normalize() 自动展平嵌套 JSON 响应:
import requests
import pandas as pd
from pandas import json_normalize
# 配置请求头(避免被拒绝)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 初始化会话(自动携带 headers)
s = requests.Session()
s.headers.update(headers)
# 存储全部结果
big_df = pd.DataFrame()
# 分页拉取:每页 1000 条,从 skip=0 到 skip=7000(覆盖全部)
for skip in range(0, 8000, 1000):
url = (
"https://vivli-prod-cus-srch.search.windows.net/indexes/studies/docs?"
"api-key=C8237BFE70B9CC48489DC7DD84D88379&"
"api-version=2016-09-01&"
f"$top=1000&$skip={skip}&"
"search=*&"
"$filter=assignedAppType%20eq%20%27Default%27&"
"$count=true&"
"facet=studyDesign&"
"facet=locationsOfStudySites,count:300,sort:value&"
"facet=sponsorType&"
"facet=contributorType&"
"facet=sponsorName,count:500,sort:value&"
"facet=studyType&"
"facet=actualEnrollment,interval:100"
)
try:
r = s.get(url, timeout=15)
r.raise_for_status()
data = r.json()
df_page = json_normalize(data['value'])
big_df = pd.concat([big_df, df_page], ignore_index=True)
print(f"✅ 已获取 {len(df_page)} 条记录(skip={skip})")
except Exception as e:
print(f"⚠️ 请求失败 (skip={skip}): {e}")
break
print(f"\n? 总计获取 {len(big_df)} 条研究记录")
print(big_df[['title', 'sponsorName', 'nctId', 'studyType', 'actualEnrollment']].head())? 关键说明:
PigX UI 前端开发下载PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- api-key 和 api-version 是公开可用的(Vivli 官方未设访问密钥鉴权);
- 所有查询参数(如 $filter, facet)均可按需调整,例如限定 studyType eq 'Interventional';
- search=* 表示全文匹配所有文档,等价于“无筛选”搜索。
⚠️ 为什么不推荐滚动模拟?
- remDr$executeScript("window.scrollTo(...)") 类方法在 Vivli 中无效,因为滚动本身不触发新请求——内容加载由搜索按钮点击后的独立 XHR 控制;
- sendKeysToElement(key="down") 无法触发任何逻辑,目标元素非可聚焦/可交互区域;
- Selenium 方案耗时长(启动浏览器、渲染 JS、隐式等待)、易受网络波动和页面结构更新影响,且难以规模化。
? 进阶建议
- R 语言用户:可用 httr2 + jsonlite::fromJSON() 替代 requests + pandas,逻辑完全一致;
- 增量更新:添加 &$filter=lastUpdatedDate ge '2024-01-01' 获取近期变更;
- 字段精简:若只需标题、NCT号、赞助方,可在 URL 中添加 $select=title,nctId,sponsorName 提升响应速度;
- 合规性提醒:请遵守 Vivli 数据使用政策,用于学术/非商业目的时建议注明来源。
该方案将数据获取从“黑盒浏览器操作”升级为“白盒 API 对话”,兼顾效率、稳定性与可维护性——这才是现代网页数据采集的正确打开方式。
立即学习“前端免费学习笔记(深入)”;


















