使用BeautifulSoup的.find命令爬取Yahoo Finance数据返回None的解决方法
解决Yahoo Finance抓取fin-streamer标签返回None的问题
可能的原因及对应解决方案
1. 请求未模拟浏览器,被网站拦截/返回简化内容
Yahoo Finance会根据请求头判断请求来源,直接用requests.get发送的请求没有浏览器标识,可能返回不包含目标标签的静态内容。
解决办法:添加User-Agent请求头模拟浏览器:
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' } r = requests.get(url, headers=headers)
2. 目标内容是JavaScript动态渲染的
requests只能获取初始HTML,而Yahoo Finance的实时股价等数据是通过JavaScript动态加载到fin-streamer标签中的,初始静态HTML里可能没有该标签的内容,甚至标签本身可能是JS生成的。
解决办法:使用Selenium模拟浏览器加载页面(需先安装Selenium和对应浏览器驱动,比如ChromeDriver):
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time # 配置Chrome无头模式 chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('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') driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待页面加载完成 time.sleep(2) web_content = BeautifulSoup(driver.page_source, 'lxml') # 定位目标股价的fin-streamer标签 section = web_content.find('fin-streamer', {'data-test': 'qsp-price'}) print(section.text if section else '未找到目标标签') driver.quit()
3. 标签定位不够精确
直接find('fin-streamer')可能匹配不到目标标签,页面中可能存在多个fin-streamer,需要结合属性筛选。根据你要抓取的股价(对应截图内容),可以通过data-test或class属性精准定位:
# 通过data-test属性定位股价标签 section = web_content.find('fin-streamer', {'data-test': 'qsp-price'}) # 或者通过class属性定位 section = web_content.find('fin-streamer', class_='Fw(b) Fz(36px) Mb(-4px) D(ib)')
额外建议
- 检查返回内容:可以先把
r.text保存到本地文件,查看是否真的包含fin-streamer标签,确认是请求问题还是定位问题。 - 控制请求频率:Yahoo Finance有反爬机制,频繁请求可能被封禁IP,建议添加请求间隔。
内容的提问来源于stack exchange,提问作者The Technomancer
相关产品推荐
相关产品推荐

