You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用requests.get()连接Yahoo Finance失效,求可行解决方案

错误根因

你遇到的NameError: name 'data' is not defined只是表层问题:第一个try块中,正则匹配root.App.main字段失败触发异常时,data变量没有被初始化,后续直接访问就会抛出未定义错误。
核心原因是雅虎财经近期升级了反爬策略,未携带合法请求头的爬虫请求会被直接拦截,返回的页面中已经没有你需要的内嵌JS数据字段,导致正则匹配结果为空。

可行解决方案

方案1:适配反爬策略,复用原有解析逻辑

  • 给requests请求补充完整的浏览器请求头,优先补充User-Agent字段模拟正常用户访问,大多数基础反爬校验仅需要该字段即可通过
    示例请求写法:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    r = requests.get(url_root_yahoo + ticker + key_stats_yahoo + ticker, headers=headers)
    
  • 如果添加User-Agent后仍然匹配不到数据,可以打开浏览器访问雅虎财经对应页面,从开发者工具的网络面板中复制该请求的完整header(包含cookie、referer等字段)替换到代码中即可。

方案2:更换数据获取方式

  • 可以使用Python生态中已经适配雅虎财经最新反爬规则的第三方库,直接调用接口获取结构化的财务数据,无需自行处理页面解析和反爬逻辑
  • 也可以对接雅虎公开的API接口,直接请求结构化JSON数据,稳定性远高于解析前端页面内嵌变量

现有代码临时修复

首先在代码开头初始化data变量,避免未定义错误,示例修改如下:

import os
import urllib.request
import requests, re, json

p = re.compile(r'root\.App\.main = (.*);')

url_root_yahoo = 'https://finance.yahoo.com/quote/'
key_stats_yahoo = '/key-statistics?p='
ticker = 'AAPL'
execute_next_block = 1
# 初始化data变量避免未定义错误
data = None
# 补充请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}

r = requests.get(url_root_yahoo + ticker + key_stats_yahoo + ticker, headers=headers)

try:
    data = json.loads(p.findall(r.text)[0])
except (KeyError, IndexError, TypeError):
    execute_next_block = 0

try:
    # 先判断data是否存在
    if not data:
        execute_next_block = 0
    else:
        quote_store = data['context']['dispatcher']['stores']['QuoteSummaryStore']
        statistics = quote_store['defaultKeyStatistics']
except (KeyError, IndexError, TypeError):
     execute_next_block = 0

内容的提问来源于stack exchange,提问作者Tobson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:57:03