如何从雅虎财经这样的网站获取数据? [关闭]

Posted

技术标签:

【中文标题】如何从雅虎财经这样的网站获取数据? [关闭]【英文标题】:How can I get data from a site like Yahoo Finance? [closed] 【发布时间】:2012-01-11 19:01:16 【问题描述】:

我有一个需要帮助的项目。我希望能够访问我制作的网站,例如abc123.com,并让它显示道琼斯指数。而已。只需在我的 abc123.com 网站上显示一个数字,例如 12050。

显然,我必须从雅虎财经之类的地方获取数据。我不想下载任何 .csv 文件或类似文件。而且它不需要是实时数据,因为我知道雅虎的数据延迟了 15 分钟。只是希望能够访问我自己的网站,看看道琼斯指数是什么。

在问这个问题之前,我确实研究了一些关于 SO 的类似问题,但其中很多都没有得到解答或引用了 YQL(我目前正在研究并试图理解的东西)。

任何关于最简单方法的指导将不胜感激!我是 html 的初级程序员,正在寻找最容易理解和实施的路线。

【问题讨论】:

我刚刚在这个链接中发现了一些有用的东西,可以帮助任何可能面临与我相同问题的人:seangw.com/wordpress/index.php/2010/01/… 如果这是您采取的路线,我可能会建议您将其发布为您的答案,解释它如何解决您的问题,然后接受您的答案。 :) 感谢这里的每一个人,因为这个线程上的想法帮助我找到了答案并完全按照我的要求去做。特别感谢阿拉斯。这个链接用大约 10 行代码解释了如何做到这一点:seangw.com/wordpress/index.php/2010/01/… 我所做的只是将他的代码粘贴到我网站上的 index.html 中。当访问我的网站时,我得到了我感兴趣的数据。您可以修改 $stocklist 以放入您想要的任何股票,并且您可以使用 $stockFormat 中的标签修改您想要从 Yahoo 获得的数据类型。再次感谢! 我还不能接受我自己的答案,因为 SO 网站说我需要等待六个小时。好的。 一个 PHP 函数返回一个数组,该数组包含多个 Yahoo Finance XML 流中的任何一个可用的节点:philadelphia-reflections.com/blog/2380.htm 对于国债收益率,请尝试philadelphia-reflections.com/blog/2381.htm 【参考方案1】:

你不能。不是以编程方式,而是合法地。

报价延迟,除非另有说明。纳斯达克、纽约证券交易所和美国运通的延迟时间为 15 分钟。另请参阅其他交换的延迟时间。由 Yahoo! 上标识的独立提供商提供的报价和其他信息财务合作伙伴页面。报价会自动更新,但会在 25 分钟不活动后关闭。报价至少延迟 15 分钟。所有“按原样”提供的信息仅供参考,不用于交易目的或建议。雅虎都没有!任何独立供应商均不对任何信息错误、不完整或延迟,或依赖此处包含的信息采取的任何行动负责。 通过访问 Yahoo!网站,您同意不重新分发其中的信息。

所有主要的市场数据提供商都有类似的法律规定。

但如果你还是要这样做,我可能会下载 html 并解析它以找到你正在寻找的报价。

如果您想合法地这样做,您将不得不支付大量资金来从交易所本身或传递信息的第三方实体获取数据。在这种情况下,您将不得不使用他们提供的任何 API。

来源:尝试做你想做的事情:)

(编辑)致那些说使用 YQL 的人:

查看使用条款。

你不能:

出售、出租、共享、转让或再许可 YQL 或通过将 YQL 与 Yahoo! 结合使用获得收入API 或其他网络服务,无论是为了直接的商业或金钱利益还是其他,未经 Yahoo! 事先明确书面许可

在与 Yahoo! 提供的产品或服务竞争的产品或服务中使用 YQL!

任何共享股票报价的网站都将与 Finance.yahoo.com 竞争,因此违反了 YPL 的使用条款。此外,您将无法从您使用这些数据所做的事情中赚钱。祝您获得明确的书面同意。

在 YQL 上的“黑暗面”here 下也可以阅读:“谁拥有我的代码?从技术上讲,他们拥有一切。”

就可扩展性、盈利能力、简单性或合法性而言,YQL 并不是一个好的解决方案。如果您不关心这些事情,并且您的 Web 应用程序不会流行或赚钱,并且您不介意编写一堆代码来与 Yahoo! 很好地配合使用!那么 YQL 就是要走的路。

(编辑 #2)

如果您只是想为自己显示信息(不与他人共享),我发现解析 html 并将其显示在使用 C#/Visual Basic 和 ASP.NET 而不是 php 的网站上非常容易。您可以在 C#/VB 中创建一个 http 请求,该请求将(最终)返回一个 html 文件,您可以解析或搜索您的道琼斯指数报价。在 C#/VB 中作为 ASP Web 应用程序的后端来完成这一切。我相信您可以使用免费的 Visual Studio 2010 Express 创建这些。

【讨论】:

雅虎! Finance 有一个拥有自己许可证的 API,所以这是一个非常具有误导性的答案。 其实可以http://developer.yahoo.com/yql/ 这行可能是真的,但是:“我可能会下载 html 并解析它以找到您正在寻找的报价”这可能比为一个非常有限的个人应用程序学习 YQL,提供 Yahoo! 的 DOM财务页面可靠一致。 大家好。我不打算对我的个人网站做任何商业活动。它只适合我,没有其他人。话虽如此,我想我想遵循 arasmussen 建议的路线...学习解析...有人可以教我如何做到这一点吗?我不再看 YQL,并且已经在谷歌上搜索如何“解析”html。 看看我的第二次编辑。您可能会发现 .net 路由比 php 路由要容易一些。我发现 http 请求更容易,但我也来自 C++ 背景,所以......“解析”只是意味着以编程方式筛选字符串/文件以查找您正在寻找的信息或从中获得意义内容。例如,计算机程序由...解析器解析,这就是它们如何从 C++ 等转换为 CPU 可以理解的东西的方式。例如,如果您使用 C#,您也许可以在 Finance.yahoo.com 上搜索“ 【参考方案2】:

感谢所有做出贡献的人,因为在此线程上产生的想法帮助我找到了答案并完全按照我的要求去做。这个人用大约 10 行代码解释了如何做到这一点:

http://www.seangw.com/wordpress/index.php/2010/01/formatting-stock-data-from-yahoo-finance/

所以基本上我所做的只是剪切并粘贴他的代码并将其放入我网站上的 index.html 中。访问我的网站时,我会得到我感兴趣的股票报价。您可以修改 $stocklist 以放入您想要的任何股票,您可以使用 $stockFormat 中的标签修改来自 Yahoo 的响应。再次感谢!

【讨论】:

【参考方案3】:

我不确定这样做是否有法律限制。有许多商业(付费)应用程序从雅虎财经中提取数据,并且多年来一直运行良好。我想说这里的诀窍是这些应用程序安装到用户的设备(ios/android/Windows 设备)中,因此它们从 Yahoo Finance 中提取数据供用户个人使用。

也许如果您通过 javascript 从 Yahoo Finance 提取数据并且没有将其存储在您的服务器中,同样的情况也适用于您的项目。事实上,我真的会这么认为。在这种情况下,唯一的区别是您的代码不需要安装在用户的设备上,因为它是一个网页。

您是否尝试过联系 YQL 或 Yahoo Finance 的支持来讨论您项目的法律限制?

【讨论】:

【参考方案4】:

我编写了一个从 Yahoo! 获取股票数据的函数金融API;但是,我的代码下载 .csv 文件。我希望它有用。

完整的源代码和示例结果在my blog。

<?php

/*
Description: Getting Stock Data from Yahoo! Finance
Author URI: http://phpvancouver.ca/
*/

/* 
* More about Yahoo! Finance Tag
* http://www.gummy-stuff.org/Yahoo-data.htm
* http://www.canbike.ca/information-technology/2013/08/10/yahoo-finance-url-download-to-a-csv-file.html
*/

$yahoo_finance_tags = array(
"a" => "Ask",       "a2" => "Average Daily Volume",     "a5" => "Ask Size",
"b" => "Bid",       "b2" => "Ask (Real-time)",      "b3" => "Bid (Real-time)",
"b4" => "Book Value",       "b6" => "Bid Size",     "c" => "Change & Percent Change",
"c1" => "Change",       "c3" => "Commission",       "c6" => "Change (Real-time)",
"c8" => "After Hours Change (Real-time)",       "d" => "Dividend/Share",        "d1" => "Last Trade Date",
"d2" => "Trade Date",       "e" => "Earnings/Share",        "e1" => "Error Indication (returned for symbol changed / invalid)",
"e7" => "EPS Estimate Current Year",        "e8" => "EPS Estimate Next Year",       "e9" => "EPS Estimate Next Quarter",
"f6" => "Float Shares",     "g" => "Day's Low",     "h" => "Day's High",
"j" => "52-week Low",       "k" => "52-week High",      "g1" => "Holdings Gain Percent",
"g3" => "Annualized Gain",      "g4" => "Holdings Gain",        "g5" => "Holdings Gain Percent (Real-time)",
"g6" => "Holdings Gain (Real-time)",        "i" => "More Info",     "i5" => "Order Book (Real-time)",
"j1" => "Market Capitalization",        "j3" => "Market Cap (Real-time)",       "j4" => "EBITDA",
"j5" => "Change From 52-week Low",      "j6" => "Percent Change From 52-week Low",      "k1" => "Last Trade (Real-time) With Time",
"k2" => "Change Percent (Real-time)",       "k3" => "Last Trade Size",      "k4" => "Change From 52-week High",
"k5" => "Percebt Change From 52-week High",     "l" => "Last Trade (With Time)",        "l1" => "Last Trade (Price Only)",
"l2" => "High Limit",       "l3" => "Low Limit",        "m" => "Day's Range",
"m2" => "Day's Range (Real-time)",      "m3" => "50-day Moving Average",        "m4" => "200-day Moving Average",
"m5" => "Change From 200-day Moving Average",       "m6" => "Percent Change From 200-day Moving Average",       "m7" => "Change From 50-day Moving Average",
"m8" => "Percent Change From 50-day Moving Average",        "n" => "Name",      "n4" => "Notes",
"o" => "Open",      "p" => "Previous Close",        "p1" => "Price Paid",
"p2" => "Change in Percent",        "p5" => "Price/Sales",      "p6" => "Price/Book",
"q" => "Ex-Dividend Date",      "r" => "P/E Ratio",     "r1" => "Dividend Pay Date",
"r2" => "P/E Ratio (Real-time)",        "r5" => "PEG Ratio",        "r6" => "Price/EPS Estimate Current Year",
"r7" => "Price/EPS Estimate Next Year",     "s" => "Symbol",        "s1" => "Shares Owned",
"s7" => "Short Ratio",      "t1" => "Last Trade Time",      "t6" => "Trade Links",
"t7" => "Ticker Trend",     "t8" => "1 yr Target Price",        "v" => "Volume",
"v1" => "Holdings Value",       "v7" => "Holdings Value (Real-time)",       "w" => "52-week Range",
"w1" => "Day's Value Change",       "w4" => "Day's Value Change (Real-time)",       "x" => "Stock Exchange",
);

/* This function gets a symbol or an array of symbol as a parameter.
* And it returns an array of the corresponding stock data.
* If an error occurs, the detail of the error is saved in $error_message variable
* which is passed by reference from the parent function
*/

function get_stock_data_from_yahoo_finance_pv($symbol, &$error_message) 

global $yahoo_finance_tags;
$error_message = NULL; // Default value 

$f = ""; // The f parameter in Yahoo! Finance URL
foreach($yahoo_finance_tags as $key => $value)
    $f = $f . $key;

if ( is_array($symbol) )  // if the symbol is an array

    if ( $symbol == NULL )  // if the symbol is invalid
        $error_message = "The given symbol is invalid.";
        return -1; // ERROR
    

    $url = "http://finance.yahoo.com/d/quotes.csv?s=" . implode("+", $symbol) . "&f=" . $f;
    $fp = @fopen($url, "r");
    if ( $fp == FALSE )  // If the URL can't be opened
        $error_message = "Cannot get data from Yahoo! Finance. The following URL is not accessible, $url";
        return -1; // ERROR
    

    $arr = array();
    $symbol = explode("+",implode("+", $symbol)); // Eliminate the keys in the symbol array
    $j = 0;
    while ( ($array = @fgetcsv($fp , 4096 , ', ')) !== FALSE ) 
        $i = 0;
        $p = array();
        foreach($yahoo_finance_tags as $key => $value) 
            $p[$key] = $array[$i];
            $i = $i + 1;
        
        $arr[$symbol[$j]]= $p;
        $j = $j + 1;
    
    @fclose($fp);
    return $arr;

 else   // if the symbol is not array 

    if ( strlen($symbol) < 1 || $symbol == NULL )  // if the symbol is invalid
        $error_message = "The given symbol is invalid.";
        return -1; // ERROR
    

    $url = "http://finance.yahoo.com/d/quotes.csv?s=" . $symbol . "&f=" . $f;
    $fp = @fopen($url, "r");
    if ( $fp == FALSE )  // If the URL can't be opened
        $error_message = "Cannot get data from Yahoo! Finance. The following URL is not accessible, $url";
        return -1; // ERROR
    

    $array = @fgetcsv($fp , 4096 , ', '); 
    $arr = array();
    $i = 0;
    foreach($yahoo_finance_tags as $key => $value) 
        $arr[$key] = $array[$i];
        $i = $i + 1;
    
    @fclose($fp);       
    return $arr;

return -1;

【讨论】:

谢谢,您知道收到即将到来的未来股息通知吗?

以上是关于如何从雅虎财经这样的网站获取数据? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

雅虎财经 API 的替代品? [关闭]

雅虎财经 API [关闭]

雅虎财经网址不起作用

用 Python 通过雅虎财经获取股票数据

从谷歌财经/雅虎财经获取报价

定期抓取雅虎财经