使用requests+BeautifulSoup爬取雅虎财经股价返回None问题求解
问题原因
- 反爬拦截:雅虎财经对未携带浏览器标识的请求会返回异常页面,直接用requests发起的默认请求会被识别为爬虫,返回的HTML内容不含你要定位的股价元素,因此查找结果为None。
- 定位规则不稳定:你代码中使用的类名是前端框架动态生成的,会随页面版本、访问区域、会话状态变化,硬编码该类名的定位方式本身容错性极低。
修复方案
- 给请求添加
User-Agent请求头,模拟正常浏览器访问 - 改用更稳定的
data-testid属性定位元素,雅虎财经股价元素的data-testid固定为qsp-price,不会随前端渲染逻辑随意变更
修正后代码
import requests from bs4 import BeautifulSoup url = 'https://ca.finance.yahoo.com/quote/AAPL?p=AAPL' # 添加请求头模拟Chrome浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } r = requests.get(url, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') # 用data-testid定位股价元素 price = soup.find('span', {'data-testid': 'qsp-price'}) if price: # 提取股价文本 print(price.text.strip()) else: print("未获取到股价数据,可检查页面结构是否更新")
内容的提问来源于stack exchange,提问作者yvirdi
相关产品推荐
相关产品推荐

