使用BeautifulSoup、Selenium爬取rarity.tools的NFT属性数量返回None如何解决
问题原因
- requests方案失败:目标站点采用客户端渲染模式,页面核心数据由JavaScript在页面加载完成后异步请求接口渲染生成,直接请求URL返回的初始HTML源码中不存在你要查找的
div.flex-grow.overflow-hidden元素,因此BeautifulSoup匹配结果为None。 - Selenium方案失败:存在两处错误,一是标签匹配错误,你要查找的是div标签,但xpath规则写的是匹配td标签;二是没有添加页面加载等待逻辑,执行元素查找时页面异步数据还未加载完成,自然无法拿到目标元素。
解决方法
方案1:修正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 driver = webdriver.Firefox(executable_path="/usr/local/bin/geckodriver") # 配置最长10秒等待时间,直到目标元素加载完成 wait = WebDriverWait(driver, 10) driver.get('https://rarity.tools/boredapeyachtclub/view/1') try: # 修正匹配规则,查找对应class属性的div元素 trait_element = wait.until( EC.presence_of_element_located((By.XPATH, '//div[@class="flex-grow overflow-hidden"]')) ) # 打印元素文本即可得到你要的属性数量 print(trait_element.text) finally: driver.quit()
如果页面存在多个同class的div,你可以进一步缩小匹配范围,比如通过定位Trait Count标签的相邻元素做更精准的匹配。
方案2:直接调用数据接口(更高效)
你可以通过浏览器开发者工具的网络面板抓包拿到站点的NFT数据接口,直接请求接口获取JSON格式的数据,直接提取对应字段即可,不需要渲染整个页面,运行效率远高于Selenium方案。
内容的提问来源于stack exchange,提问作者Meowsleydale
相关产品推荐
相关产品推荐

