
本文介绍如何绕过 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"{'姓名':<p>✅ <strong>优势总结</strong>: </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6764" title="react design"><img
src="https://img.php.cn/upload/skill/000/000/081/179110634625220.jpg" alt="react design" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6764" title="react design" class="overflowclass">react design</a>
<p class="overflowclass">将 Learn Social Studies 品牌系统应用于 React 界面,采用 CSS 变量、可复用组件规范,默认浅色主题并支持深色主题。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6764" title="react design" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 稳定性高:不依赖前端渲染逻辑、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 抓取失败的问题,更能建立更可靠、可维护的数据采集流程。










