如何用Python Selenium抓取Canvas图形中Aavegotchi的7天日度数据?
解决Canvas图表数据抓取问题:用Python+Selenium获取Aavegotchi的日度活动数据
核心思路
别费劲解析Canvas图像——图表的数据都是前端从后端接口拉取后渲染的,直接抓原始数据源比图像识别高效100倍。DappRadar这类站点基于NUXT框架构建,页面数据会存在全局JS变量里,或者可以直接定位到加载图表的API接口。
步骤1:准备依赖
先安装必要的包:
pip install selenium webdriver-manager pandas
步骤2:用Selenium获取页面全局数据
下面是完整代码,直接抓取页面全局变量中的原始活动数据:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import pandas as pd # 初始化浏览器 options = webdriver.ChromeOptions() options.add_argument("--headless=new") # 无头模式,不需要可视化时启用 options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) # 打开目标页面 url = "https://dappradar.com/polygon/games/aavegotchi" driver.get(url) # 等待图表区域加载完成(等待活动图表容器出现) wait = WebDriverWait(driver, 15) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".drd-chart-container"))) # 执行JS获取NUXT全局状态里的活动数据 raw_data = driver.execute_script("return window.__NUXT__.state.dappActivity.data") # 关闭浏览器 driver.quit() # 解析数据:提取过去7天的日度数据 filtered_data = [] # 取数组最后7条(通常是最近7天的数据) for entry in raw_data[-7:]: filtered_data.append({ "date": entry["date"], "transactions": entry["transactions"], "volume": entry["volume"], "uaw": entry["uaw"] }) # 反转数组,让日期按从早到晚排列(可选) filtered_data.reverse() # 存储数据到CSV df = pd.DataFrame(filtered_data) df.to_csv("aavegotchi_7d_activity.csv", index=False) print("数据已保存到aavegotchi_7d_activity.csv")
步骤3:备选方案——直接调用API
如果全局变量结构有变化,可以通过Chrome DevTools找加载数据的API接口:
- 打开目标页面按F12,切换到Network标签后刷新页面
- 搜索包含
activity或history的请求,找到类似https://api.dappradar.com/dapps/xxx/activity?period=7d的接口 - 直接用
requests请求该接口,带上必要请求头
示例代码(假设API接口已找到):
import requests import pandas as pd headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } api_url = "https://api.dappradar.com/dapps/1234/activity?period=7d" response = requests.get(api_url, headers=headers) data = response.json() # 解析并保存数据 filtered_data = [{ "date": entry["date"], "transactions": entry["transactions"], "volume": entry["volume"], "uaw": entry["uaw"] } for entry in data] df = pd.DataFrame(filtered_data) df.to_csv("aavegotchi_7d_activity.csv", index=False)
注意事项
- 反爬限制:DappRadar可能会拦截频繁请求,建议添加随机延迟或使用代理
- 变量路径更新:如果
window.__NUXT__.state.dappActivity.data失效,可在DevTools的Console标签输入window.__NUXT__查看最新数据路径 - 字段匹配:确保提取的字段名和API返回一致,比如
uaw可能变为uniqueActiveWallets,需根据实际返回调整
内容的提问来源于stack exchange,提问作者Nikarun
相关产品推荐
相关产品推荐

