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

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

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 似乎缺少纳斯达克指数数据。

标签: yahoo-finance yahoo-api yahoo-finance


【解决方案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://stackoverflow.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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-24
            相关资源
            最近更新 更多