Python爬虫:图表悬停数据提取技巧
时间:2025-07-30 15:36:27 228浏览 收藏
学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Python爬虫:提取网页图表悬停数据技巧》,以下内容主要包含等知识点,如果你正在学习或准备学习文章,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!
在进行网页数据抓取时,我们经常会遇到数据以动态方式呈现的情况,例如图表中的详细信息通常在鼠标悬停时才显示。对于这类场景,许多开发者会首先考虑使用Selenium等浏览器自动化工具来模拟用户行为。然而,并非所有动态内容都需要完整的浏览器模拟,有时通过更直接的方式可以显著提高效率和稳定性。
问题分析:Selenium鼠标悬停的局限性
原始问题中尝试使用Selenium来模拟鼠标悬停以获取图表数据。其核心思路是定位图表元素,然后对每个潜在的数据点执行鼠标悬停操作,期望通过ActionChains触发悬停信息并抓取。
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC options = Options() options.add_argument("start-maximized") webdriver_service = Service() driver = webdriver.Chrome(options=options, service=webdriver_service) driver.get('https://www.cpubenchmark.net/cpu.php?cpu=Intel+Core+i9-11900K+%40+3.50GHz&id=3904') # 尝试定位图表元素 element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='placeholder']/div/canvas[2]"))) # 错误点:element是一个WebElement对象,不可迭代 for el in element: ActionChains(driver).move_to_element(el).perform() mouseover = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.SELECTOR, ".placeholder > div > div.canvasjs-chart-tooltip > div > span"))) print(mouseover.text)
上述代码存在两个主要问题:
- WebElement对象不可迭代: EC.presence_of_element_located返回的是一个WebElement对象,而不是一个列表。因此,直接对其进行for el in element循环会导致'WebElement' object is not iterable错误。即使改为find_elements,也需要精确知道每个数据点的子元素才能有效模拟悬停。
- 效率与稳定性: 依赖Selenium模拟复杂的UI交互(如精确地在图表的每个数据点上悬停并等待提示出现)效率低下,且容易受到页面加载速度、元素定位不准或DOM结构微小变化的影响,导致抓取不稳定。
在许多情况下,图表所展示的数据并非完全通过前端AJAX请求动态获取,而是直接嵌入在页面的JavaScript代码中。这意味着,我们无需模拟浏览器行为,可以直接从网页源代码中提取这些数据。
更优方案:Requests + 正则表达式 + Pandas
对于CPU价格历史图表这类数据,通过检查网页源代码可以发现,其数据通常以JavaScript变量的形式直接存在于HTML中。例如,常见的图表库(如CanvasJS、Highcharts等)在初始化时会直接在