Web Scraping:如何使用Selenium抓取网页图表中动态悬浮提示信息
Selenium抓取图表悬浮tooltip动态数据实现方案
- 第一步:定位所有柱状图元素
调用Selenium的元素查找方法,定位到图表中所有需要触发悬浮提示的柱状条DOM元素,统一存入列表备用。可搭配显式等待WebDriverWait使用,避免元素未完全加载导致的查找报错。 - 第二步:实现鼠标悬停交互
导入Selenium的ActionChains交互类,遍历第一步拿到的所有柱状条元素,逐个执行鼠标悬停操作,悬停后设置100-300毫秒的等待时间,保证悬浮提示框完全渲染。 - 第三步:定位提取动态数值
提前确认悬浮提示框的固定元素定位规则(这类组件的class属性通常为固定通用命名,比如highcharts-tooltip、ant-tooltip等),悬停完成后直接查找该元素提取text属性,即可拿到当前对应的动态数值。
常见问题规避:
- 如果柱状条不在当前可视区域,需要先调用
scroll_into_view()方法将元素滚动到屏幕可见位置,再执行悬停操作- 部分图表的tooltip会挂载在全局body节点下而非图表父节点下,定位时不要限制父节点范围
- 如果tooltip有延迟加载逻辑,可搭配显式等待等待tooltip元素的visible属性为true后再提取内容
- 若图表为canvas渲染,不存在单独的柱状条DOM元素,可计算每个柱状条对应的横向偏移量,使用
ActionChains(driver).move_to_element_with_offset(canvas元素, 偏移X, 偏移Y).perform()的方式逐个触发悬浮提示
参考实现代码(Python)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("目标页面地址") # 等待图表加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "替换为实际柱状条class名")) ) # 获取所有柱状条元素 bars = driver.find_elements(By.CLASS_NAME, "替换为实际柱状条class名") # 配置tooltip定位器 tooltip_locator = (By.CLASS_NAME, "替换为实际tooltip class名") result = [] for bar in bars: # 滚动到元素可见区域 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", bar) # 执行鼠标悬停 ActionChains(driver).move_to_element(bar).perform() # 等待tooltip渲染完成 tooltip = WebDriverWait(driver, 3).until(EC.visibility_of_element_located(tooltip_locator)) # 提取内容存入结果列表 result.append(tooltip.text) print(result) driver.quit()
内容的提问来源于stack exchange,提问作者Abhishek Mishra
相关产品推荐
相关产品推荐

