使用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
相关产品推荐
相关产品推荐

