
本文介绍绕过前端分页限制、直接调用tenet diagnostics后端ajax api批量获取全部检测项目数据的方法,避免selenium翻页失效问题,显著提升爬取稳定性与速度。
本文介绍绕过前端分页限制、直接调用tenet diagnostics后端ajax api批量获取全部检测项目数据的方法,避免selenium翻页失效问题,显著提升爬取稳定性与速度。
在Web爬虫实践中,依赖前端UI翻页(如点击“下一页”按钮)常因动态加载、DOM重渲染或JavaScript状态未同步而失败——正如原始Selenium代码中navigate_to_next_page()看似逻辑正确,却始终停留在第一页:根本原因在于该网站实际采用AJAX分页机制,页面URL不变,内容由前端通过POST请求向https://infinity.tenetdiagnostics.in/GetServices接口动态加载,而非传统HTML跳转。
因此,更可靠、高效且轻量的方案是直连后端分页API,跳过浏览器自动化环节。该接口接受from和to参数(表示结果集偏移范围),返回结构化JSON数据,无需解析HTML或处理WebDriver等待逻辑。
以下是推荐的完整实现方案:
import requests
import pandas as pd
import time
# API端点与基础载荷
api_url = "https://infinity.tenetdiagnostics.in/GetServices"
base_payload = {
"test_name": "",
"test_type": "",
"condition_id": "",
"speciality_id": "",
"category_type": "p", # 对应URL中的?type=p(病理类检测)
"sort_by": "",
"sort_order": "",
"organ_id": "",
"city_name": "Hyderabad", # 城市参数影响结果,需根据目标城市调整
"from": "1",
"to": "9",
"is_popular": ""
}
all_data = []
page_size = 9 # 每页返回9条记录(实测值)
total_pages = 10 # 建议先试探性设置;可动态获取总数量(见下方说明)
print("开始分页抓取...")
for page in range(total_pages):
start_idx = page * page_size + 1
end_idx = (page + 1) * page_size
payload = base_payload.copy()
payload["from"] = str(start_idx)
payload["to"] = str(end_idx)
try:
response = requests.post(api_url, data=payload, timeout=10)
response.raise_for_status()
json_data = response.json()
# 验证响应结构并提取数据
if "data" in json_data and isinstance(json_data["data"], list):
all_data.extend(json_data["data"])
print(f"✓ 第 {page + 1} 页获取 {len(json_data['data'])} 条记录")
else:
print(f"⚠ 第 {page + 1} 页响应格式异常,跳过")
break
except requests.exceptions.RequestException as e:
print(f"❌ 请求第 {page + 1} 页失败: {e}")
break
# 可选:添加轻量延时,降低服务器压力
time.sleep(0.3)
# 转为DataFrame并保存
if all_data:
df = pd.DataFrame(all_data)
df.to_csv("tenet_test_data_api.csv", index=False, encoding="utf-8-sig")
print(f"\n✅ 成功抓取 {len(all_data)} 条检测数据,已保存至 tenet_test_data_api.csv")
else:
print("⚠ 未获取到任何数据,请检查网络、参数或API可用性")
# 【关键提示】获取总页数的进阶方法:
# 若需精确遍历全部页面,可先请求第1页(from=1,to=9),从响应中提取 total_count 字段(若API支持),再计算 total_pages = ceil(total_count / page_size)
# 当前示例使用固定页数,适用于已知数据量场景;生产环境建议加入自动探测逻辑。注意事项与优化建议:
- ✅ 参数适配:city_name 是必需字段,不同城市返回结果不同;若需全国数据,需枚举主要城市分别请求。
- ✅ 错误处理:增加了HTTP异常捕获与JSON结构校验,防止因单页失败导致整个流程中断。
- ✅ 反爬友好:添加了time.sleep(),避免高频请求被限流;如需加速,可配合requests.Session()复用连接。
- ⚠ 数据完整性:该API返回字段丰富(如test_price、service_url、specimen等),远超原始Selenium方案,但需注意部分字段可能为空(如test_discpr折扣价)。
- ? 动态分页探测:若total_count存在于响应中(部分版本API返回),应优先采用动态分页而非硬编码total_pages,确保不遗漏数据。
相比Selenium方案,本方法执行更快(毫秒级响应)、资源占用更低(无浏览器实例)、稳定性更高(不受前端JS变更影响),是现代网页数据采集的推荐实践。

















