You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium Python 滚动动态表格爬取数据求助

Selenium Python 滚动动态表格爬取数据求助

我现在要爬取一个带滚动加载的表格数据,页面地址是:

https://data.nordpoolgroup.com/auction/day-ahead/prices?deliveryDate=2025-01-15&currency=EUR&aggregation=DailyAggregate&deliveryAreas=AT,FR

目前我能拿到页面初始加载的表格行,但这个表格是内嵌滚动的,得往下滚动才会加载更多数据。有没有大佬能指点下,怎么用Selenium实现滚动表格并抓取所有数据呀?


给你几个实用的思路和代码示例:

首先要明确:这类内嵌滚动表格,滚动的不是整个页面,而是表格自身的容器元素,所以第一步得先找到这个滚动容器。

1. 定位滚动容器

打开浏览器开发者工具,找到表格的父级容器(一般是带有overflow: autooverflow-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&currency=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

火山引擎 最新活动