如何从类似Yahoo Finance的网站获取数据?

5
我有一个项目需要帮助。我想访问我自己制作的网站,例如abc123.com,然后显示道琼斯指数。就像在我的abc123.com网站上只显示一个数字12050。
显然,我需要从某个地方获取数据,如Yahoo Finance。我不想下载任何.csv文件或类似的东西。而且它不需要实时数据,因为我知道Yahoo的数据会延迟15分钟。我只是想访问我自己的网站,并查看道琼斯指数是多少。
在询问这个问题之前,我在SO上研究了一些类似的问题,但很多问题没有得到解答或者引用了YQL(这是我正在研究并试图理解的东西)。
如果您能提供最简单的方法,将不胜感激!我是一个刚入门的HTML程序员,正在寻找最易于理解和实现的路线。

我在这个链接中找到了一些有用的东西,可以帮助可能遇到与我相同问题的任何人:http://www.seangw.com/wordpress/index.php/2010/01/formatting-stock-data-from-yahoo-finance/ - MrPatterns
如果您选择这个方法,我建议您将其作为答案发布,解释它如何解决您的问题,然后接受您的答案。 :) - Andrew Rasmussen
感谢在这里的每个人,因为这个主题上的想法帮助我找到了答案,并且确切地做到了我要寻找的内容。特别感谢aras。该链接解释了如何用大约10行代码来完成: http://www.seangw.com/wordpress/index.php/2010/01/formatting-stock-data-from-yahoo-finance/我所做的就是将他的代码粘贴到我的网站index.html中。当访问我的网站时,我会得到我感兴趣的数据。您可以修改$ stocklist以放入任何股票,并使用$ stockFormat中的标记修改您想从Yahoo获取的数据类型。再次感谢SO! - MrPatterns
我现在还不能接受自己的答案,因为 Stack Overflow 网站说我需要等待六个小时。好吧。 - MrPatterns
这里提供了一个PHP函数,它返回任何多个Yahoo Finance XML流中可用节点的数组:http://www.philadelphia-reflections.com/blog/2380.htm。对于国库收益率,请尝试使用http://www.philadelphia-reflections.com/blog/2381.htm。 - user1888357
4个回答

4
你无法通过编程的方式获取数据,但可以通过合法途径获取。纳斯达克、纽约证券交易所和美国证券交易所的延迟时间为15分钟,除非另有说明。请参阅其他交易所的延迟时间。Yahoo! Finance合作伙伴页面上列出的独立供应商提供报价和其他信息。报价会自动更新,但在25分钟的不活动后将关闭。报价至少延迟15分钟。所有提供的信息“按原样”仅供信息目的,而非交易目的或建议。Yahoo!和任何独立供应商均不对此处包含的信息的任何信息错误、不完整或延迟以及因依赖此处包含的信息而采取的任何行动承担责任。通过访问Yahoo!网站,您同意不重新分发其中找到的信息。

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

但是,如果您仍然打算这样做,我可能会下载HTML并解析它,以查找您要查找的报价。

如果您想合法地执行此操作,则需要支付大量资金,从交易所本身或中继信息的第三方实体获取数据。在这种情况下,您将不得不使用他们提供的任何API。

来源:试图做您正在考虑的事情 :)

(编辑) 对于那些建议使用YQL的人:

看一下使用条款。

你不能:

出售、租赁、共享、转让或再许可YQL或利用YQL与Yahoo! APIs或其他网络服务结合而获得收入,无论是为了直接商业或货币利益还是其他方面,都必须先获得雅虎的事先、明确、书面许可。

或者

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

任何分享股票报价的网站都将与finance.yahoo.com竞争,因此违反了YPL使用条款。此外,你也无法从这些数据中获得任何收益。祝你获得明确的书面同意。

在YQL的"The Dark Side" 这里 中也阅读:"谁拥有我的代码?技术上,他们拥有一切。"

在可扩展性、盈利能力、简单性或合法性方面,YQL都不是一个好的解决方案。如果您不关心这些事情,您的Web应用程序不会受欢迎或赚钱,并且您不介意编写大量代码与Yahoo!协作,那么YQL就是最好的选择。

(编辑#2)

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


雅虎金融有自己的许可证API,因此这是一个非常误导性的答案。 - evan
2
实际上您可以访问http://developer.yahoo.com/yql/。 - Pastor Bones
这一行可能是正确的:"我会下载HTML并解析它以找到你要查找的报价",如果雅虎金融页面的DOM可靠且稳定,那么这可能比学习YQL用于非常有限的个人应用更容易。 - joshuahedlund
大家好。我不打算在我的个人网站上做任何商业活动。这只是为了我自己,没有别人。话虽如此,我认为我想要按照arasmussen建议的路线去学习解析...有人能教我如何做吗?我停止查看YQL并已经开始搜索如何“解析”HTML。 - MrPatterns
请看我的第二次编辑。你可能会发现.net路线比php更容易些。我觉得http请求更容易,但我也是来自C++背景的... "解析"指程序化地筛选字符串/文件以找到所需信息或从内容中提取含义。例如,计算机程序通过解析器进行解析,这就是它们如何从C++等转换为CPU可以理解的东西。如果您使用C#,您可以在finance.yahoo.com上搜索 "<span id="yfs_l10_^dji" class="l10">" ,例如。 - Andrew Rasmussen
显示剩余2条评论

1

我不确定是否有法律限制。有许多商业(付费)应用程序从Yahoo Finance获取数据,已经运行良好多年了。我认为这里的诀窍是这些应用程序安装在用户的设备(iOS/Android/Windows设备)上,因此它们为用户自己的个人使用从Yahoo Finance获取数据。

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

您是否尝试联系YQL或Yahoo Finance的支持团队,以讨论您的项目的法律限制?


1
我已经编写了一个从Yahoo! Finance API获取股票数据的函数;然而,我的代码下载的是.csv文件。希望这对你有用。
完整的源代码和样例结果请查看我的博客
<?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;
}

谢谢,你知道如何获取即将到来的股息通知吗? - disruptive

0
感谢所有为此贡献的人,因为这个帖子上产生的想法帮助我找到了答案,并且做到了我所寻求的。这位大佬用大约10行代码解释了如何实现它:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接