使用BeautifulSoup爬取Yahoo Finance股票数据,唯RR.L无法获取
解决Yahoo Finance爬取RR.L股票价格失败的问题
你遇到的问题大概率不是股票代码里的"."导致的,而是Yahoo Finance针对不同市场的股票页面,数据渲染或加载逻辑存在细微差异,或者你的请求头仍不足以完全模拟真实浏览器请求。
排查步骤与解决方案
1. 先确认请求是否返回正确页面
先打印response.status_code和response.text[:500],检查是否拿到了200状态码,以及页面内容是否为目标股票的正常页面。有时候即使UA正确,也可能因为地区、Cookie等因素返回非目标内容。
2. 补充完整请求头
除了User-Agent,添加几个关键请求头,模拟更真实的浏览器请求:
import requests from bs4 import BeautifulSoup 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', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://finance.yahoo.com/' } url = 'https://finance.yahoo.com/quote/RR.L' response = requests.get(url, headers=headers) # 先检查请求状态码 print(response.status_code) soup = BeautifulSoup(response.text, 'html.parser') # 尝试用更宽泛的定位方式找价格标签 price_tag = soup.find('fin-streamer', {'class': 'livePrice'}) # 或者先找价格父容器再定位 price_container = soup.find('div', {'data-test': 'qsp-price'}) if price_container: price_tag = price_container.find('fin-streamer') print(price_tag)
3. 从页面脚本提取数据(更可靠的方式)
Yahoo Finance多数核心数据是通过页面内的JSON脚本加载的,直接解析这些脚本比定位HTML标签更稳定,不受页面结构变动影响:
import requests import json 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' } url = 'https://finance.yahoo.com/quote/RR.L' response = requests.get(url, headers=headers) # 定位包含核心数据的脚本块 for script in response.text.split('<script>'): if 'root.App.main' in script: # 提取JSON格式的数据部分 json_str = script.split('root.App.main = ')[1].split(';')[0] data = json.loads(json_str) # 提取常规市场价格 price = data['context']['dispatcher']['stores']['QuoteSummaryStore']['price']['regularMarketPrice']['raw'] print(f"RR.L 当前价格: {price}") break
4. 验证编码问题(低概率)
虽然可能性很小,但可以尝试将URL中的"."编码为%2E,使用https://finance.yahoo.com/quote/RR%2E.L发起请求,看是否有变化。
内容的提问来源于stack exchange,提问作者Alibev
相关产品推荐
相关产品推荐

