
本文详细阐述了如何利用Selenium和Python高效地从动态加载的网页表格中抓取特定数据。教程聚焦于解决识别复杂HTML元素(如单个`
`内嵌套多个字段)和处理“加载更多”按钮等动态内容加载的挑战,通过优化定位器、运用`WebDriverWait`进行同步以及健壮的错误处理机制,确保数据提取的准确性与稳定性。
网页数据抓取:Selenium与Python实战指南
在进行网页数据抓取时,经常会遇到动态加载内容和复杂HTML结构的情况,这给传统的数据提取方法带来了挑战。本教程将以从金融网站抓取股票信息为例,详细介绍如何使用Selenium和Python克服这些难题,实现精准、高效的数据提取。
1. 初始化WebDriver与页面导航
首先,我们需要导入必要的Selenium模块,并初始化Chrome浏览器驱动。为了确保页面元素的完整显示,建议最大化浏览器窗口。
from selenium import webdriverfrom selenium.common.exceptions import NoSuchElementException, StaleElementReferenceExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitimport time# 定义目标URLurl = 'https://www.tradingview.com/markets/stocks-turkey/market-movers-all-stocks/'# 初始化Chrome WebDriverdriver = 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
注意事项:
上述代码利用StaleElementReferenceException和NoSuchElementException来判断“加载更多”按钮是否已完全消失或不可用。这是一种处理动态元素消失的健壮策略。虽然time.sleep()在这里用于稍微等待页面响应,但在更复杂的场景中,推荐使用WebDriverWait等待特定元素出现或消失,以实现更精确的同步。
3. 精准提取表格数据
一旦所有数据加载完毕,下一步就是遍历表格行并提取所需的信息。目标网页的结构特点是,股票代码和名称可能嵌套在同一个
元素内。我们需要通过更精细的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')))
接下来,遍历每一行并提取数据。对于嵌套在单个
中的元素,我们将使用相对XPath进行定位。
# 遍历每一行并提取数据for i, row in enumerate(rows): try: # 提取股票代码:位于第一个内的标签文本 ticker_symbol = row.find_element(By.XPATH, './td[1]//a').text # 提取股票名称:位于第一个 内的标签文本 ticker_name = row.find_element(By.XPATH, './td[1]//sup').text # 提取价格:位于第二个 的文本 ticker_price = row.find_element(By.XPATH, './td[2]').text # 提取市值:位于第六个 的文本 ticker_marketcap = row.find_element(By.XPATH, './td[6]').text # 提取行业:位于第十一个 内的标签文本 # 注意:某些行可能没有行业信息,需要使用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,即)查找子元素时,使用./开头表示从当前元素开始查找。td[1]选择第一个元素,//a则在其内部查找任意层级的元素。这种方式对于从复杂单元格中分离数据非常有效。处理缺失元素: 并非所有数据行都包含所有字段(例如,某些股票可能没有明确的行业分类)。使用try-except NoSuchElementException块是处理这种情况的健壮方法,可以避免程序崩溃并提供默认值。
4. 完整代码示例
将上述所有部分整合,形成一个完整且可运行的Python脚本:
from selenium import webdriverfrom selenium.common.exceptions import NoSuchElementException, StaleElementReferenceExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitimport time# 定义目标URLurl = 'https://www.tradingview.com/markets/stocks-turkey/market-movers-all-stocks/'# 初始化Chrome WebDriverdriver = 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以上就是使用Selenium和Python从动态加载的网页表格中精准提取数据的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1379755.html赞 (0)打赏微信扫一扫
支付宝扫一扫
Python教程:如何识别各位乘积等于自身的两位数上一篇 2025年12月14日 20:55:38实现Angular-Flask应用中的用户数据个性化功能下一篇 2025年12月14日 20:55:48![]()
微信扫一扫
支付宝扫一扫