如何抓取网页内动态加载的表格?以xacte马拉松数据页为例
抓取动态表格数据的解决方案
问题分析
你之前的代码仅定位了结果标签容器,但表格数据是通过异步AJAX请求动态渲染的,直接定位容器无法获取实际数据;另外未设置等待逻辑,页面还没加载完成就执行元素定位,导致拿不到内容。
方案一:优化Selenium实现
通过显式等待确保表格数据加载完成,再定位实际的表格内容:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://live.xacte.com/lamarathon/") # 显式等待表格行加载完成(最多等待10秒) wait = WebDriverWait(driver, 10) # 定位表格的实际数据行 table_rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#xact_results_tabs_results table tbody tr"))) # 遍历提取数据 for row in table_rows: columns = row.find_elements(By.TAG_NAME, "td") row_data = [col.text.strip() for col in columns] print(row_data) driver.quit()
方案二:直接抓取后端API(更高效)
Selenium运行效率较低,该网站的表格数据是通过后端接口返回的JSON,直接请求接口即可:
- 打开浏览器开发者工具(F12),切换到Network面板,勾选XHR过滤选项
- 刷新页面或切换结果标签,找到返回数据的请求(通常URL包含
results或data关键字) - 复制该请求的URL、请求头和参数,用
requests库直接请求:
import requests # 替换为实际找到的API接口URL api_url = "http://live.xacte.com/lamarathon/results/load_results" # 根据实际请求参数调整,比如分页、分类参数 params = { "page": 1, "per_page": 50 } headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(api_url, params=params, headers=headers) data = response.json() # 提取表格数据(根据返回的JSON结构调整) for item in data["results"]: print(item["name"], item["time"], item["position"])
注意事项
- 若API请求需要验证(如Cookie),可从浏览器复制对应的Cookie值添加到
headers中 - 分页数据需循环请求不同
page参数,直到返回数据为空
内容的提问来源于stack exchange,提问作者Khang Nguyen
相关产品推荐
相关产品推荐

