Google Apps Script突发报错:无法读取undefined的'streams'属性
雅虎财经新闻抓取脚本失效排查与修复
问题概述
原用于从雅虎财经抓取新闻稿标题的Google Apps Script突然失效,抛出错误:TypeError: Cannot read properties of undefined (reading 'streams')(对应代码第6行)。
原脚本代码:
function pressReleases(code) { var url = 'https://finance.yahoo.com/quote/'+code+'/press-releases' var html = UrlFetchApp.fetch(url).getContentText().match(/root.App.main = ([\s\S\w]+?);\n/); if (!html || html.length == 1) return; var obj = JSON.parse(html[1].trim()); var res = obj.context.dispatcher.stores.StreamStore.streams["YFINANCE:"+code+".mega"].data.stream_items[0].title; return res || "No value"; }
单元格调用方式:=pressReleases(A6)(A6单元格为目标股票代码)
补充:使用Python可正常获取格式一致的JSON数据,问题锁定在Google Apps Script的请求逻辑上。
失效原因
雅虎财经对请求来源做了限制,UrlFetchApp.fetch默认的请求头未携带浏览器标识(如User-Agent),导致服务器返回的HTML中缺失包含新闻数据的StreamStore节点,后续访问streams属性时因父节点不存在报错。而Python请求通常会模拟浏览器请求头,因此能正常获取完整数据。
修复方案
修改脚本,为请求添加模拟浏览器的请求头,并增加数据节点的存在性校验,提升脚本稳定性。
修复后的代码:
function pressReleases(code) { var url = 'https://finance.yahoo.com/quote/'+code+'/press-releases'; // 添加模拟浏览器的请求头,绕过服务器的来源限制 var options = { 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' } }; var html = UrlFetchApp.fetch(url, options).getContentText().match(/root.App.main = ([\s\S\w]+?);\n/); if (!html || html.length == 1) return "No value"; var obj = JSON.parse(html[1].trim()); // 用try-catch处理可能的节点缺失或结构变动 try { var streamKey = "YFINANCE:"+code+".mega"; var res = obj.context.dispatcher.stores.StreamStore.streams[streamKey].data.stream_items[0].title; return res || "No value"; } catch(e) { return "No value or data structure changed"; } }
关键修改点
- 新增
options配置,携带User-Agent请求头,模拟浏览器访问,确保服务器返回完整的内嵌JSON数据 - 增加
try-catch块,避免因雅虎数据结构变动直接抛出错误,保证脚本不会崩溃 - 优化空值返回逻辑,确保函数始终有明确返回值
内容的提问来源于stack exchange,提问作者DarkWingDuck
相关产品推荐
相关产品推荐

