BS4与XML中XPath选择器失效:无法获取NFT排名数据
解决Zapper.fi NFT排名数据获取失败的问题
问题原因
Zapper.fi是单页应用(SPA),页面内容通过JavaScript动态渲染。你用requests获取的是静态HTML源码,里面并没有包含NFT排名这类需要动态加载的数据,所以XPath查询自然返回空列表。
解决方案
方法1:调用Zapper的官方API(推荐)
直接通过API请求获取数据,比爬页面更高效稳定。你可以在浏览器开发者工具的「网络」标签里,筛选XHR请求,找到返回NFT详情的接口。示例代码如下:
import requests # 替换为实际找到的API端点 api_url = "https://api.zapper.fi/v2/nft/ethereum/0x2a6eec51ee67a941fa50c1fbc4ca8853604461b8/616" headers = { "Accept": "application/json", "Authorization": "Bearer YOUR_API_KEY" # 部分接口需要API密钥,可在Zapper开发者平台申请 } response = requests.get(api_url, headers=headers) data = response.json() rank = data.get("rank") # 根据实际返回的JSON结构调整字段名 print(rank)
注意:部分Zapper API需要申请API密钥,请求时需携带
Authorization头,具体可参考Zapper官方开发者指引。
方法2:用Selenium模拟浏览器加载页面
如果不想处理API认证,可以用Selenium模拟浏览器打开页面,等待动态内容加载完成后再提取数据:
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 url = 'https://zapper.fi/nft/ethereum/0x2a6eec51ee67a941fa50c1fbc4ca8853604461b8/616' # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) # 等待排名元素加载完成,超时时间10秒 wait = WebDriverWait(driver, 10) rank_element = wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[2]/div[3]/main/div/div/div/div/div[2]/div[1]/div[2]/div[2]/div[1]/div[2]'))) rank = rank_element.text print(rank) driver.quit()
注意:需要先安装Selenium库(
pip install selenium),并确保浏览器驱动版本与本地浏览器版本匹配。
额外提示
- 避免使用绝对XPath(如
/html/body/div[1]/...),这类路径极易因页面结构变化失效,建议改用相对XPath或CSS选择器,比如根据元素的class属性定位://div[contains(@class, 'rank-value')](需根据实际页面class调整)。 - 频繁爬取可能触发网站反爬机制,建议添加请求间隔,遵守网站的
robots.txt规则。
内容的提问来源于stack exchange,提问作者royaeh azadi
相关产品推荐
相关产品推荐

