网页爬取:无法定位指定span类获取CD账户APY数据,代码返回空列表
解决NerdWallet CD账户页面APY爬取返回空列表的问题
你的代码返回空列表,主要有以下几个原因及对应解决办法:
1. 页面内容动态加载
NerdWallet的CD账户APY数据大概率是通过JavaScript动态渲染的,requests.get()只能获取初始静态HTML,无法加载JS生成的内容,所以找不到目标元素。
解决办法:模拟浏览器加载页面
使用Selenium或Playwright这类工具模拟浏览器行为,执行JS后获取完整渲染的页面。以下是Selenium的示例代码:
首先安装依赖:
pip install selenium webdriver-manager
代码实现:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time url = 'https://www.nerdwallet.com/rates/banking/cd-accounts' # 初始化Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) # 等待页面完全加载(可根据实际情况调整等待时间) time.sleep(3) # 通过CSS选择器定位目标span元素(Selenium不支持直接传多个类名,用CSS选择器语法) apy_spans = driver.find_elements(By.CSS_SELECTOR, "span._1f39sH._24b0kK.DFVVwC") # 提取并打印APY信息 for span in apy_spans: print(span.text) # 关闭浏览器 driver.quit()
2. 动态生成的类名不可靠
你使用的_1f39sH _24b0kK DFVVwC这类类名,很可能是前端框架(如React)压缩生成的动态类名,页面更新后可能会变化,导致定位失效。
解决办法:改用稳定的定位方式
比如通过元素的文本特征、父容器结构或自定义属性定位:
# 示例:用XPath定位包含百分比(APY特征)的span元素 apy_elements = driver.find_elements(By.XPATH, "//span[contains(text(), '%') and contains(@class, 'DFVVwC')]")
3. 网站反爬机制拦截
部分网站会检测非浏览器请求,返回不完整内容。模拟浏览器请求(如上述Selenium方案)可绕过大部分基础反爬,若仍被拦截,可尝试添加代理、调整请求间隔模拟人类操作。
更高效的方案:直接调用API
打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面后查找返回APY数据的XHR/Fetch请求,直接调用对应API接口获取JSON格式数据,比模拟浏览器更高效。例如:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Referer': 'https://www.nerdwallet.com/rates/banking/cd-accounts' } # 替换为实际找到的API接口URL api_url = 'https://api.nerdwallet.com/xxx/cd-accounts' response = requests.get(api_url, headers=headers) data = response.json() # 解析JSON提取APY信息 for item in data.get('accounts', []): print(f"银行:{item.get('bank_name')},APY:{item.get('apy')}")
内容的提问来源于stack exchange,提问作者Rupeshwar Kumar
相关产品推荐
相关产品推荐

