
本文介绍如何绕过前端分页限制,直接调用tenet diagnostics后台ajax api批量获取全部检测项目数据,避免selenium翻页失效问题,提升爬取稳定性与效率。
本文介绍如何绕过前端分页限制,直接调用tenet diagnostics后台ajax api批量获取全部检测项目数据,避免selenium翻页失效问题,提升爬取稳定性与效率。
在Web爬虫实践中,依赖前端UI翻页(如点击“下一页”按钮)常面临诸多挑战:页面动态加载、元素未及时渲染、DOM结构变更、反爬拦截或JavaScript执行异常等。您提供的Selenium代码虽逻辑清晰,但实际仅获取第一页数据,根本原因在于:目标网站的分页并非传统HTML跳转,而是基于Ajax异步请求的前端渲染机制——li.pagination-next a 元素可能仅作为占位符存在,其点击行为并未真正触发新页面加载,或页面未完成重绘即进入下一轮循环,导致extract_test_data()反复抓取同一组DOM。
更可靠、高效的解决方案是逆向分析并直连后端分页API。通过浏览器开发者工具(Network → XHR)可发现,该站点所有检测数据均来自统一接口:
POST https://infinity.tenetdiagnostics.in/GetServices
该接口支持分页参数 from 和 to(表示结果集的起始与结束序号),无需登录、无严格校验,适合程序化调用。
✅ 推荐实现方式(Requests + 分页参数控制)
以下为优化后的完整示例代码,使用requests轻量发起HTTP请求,结合pandas结构化处理数据:
import pandas as pd
import requests
import time
# API端点与基础载荷
api_url = "https://infinity.tenetdiagnostics.in/GetServices"
base_payload = {
"test_name": "",
"test_type": "",
"condition_id": "",
"speciality_id": "",
"category_type": "p", # "p" 表示病理类检测
"sort_by": "",
"sort_order": "",
"organ_id": "",
"city_name": "Hyderabad", # 城市可按需修改
"from": "1",
"to": "9",
"is_popular": ""
}
all_records = []
page_size = 9 # 每页固定返回9条记录
# 自动探测总页数(可选):先请求第1页获取total_count,再计算页数
# 此处简化为循环抓取前N页(建议先手动确认总数量)
for page in range(0, 10): # 示例:抓取前10页(共90条)
print(f"正在抓取第 {page + 1} 页...")
# 动态设置分页范围:from=1→9, to=9→17, ...
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()
data = response.json()
if not data.get("data"):
print(f"第 {page + 1} 页无数据,已到达末页。")
break
all_records.extend(data["data"])
time.sleep(0.5) # 轻量延时,降低请求频率,尊重服务器
except Exception as e:
print(f"第 {page + 1} 页请求失败:{e}")
break
# 转为DataFrame并保存
df = pd.DataFrame(all_records)
df.to_csv("tenet_tests_api.csv", index=False, encoding="utf-8-sig")
print(f"成功抓取 {len(all_records)} 条检测数据,已保存至 tenet_tests_api.csv")
⚠️ 关键注意事项
- 参数灵活性:city_name、category_type 等字段可根据实际需求调整,例如将 "p" 改为 "c" 可抓取临床类检测。
- 分页边界:from 和 to 是1-based索引,且必须为整数字符串;若to超出总量,API仍返回有效数据直至末尾。
- 错误处理:添加了try-except与time.sleep(),避免因网络抖动或限频导致中断。
- 数据清洗建议:返回字段如test_name、test_price可能存在空格或单位(如"₹2190.00"),后续可用df["test_price"].str.extract(r'(\d+\.?\d*)')清洗。
- 法律与合规性:请务必查阅目标网站robots.txt及服务条款,本方案仅适用于公开、非敏感、允许自动化访问的数据场景。
相比Selenium方案,此方法具备显著优势:执行速度快(毫秒级响应)、资源占用低、稳定性高、易于扩展(支持并发、增量抓取)。当遇到类似“翻页无效”问题时,优先排查是否存在隐藏API,往往比模拟浏览器操作更本质、更可持续。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










