如何用Selenium/BS4爬取Cardmarket中Canvas渲染的卡牌价格图表数据?
解决Cardmarket卡牌价格波动图表爬取问题
优先方案:直接提取原始数据
Canvas渲染的图表数据根本不在Canvas里,而是存在页面的JS变量中,别浪费时间爬Canvas本身:
- 打开浏览器F12控制台,输入
console.log(window),找和价格历史相关的变量(比如priceHistory、chartData这类),记下来变量名。 - 用Selenium执行JS代码直接拿数据:
# 假设已经用Selenium打开了目标卡牌页面 chart_data = driver.execute_script("return window.priceHistory;") # 拿到数据后,直接用PySide6的QtCharts自己画图表,比用图片灵活多了 print(chart_data)
备选方案:截取Canvas生成的图片
如果一定要拿现成的图表图片,直接用Selenium截Canvas元素的图:
- 先确保Canvas完全渲染,别刚加载完页面就截图,要么加个短sleep,要么用显式等待:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等Canvas加载出来 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "canvas")) ) # 定位Canvas并截图 canvas = driver.find_element(By.TAG_NAME, "canvas") screenshot_bytes = canvas.screenshot_as_png # 保存成图片或者直接传给PySide6的QPixmap用 with open("card_price_chart.png", "wb") as f: f.write(screenshot_bytes)
为啥你之前的方法没用?
- 爬Canvas信息:Canvas只是个绘图容器,本身不存数据,自然拿不到东西。
- Canvas转图片爬取:大概率是没等图表渲染完成就截了,或者Canvas元素定位错了。
- 常规网页爬取:BeautifulSoup只能解析静态HTML,JS动态生成的数据不会出现在静态源码里,所以返回空。
内容的提问来源于stack exchange,提问作者JustAMan
相关产品推荐
相关产品推荐

