0

0

使用Selenium和Python从动态加载的网页表格中精准提取数据

花韻仙語

花韻仙語

发布时间:2025-11-13 13:16:30

|

736人浏览过

|

来源于php中文网

原创

使用selenium和python从动态加载的网页表格中精准提取数据

本文详细阐述了如何利用Selenium和Python高效地从动态加载的网页表格中抓取特定数据。教程聚焦于解决识别复杂HTML元素(如单个`

`内嵌套多个字段)和处理“加载更多”按钮等动态内容加载的挑战,通过优化定位器、运用`WebDriverWait`进行同步以及健壮的错误处理机制,确保数据提取的准确性与稳定性。

网页数据抓取:Selenium与Python实战指南

在进行网页数据抓取时,经常会遇到动态加载内容和复杂HTML结构的情况,这给传统的数据提取方法带来了挑战。本教程将以从金融网站抓取股票信息为例,详细介绍如何使用Selenium和Python克服这些难题,实现精准、高效的数据提取。

1. 初始化WebDriver与页面导航

首先,我们需要导入必要的Selenium模块,并初始化Chrome浏览器驱动。为了确保页面元素的完整显示,建议最大化浏览器窗口。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time

# 定义目标URL
url = 'https://www.tradingview.com/markets/stocks-turkey/market-movers-all-stocks/'

# 初始化Chrome WebDriver
driver = webdriver.Chrome()
# 最大化浏览器窗口,有助于确保所有元素可见
driver.maximize_window()
# 访问目标网页
driver.get(url)

2. 处理动态加载内容(“加载更多”按钮)

许多网站采用无限滚动或“加载更多”按钮来动态加载数据。为了获取所有数据,我们需要模拟点击这些按钮直到所有内容加载完毕。这里我们采用一个while循环,持续点击“Load More”按钮,直到按钮不再出现或变为陈旧(StaleElementReferenceException)。

立即学习Python免费学习笔记(深入)”;

print("开始加载所有数据...")
while True:
    try:
        # 尝试查找并点击“Load More”按钮
        # 使用text()函数定位包含特定文本的span元素
        load_more_button = driver.find_element(By.XPATH, '//span[text()="Load More"]')
        load_more_button.click()
        # 添加一个短暂的等待,让页面有时间响应点击并加载新内容
        time.sleep(0.5) 
    except StaleElementReferenceException:
        # 当“Load More”按钮不再出现或其引用失效时,说明所有内容已加载,跳出循环
        print("所有数据已加载或“加载更多”按钮已消失。")
        break
    except NoSuchElementException:
        # 如果一开始就没有找到“Load More”按钮,或者所有数据加载完毕后按钮彻底消失,也跳出循环
        print("未找到“加载更多”按钮,可能已加载完毕或页面结构不同。")
        break
    except Exception as e:
        # 捕获其他可能的异常
        print(f"点击“加载更多”时发生未知错误: {e}")
        break

注意事项:

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载
  • 上述代码利用StaleElementReferenceException和NoSuchElementException来判断“加载更多”按钮是否已完全消失或不可用。这是一种处理动态元素消失的健壮策略。
  • 虽然time.sleep()在这里用于稍微等待页面响应,但在更复杂的场景中,推荐使用WebDriverWait等待特定元素出现或消失,以实现更精确的同步。

3. 精准提取表格数据

一旦所有数据加载完毕,下一步就是遍历表格行并提取所需的信息。目标网页的结构特点是,股票代码和名称可能嵌套在同一个<td>元素内。我们需要通过更精细的XPath或CSS选择器来定位这些子元素。

首先,使用WebDriverWait等待所有表格行可见,以确保页面加载稳定。

print("开始提取数据...")
# 初始化WebDriverWait,设置最大等待时间为10秒
wait = WebDriverWait(driver, 10)
# 等待所有具有特定CSS选择器的表格行可见
# 'table[class="table-Ngq2xrcG"] tr.listRow' 精确定位到表格主体内的每一行数据
rows = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,'table[class="table-Ngq2xrcG"] tr.listRow')))

接下来,遍历每一行并提取数据。对于嵌套在单个<td>中的元素,我们将使用相对XPath进行定位。

# 遍历每一行并提取数据
for i, row in enumerate(rows):
    try:
        # 提取股票代码:位于第一个<td>内的<a>标签文本
        ticker_symbol = row.find_element(By.XPATH, './td[1]//a').text
        # 提取股票名称:位于第一个<td>内的<sup>标签文本
        ticker_name = row.find_element(By.XPATH, './td[1]//sup').text
        # 提取价格:位于第二个<td>的文本
        ticker_price = row.find_element(By.XPATH, './td[2]').text
        # 提取市值:位于第六个<td>的文本
        ticker_marketcap = row.find_element(By.XPATH, './td[6]').text

        # 提取行业:位于第十一个<td>内的<a>标签文本
        # 注意:某些行可能没有行业信息,需要使用try-except处理NoSuchElementException
        try:
            ticker_sector = row.find_element(By.XPATH, './td[11]/a').text
        except NoSuchElementException:
            ticker_sector = "—" # 如果没有找到,则设置为默认值

        # 打印提取到的数据
        print(f"{i+1}. {ticker_symbol} {ticker_name} {ticker_price} {ticker_marketcap} {ticker_sector}")
    except Exception as e:
        print(f"提取第 {i+1} 行数据时发生错误: {e}")
        # 可以选择跳过此行或记录错误信息

关键点解析:

  • 相对XPath (./td[1]//a): 当从一个父元素(row,即<tr>)查找子元素时,使用./开头表示从当前元素开始查找。td[1]选择第一个<td>元素,//a则在其内部查找任意层级的<a>元素。这种方式对于从复杂单元格中分离数据非常有效。
  • 处理缺失元素: 并非所有数据行都包含所有字段(例如,某些股票可能没有明确的行业分类)。使用try-except NoSuchElementException块是处理这种情况的健壮方法,可以避免程序崩溃并提供默认值。

4. 完整代码示例

将上述所有部分整合,形成一个完整且可运行的Python脚本:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time

# 定义目标URL
url = 'https://www.tradingview.com/markets/stocks-turkey/market-movers-all-stocks/'

# 初始化Chrome WebDriver
driver = webdriver.Chrome()
driver.maximize_window() # 最大化窗口
driver.get(url) # 访问网页

print("开始加载所有数据...")
# 循环点击“加载更多”按钮,直到所有数据加载完毕
while True:
    try:
        # 尝试查找并点击“Load More”按钮
        load_more_button = driver.find_element(By.XPATH, '//span[text()="Load More"]')
        load_more_button.click()
        time.sleep(0.5) # 稍微等待,减少StaleElementReferenceException的发生几率
    except StaleElementReferenceException

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1064

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

844

2023.11.06

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

43

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

174

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 43.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号