如何使用 Selenium 正确抓取动态网页中的表格数据

来源:编程学习作者:叶知晏头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何使用 Selenium 正确抓取动态网页中的表格数据》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用 Selenium 正确抓取动态网页中的表格数据》有用,将其分享出去将是对创作者最好的鼓励。

动态网页中的表格数据往往不会在初始HTML响应中直接返回,而是通过JavaScript在页面加载完成后异步请求接口再渲染到页面上,普通的HTTP请求库无法执行JS代码,因此无法获取到这类表格内容,使用Selenium模拟真实浏览器操作是解决这个问题的高效方案。

如何使用 Selenium 正确抓取动态网页中的表格数据

环境准备与基础配置

首先需要安装Selenium库和对应浏览器的驱动,这里以Chrome浏览器为例,安装命令如下:

# 安装Selenium库
pip install selenium

# 下载ChromeDriver,需要和本地Chrome版本匹配,放到系统PATH路径下

初始化webdriver的基础代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 配置Chrome选项,可选无头模式减少资源占用
chrome_options = Options()
# chrome_options.add_argument('--headless')  # 无头模式,不需要可视化界面时可开启

# 初始化driver
driver = webdriver.Chrome(options=chrome_options)
# 设置全局隐式等待,最多等待10秒
driver.implicitly_wait(10)

动态表格的加载等待处理

动态表格的渲染需要时间,直接定位表格元素很容易出现找不到元素的错误,需要合理设置等待策略,Selenium提供了隐式等待和显式等待两种方式:

  • 隐式等待:设置全局等待时间,在查找元素时如果元素未立即出现,会在指定时间内不断轮询查找,上面的初始化代码已经设置了10秒隐式等待。
  • 显式等待:针对特定元素设置等待条件,比如等待表格的某个特征元素出现,更适合动态加载场景,示例代码如下:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 打开目标动态网页
driver.get('https://ipipp.com/dynamic_table_demo')

# 显式等待,最多等待15秒,直到表格的tbody元素出现
wait = WebDriverWait(driver, 15)
table_tbody = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'table.dynamic-table tbody'))
)

表格数据定位与提取

表格的常见结构是<table>标签包含<thead>表头和<tbody>表体,我们可以通过层级定位获取所有行和列的数据:

提取表头数据

# 定位表头所有th元素
header_cells = driver.find_elements(By.CSS_SELECTOR, 'table.dynamic-table thead th')
# 提取表头文本
header_list = [cell.text for cell in header_cells]
print('表头数据:', header_list)

提取表体数据

# 定位所有行
rows = driver.find_elements(By.CSS_SELECTOR, 'table.dynamic-table tbody tr')
table_data = []

for row in rows:
    # 定位当前行的所有td单元格
    cells = row.find_elements(By.TAG_NAME, 'td')
    # 提取单元格文本,组成一行数据
    row_data = [cell.text for cell in cells]
    table_data.append(row_data)

# 打印前3行数据查看效果
for i, row in enumerate(table_data[:3]):
    print(f'第{i+1}行数据:{row}')

处理分页与滚动加载的表格

很多动态表格会有分页或者滚动到底部加载更多的功能,需要额外处理这类场景:

分页表格处理

如果是分页表格,可以循环点击下一页按钮,直到没有下一页为止:

all_table_data = []
page_num = 1

while True:
    print(f'正在抓取第{page_num}页数据')
    # 提取当前页数据
    rows = driver.find_elements(By.CSS_SELECTOR, 'table.dynamic-table tbody tr')
    for row in rows:
        cells = row.find_elements(By.TAG_NAME, 'td')
        all_table_data.append([cell.text for cell in cells])
    
    # 尝试查找下一页按钮
    try:
        next_btn = driver.find_element(By.CSS_SELECTOR, 'button.next-page')
        # 判断按钮是否可点击
        if next_btn.get_attribute('disabled'):
            break
        next_btn.click()
        # 点击后等待新页面数据加载
        WebDriverWait(driver, 10).until(
            EC.staleness_of(rows[0])  # 等待旧行元素失效,说明新数据已加载
        )
        page_num += 1
    except:
        # 没有找到下一页按钮,退出循环
        break

print(f'总共抓取到{len(all_table_data)}条数据')

滚动加载表格处理

滚动加载的表格需要模拟滚动操作,触发数据加载:

# 模拟滚动到页面底部,触发加载
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
# 等待新数据加载
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'table.dynamic-table tbody tr:last-child'))
)

数据存储与资源释放

抓取到的表格数据可以存储为CSV或者Excel格式,方便后续使用,存储完成后需要关闭driver释放资源:

import csv

# 存储为CSV文件
with open('dynamic_table_data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    # 先写表头
    writer.writerow(header_list)
    # 写所有数据行
    writer.writerows(all_table_data)

print('数据已存储到dynamic_table_data.csv')

# 关闭浏览器驱动
driver.quit()

常见问题与解决技巧

  • 如果元素定位失败,优先检查等待时间是否足够,或者尝试切换定位方式,比如从CSS选择器换成XPath。
  • 部分动态表格的数据是通过接口返回的,可以在浏览器的开发者工具Network面板中查找数据接口,直接请求接口获取JSON格式数据,效率比解析页面更高。
  • 如果页面有反爬机制,可以添加随机等待时间,或者设置浏览器的user-agent模拟真实用户访问。

Selenium动态网页抓取表格数据提取webdriver修改时间:2026-07-08 20:06:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。