You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:05:52