Selenium Python 滚动动态表格爬取数据求助
Selenium Python 滚动动态表格爬取数据求助
我现在要爬取一个带滚动加载的表格数据,页面地址是:
https://data.nordpoolgroup.com/auction/day-ahead/prices?deliveryDate=2025-01-15¤cy=EUR&aggregation=DailyAggregate&deliveryAreas=AT,FR
目前我能拿到页面初始加载的表格行,但这个表格是内嵌滚动的,得往下滚动才会加载更多数据。有没有大佬能指点下,怎么用Selenium实现滚动表格并抓取所有数据呀?
给你几个实用的思路和代码示例:
首先要明确:这类内嵌滚动表格,滚动的不是整个页面,而是表格自身的容器元素,所以第一步得先找到这个滚动容器。
1. 定位滚动容器
打开浏览器开发者工具,找到表格的父级容器(一般是带有overflow: auto或overflow-y: scroll样式的div),用合适的选择器定位它。比如这个页面的表格,滚动容器大概率是带特定class或data属性的div,你可以自己确认下。
2. 循环滚动+等待加载
核心思路是:每次把容器滚动到底部,等待新数据加载,然后检查滚动高度是否变化——如果高度不变,说明没有更多数据了,就停止滚动。
示例代码如下:
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 import time # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://data.nordpoolgroup.com/auction/day-ahead/prices?deliveryDate=2025-01-15¤cy=EUR&aggregation=DailyAggregate&deliveryAreas=AT,FR") driver.maximize_window() # 先等表格加载出来 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "table"))) # 定位滚动容器(这里的选择器需要你根据实际页面调整,比如替换成你找到的容器的CSS选择器) scroll_container = driver.find_element(By.CSS_SELECTOR, "div[data-testid='table-scroll']") # 记录初始滚动高度 last_scroll_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) while True: # 执行JS脚本,把容器滚动到底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container) # 等待数据加载,时间可以根据页面速度调整,也可以用WebDriverWait替代固定sleep time.sleep(2) # 获取新的滚动高度 new_scroll_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) # 如果高度没变化,说明没有新数据了,退出循环 if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height # 现在所有数据都加载出来了,开始抓取表格行 all_rows = driver.find_elements(By.CSS_SELECTOR, "table tr") for row in all_rows: cells = row.find_elements(By.TAG_NAME, "td") # 提取每行的单元格文本 row_content = [cell.text.strip() for cell in cells if cell.text.strip()] print(row_content) driver.quit()
3. 优化小技巧
- 用
WebDriverWait替代固定time.sleep更可靠:比如滚动后等待新的行出现,或者等待最后一行元素失效(说明有新数据加载)# 滚动后等待新行加载的示例 try: # 等待之前的最后一行元素失效,说明有新行加载 WebDriverWait(driver, 5).until(EC.staleness_of(all_rows[-1])) except: # 超时说明没有新数据,退出循环 break - 要是滚动容器不好定位,也可以尝试模拟鼠标滚轮滚动,但这种方法不如直接操作滚动容器稳定。
备注:内容来源于stack exchange,提问作者free_1




