如何用Python+Selenium抓取Canvas中的高低价及当前价格?
解决方案:绕过Canvas解析,直接提取页面原始数据
Canvas是可视化渲染后的元素,解析像素获取价格既低效又不可靠。直接通过Selenium操作页面并提取已加载的原始数据是最优方案,具体步骤如下:
1. 开启Settings中的Scale选项
先模拟用户操作打开设置面板,开启高低价线条显示:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化Chrome浏览器(需确保ChromeDriver路径已配置) driver = webdriver.Chrome() driver.get("https://www.dexview.com/eth/0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE") driver.maximize_window() # 等待页面加载完成,点击Settings按钮 wait = WebDriverWait(driver, 15) settings_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.settings-btn"))) settings_button.click() # 定位Scale选项的开关并勾选(若未选中) scale_switch = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='scale']"))) if not scale_switch.is_selected(): scale_switch.click() # 关闭设置面板 close_panel_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".settings-panel .close-btn"))) close_panel_btn.click() time.sleep(2) # 等待页面更新高低价线条
2. 提取价格数据
方法1:直接抓取页面显示的元素
当前价格通常会在页面显眼位置展示,直接定位DOM元素提取:
# 获取当前价格 current_price_elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".token-price .price-value"))) current_price = current_price_elem.text print(f"当前价格: {current_price}")
方法2:从页面全局JS变量提取高低价
行情网站一般会将原始数据存在全局JS变量中,通过浏览器F12控制台查看window对象可找到对应数据源,用Selenium执行JS脚本提取:
# 执行JS脚本获取价格范围数据 price_range = driver.execute_script(""" // 实际需根据页面全局变量调整,示例为常见存储方式 return window.__NEXT_DATA__?.props?.pageProps?.tokenData?.priceStats; """) if price_range: print(f"最高价: {price_range.high24h}") print(f"最低价: {price_range.low24h}") else: # 备选方案:从Chart实例中提取数据(若页面用Chart.js渲染) chart = driver.execute_script("return document.querySelector('canvas').chart;") if chart: # 提取所有数据点的价格值 all_prices = [point.y for point in chart.data.datasets[0].data if point.y is not None] print(f"最高价: {max(all_prices)}") print(f"最低价: {min(all_prices)}")
重要提示
- 避免解析Canvas:Canvas是像素级渲染结果,提取数据需要图像识别,易受页面缩放、样式变化影响,完全没必要。
- 动态调整选择器:网站可能会更新页面结构,若代码运行报错,需重新用浏览器开发者工具定位元素的CSS_SELECTOR或XPATH。
- 处理反爬:若页面有反爬机制,可添加
time.sleep()、更换User-Agent或使用代理IP。
内容的提问来源于stack exchange,提问作者lasb3tas
相关产品推荐
相关产品推荐

