
本文介绍如何绕过 selenium 渲染难题,直接调用后端 rest api 获取 gavlepistol 赛事名单中各 squad、participant 等结构化数据,避免因 react 动态加载导致的元素定位失败问题。
本文介绍如何绕过 selenium 渲染难题,直接调用后端 rest api 获取 gavlepistol 赛事名单中各 squad、participant 等结构化数据,避免因 react 动态加载导致的元素定位失败问题。
在爬取基于 React 构建的现代 Web 应用(如 https://www.php.cn/link/71585b1edc15fa6b66d97a747392bc43)时,常见误区是依赖 Selenium 等浏览器自动化工具“等待并查找 DOM 元素”。但该页面实际采用客户端渲染(CSR),关键内容(如 .rv-squad、.rv-participant)由 JavaScript 异步拉取 JSON 数据后动态注入;即使使用 time.sleep(5) 或显式等待,若未触发对应 API 请求或未完成状态更新,find_elements(By.CLASS_NAME, ...) 仍会返回空列表——正如提问中所见:driver.find_elements(By.CLASS_NAME, 'div.rv-squad-header.full') 语法本身错误(By.CLASS_NAME 不支持 CSS 选择器),且目标元素在初始 HTML 中根本不存在。
更优解:直连后端 API,获取原始结构化数据
经分析,该站点存在公开、未鉴权的 REST 接口(如 https://dev.bitnux.com/anmalan/competition/{id}),数据格式规范、字段清晰,远比解析渲染后的 DOM 可靠高效。以下是推荐实现:
import requests
# Step 1: 获取赛事基本信息及所有赛程事件
competition_url = "https://dev.bitnux.com/anmalan/competition/653"
competition_data = requests.get(competition_url).json()
print("赛事名称:", competition_data["name"])
print("-" * 80)
# Step 2: 遍历每个赛程(event),获取对应 squad 名单
squad_template = "https://dev.bitnux.com/anmalan/schedules/{schedule_id}/squad"
for event in competition_data["events"]:
schedule_id = event["schedule"]
try:
squad_response = requests.get(squad_template.format(schedule_id=schedule_id))
squad_response.raise_for_status()
squad_data = squad_response.json()
for squad in squad_data:
if not squad["entries"]: # 跳过无参赛者的分组
continue
print(f"\n【发枪时间】{squad['time']}")
print(f"{'姓名':<25} {'所属组织':<45} {'组别'}")
print("-" * 80)
for entry in squad["entries"]:
print(f'{entry["name"]:<25} {entry["organization"]:<45} {entry["division"]}')
except requests.exceptions.RequestException as e:
print(f"请求赛程 {schedule_id} 失败: {e}")✅ 优势总结:
- 稳定性高:不依赖前端渲染逻辑、JavaScript 执行状态或 DOM 结构变更;
- 性能优异:省去浏览器启动、页面加载、JS 执行等开销,响应更快;
- 数据纯净:直接获取 JSON 原始字段(如 name, organization, division),无需复杂 CSS/XPath 提取与清洗;
- 易扩展:可轻松批量处理多个 competition_id,支持分页、条件过滤等高级操作。
⚠️ 注意事项:
- 该 API 地址(dev.bitnux.com)属开发环境,生产环境可能迁移或增加鉴权,请通过浏览器开发者工具(Network → XHR/Fetch)实时验证接口路径与响应格式;
- 添加异常处理(如 requests.exceptions.RequestException)确保网络波动时程序健壮;
- 若需长期稳定使用,建议联系网站方确认 API 使用政策,避免违反 robots.txt 或服务条款。
通过转向 API 优先策略,你不仅能解决当前 Selenium 抓取失败的问题,更能建立更可靠、可维护的数据采集流程。


















