使用Python爬取CoinMarketCap加密货币价格返回None该如何解决
问题原因排查
- 第一,动态ID失效:CoinMarketCap前端使用自动化构建工具生成元素id,
priceValue___11gHJ这类带随机哈希后缀的id会随平台版本更新变化,你写代码时查到的id现在已经失效。 - 第二,客户端渲染数据未加载:requests库只能拿到页面初始静态HTML,CoinMarketCap的价格数据是通过JS异步请求接口加载后渲染到页面的,初始HTML里不存在你要找的价格元素。
可行解决方案
方案1:提取静态HTML内嵌的结构化数据(改动最小,无需额外工具)
初始HTML里会嵌入JSON-LD格式的页面元数据,里面包含价格信息,直接提取解析即可,适配你原有的技术栈:
from bs4 import BeautifulSoup as S import requests import json c = input('enter your coin') url = f'https://coinmarketcap.com/currencies/{c}/' headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} r = requests.get(url,headers=headers) soup = S(r.content,'html.parser') # 提取内嵌的结构化元数据 json_ld = soup.find('script', type='application/ld+json').string data = json.loads(json_ld) price = data[0]['currentExchangeRate']['price'] print(f'the price of {c} now is {price}')
方案2:调用官方公开API(最稳定)
CoinMarketCap提供免费开发者API,不需要爬页面,直接请求接口拿结构化数据,不会出现元素定位失效的问题,免费额度足够个人日常使用,只需注册账号获取API密钥即可使用:
import requests API_KEY = "你自己申请的API密钥" c = input('enter your coin') url = f"https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?slug={c}" headers = { "X-CMC_PRO_API_KEY": API_KEY, "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } r = requests.get(url, headers=headers) data = r.json() price = data["data"][list(data["data"].keys())[0]]["quote"]["USD"]["price"] print(f'the price of {c} now is {price}')
方案3:改用JS渲染引擎爬取页面(适合需要模拟用户操作的场景)
用Selenium、Playwright这类可以运行JS的自动化工具加载完整页面后再定位元素,定位时不要用带哈希的id,用更稳定的自定义属性即可:
from selenium import webdriver from selenium.webdriver.common.by import By c = input('enter your coin') url = f'https://coinmarketcap.com/currencies/{c}/' driver = webdriver.Chrome() driver.get(url) price_ele = driver.find_element(By.CSS_SELECTOR, '[data-testid="coin-price"]') print(price_ele.text) driver.quit()
内容的提问来源于stack exchange,提问作者data data
相关产品推荐
相关产品推荐

