雅虎金融网络服务消失了吗? API 变了吗?暂时下线?

Posted

技术标签:

【中文标题】雅虎金融网络服务消失了吗? API 变了吗?暂时下线?【英文标题】:Has Yahoo finance web service disappeared? API changed? Down temporarily? 【发布时间】:2016-07-13 14:51:37 【问题描述】:

很长一段时间以来,我一直在使用以下 REST API 来查询雅虎财经的当前价格。它记录在几个 Stack Overflow 帖子中,例如Yahoo finance webservice 和 yahoo-finance 的其他地方。

http://finance.yahoo.com/webservice/v1/symbols/$SYMBOLS/quote?format=json

其中 $SYMBOLS 是以逗号分隔的股票或指数符号列表。

昨天查询停止工作,只返回“临时移动。重定向到...”消息。

这个网络服务现在关闭了吗?是否已被 YQL 或其他 API 取代?查询“ichart”的历史价格表仍然有效。例如,

http://ichart.finance.yahoo.com/table.csv?d=2&e=3&f=2016&g=d&a=0&b=1&c=2011&ignore=.csv&s=$SYMBOL

谢谢。

【问题讨论】:

Robyn Tippins(YDN 社区经理):“似乎有些人已经对用于提取财务数据的 API 进行了逆向工程,但他们违反了我们的服务条款(不重新分发财务数据)这样做是为了鼓励您避免使用这些网络服务。”官方 API 是:developer.yahoo.com/finance“您下载数据没有问题,假设您保持在速率限制以下,您就无法重新分发它”。 查看其他API source data 我推荐在后雅虎时代使用 Alpha Vantage。他们有一个免费的股票数据 API,而且效果很好。我在上面写了一篇博文:the-data-wrangler.com/… 请注意,Alpha Vantage 似乎缺少纳斯达克指数数据。 ***.com/questions/28822780/… 【参考方案1】:

过去 2-3 天我遇到了类似的问题。该网址适用于智能手机,在桌面上它会给出“不是有效参数”错误和 HTTP 代码 406。

这可以通过将用户代理添加为“Mozilla/5.0 (Linux; android 6.0.1; MotoG3 Build/MPI24.107-55) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/51.0.2704.81 Mobile Safari/ 537.36" 同时调用获取请求。

例如,如果您在 php 中从 curl 下载,请按以下方式使用:

curl_setopt($session,CURLOPT_USERAGENT,"Mozilla/5.0 (Linux; Android 6.0.1; MotoG3 Build/MPI24.107-55) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36");

我希望这能解决问题。

【讨论】:

请帮我更多地理解这个问题,我正在从一个应用程序(使用改造)发出网络请求,它给了我 406 NOT ACCEPTABLE 答案。但是,当我通过手机中的 Chrome 发出相同的网络请求时,会返回正确的结果(如您所说)。为什么应用程序失败(它在手机内!) 您好 Carlos,Web 服务器正在通过请求有效负载中的 USERAGENT 标头信息识别出来自手机或桌面的请求。因此,按照上面的建议将 USERAGENT 标头信息更改为 phone 不会在发送请求时从 APP 失败。 感谢 Hemant 的澄清,它确实有效,我没有在网络请求中正确包含我的标头。您的解决方案 100% 有效。你用一行代码为我节省了几个月的工作量,一点也不夸张。 这很好,但雅虎摆脱这个漏洞可能只是时间问题:( 看来雅虎终于解决了这个问题。该黑客最近不再有效【参考方案2】:

是的,它看起来确实像 Yahoo!已经停止了(私有的,大部分未记录的)Yahoo Finance API,许多人多年来一直依赖该 API 来获取货币数据。我们在过去 24 小时内收到了一些关于它的通知。 (编辑:所有响应似乎都返回了"Not a valid parameter"。我想他们可能会重新打开它,但据我所知,他们在任何地方都没有正式支持该 API。)

我大约在五年前创建了Open Exchange Rates,我们的汇率 API 现在支持由数以万计的开发者及其数以千万计的用户组成的社区,提供准确的最新信息。

欢迎您通过https://openexchangerates.org查看我们的永久免费服务。

我们的 API 采用简单的原始 JSON 格式,它实际上已成为显示费率的标准方法,因为它使用起来非常简单(不像 Yahoo API,它需要您解析晦涩的嵌套对象才能提取出你需要的基本信息...)

如果您在从已弃用的 Yahoo! 移植时需要帮助API,我们很乐意通过电子邮件提供帮助。

(我是 Open Exchange Rates 的创始人。)

【讨论】:

感谢您确认我的观察。不幸的是,我(目前)不需要汇率,但是当我需要时,我会检查您的服务。谢谢。 “开放汇率”似乎不是免费的。或者请给我们示例以替换finance.yahoo.com/webservice/v1/symbols/$SYMBOLS/… 不是“永远免费” Please feel welcome to check out our Forever Free service at https://openexchangerates.org.您的服务不是免费的... 我们的免费服务列在我们支持的计划之上,目前有超过 60,000 人使用。在这里注册:openexchangerates.org/signup/free【参考方案3】:

我遇到了同样的问题。这是从 YAHOO 中提取库存的 API URL。希望这会有所帮助。

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

【讨论】:

@james.garriss 您可以在浏览器中复制并粘贴上面的链接,它仍然会返回数据。你可能做错了什么。 确实如此。也许服务在我尝试的那天就停止了。 我在结果中得到 NULL【参考方案4】:

由于服务关闭,我使用以下 URL 来查询 Yahoo 数据(针对 ACA.PA):

Link

JSON 结果不同,但我找到了我感兴趣的信息。

欲了解更多信息,请访问页面https://developer.yahoo.com/yql/

【讨论】:

【参考方案5】:

查看这个出色的 API 包装器,可在 NuGet 上获得:https://github.com/salmonthinlion/YahooFinanceApi

获取股票报价

var quotes = await Yahoo.Symbol("AAPL", "GOOG").Tag(Tag.LastTradePriceOnly, Tag,ChangeAndPercentChange, Tag.DaysLow, Tag.DaysHigh).GetAsync();
var aapl = quotes["AAPL"];
var price = aapl[Tag.LastTradePriceOnly];

获取股票的历史数据

// You should be able to query data from various markets including US, HK, TW
var history = await Yahoo.GetHistoricalAsync("AAPL", new DateTime(2016, 1, 1), new DateTime(2016, 7, 1), Period.Daily);
foreach (var candle in history)

    Console.WriteLine($"DateTime: candle.DateTime, Open: candle.Open, High: candle.High, Low: candle.Low, Close: candle.Close, Volume: candle.Volume, AdjustedClose: candle.AdjustedClose");

获取股票的股息历史记录

// You should be able to query data from various markets including US, HK, TW
var dividendHistory = await Yahoo.GetHistoricalDividendsAsync("AAPL", new DateTime(2016, 1, 1), new DateTime(2016, 7, 1));
foreach (var candle in dividendHistory)

    Console.WriteLine($"DateTime: candle.DateTime, Dividend: candle.Dividend");

【讨论】:

【参考方案6】:

我是github上 ValueViz 的作者。

每日价格

您需要熟悉 RESTFUL 服务。

https://quantprice.herokuapp.com/api/v1.1/scoop/day?tickers=MSFT&date=2017-06-09

历史价格

您必须提供日期范围:

https://quantprice.herokuapp.com/api/v1.1/scoop/period?tickers=MSFT&begin=2012-02-19&end=2012-02-20

如果您不提供开始或结束,它将使用最早或当前日期:

https://quantprice.herokuapp.com/api/v1.1/scoop/period?tickers=MSFT&begin=2012-02-19

多个代码

您可以用逗号分隔代码:

https://quantprice.herokuapp.com/api/v1.1/scoop/period?tickers=IBM,MSFT&begin=2012-02-19

速率限制

所有请求的速率限制为每小时 10 个请求。如果您想注册一个完全访问 API,请在 Twitter 上给我发送 DM。您将收到一个 API 密钥以添加到 URL。

我们正在为无费率付费订阅设置一个贝宝帐户。

可用代码列表

https://github.com/robomotic/valueviz/blob/master/scoop_tickers.csv

我还致力于提供来自 EDGAR 的基本数据和公司数据。干杯。

【讨论】:

【参考方案7】:

重定向到同一个页面,但是添加了参数“bypass=true”,会报错。

编辑: https://***.com/users/6593038/hemant-prasad 给出的答案对我有用。 将用户代理更改为移动设备时,API 工作正常,目前没有重定向。

这是我在 Java 中使用的代码(它用于 XML 版本,但它也可以用于 JSON):

URL url = new URL ("https://finance.yahoo.com/webservice/v1/symbols/" + stocks + "/quote");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection ();
urlc.setRequestProperty ("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; MotoE2(4G-LTE) Build/MPI24.65-39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36");
Document xml = DocumentBuilderFactory.newInstance ().newDocumentBuilder ().parse (urlc.getInputStream ());

【讨论】:

至少来自 OS X 上的 Safari,它正在添加绕过并抱怨无效参数。转到另一个(私有的,大部分未记录的)API。 是的,你是对的。我尝试在 Chrome (Linux) 中使用隐身模式,它触发了重定向。我想这之前没有发生过,因为浏览器的缓存。 @JoãoNunes 不,API 已关闭。您应该寻找其他选择。【参考方案8】:

我找到了一种使用 csv API 的方法。

link

您需要在哪里写符号、参数和列。

使用本网站查找所需参数:http://www.jarloo.com/yahoo_finance/

示例:

如果您需要了解交易品种的交易量 用v替换字符串sl1d1t1c1ohgv

并将symbol%2Cprice%2Cdate%2Ctime%2Cchange%2Ccol1%2Chigh%2Clow%2Cvolume 列替换为volume

唯一的问题是数据有点随机,不像 Web 服务 API 那样是实时的

【讨论】:

【参考方案9】:

Python Yahoo Finance API 似乎也有问题。例如,如果您使用它来查找亚马逊股票价格,它只会一遍又一遍地显示相同的两个值。

from yahoo_finance import Share import time f = open('/tmp/amazon/amzn.csv', 'w') while True:
    amzn=Share("AMZN")
    s = amzn.get_price() + "," + amzn.get_trade_datetime() + '\n'
    print (s)
    f.write (s)
    f.flush()
    time.sleep(5)
    del amzn

【讨论】:

以上是关于雅虎金融网络服务消失了吗? API 变了吗?暂时下线?的主要内容,如果未能解决你的问题,请参考以下文章

CAP定理20年回首:时代变了吗?

String s="hello";s+="world";s变化了吗?原始的String对象的内容变了吗?

Github UI 布局设计变了,你发现了吗?

数字货币将要爆发,你准备好了吗?

[转]关闭浏览器session就消失了吗

有效的分发配置文件从 Xcode Organizer 中消失了吗?