如何使用Google Finance API获取股票报价?

130

我希望能够从Google服务中获得金融数据。

我找到了这个URL,可以获取微软公司的股票数据。

Google允许这种HTTP请求的所有可能参数是什么?我想看看我可以得到哪些不同的信息。


39
你是如何找到这个URL的? - timmyc
2
您可以通过基于简单REST的YQL轻松获取Google Finance数据。示例可在此处找到:http://www.jarloo.com/google-finance-and-yql/ - Kelly
1
@Timmyc- client=ig 参数让我觉得这可能是/曾经用于 iGoogle 小部件。只是猜测而已。 - dana
由于保护措施,我无法编辑之前的评论,但是那个API已经失效了。这里是新的API:http://www.jarloo.com/real-time-google-stock-api/。 - Kelly
Java还是JavaScript? - MD XF
显示剩余3条评论
15个回答

77
Google Finance Gadget API自2012年10月已正式弃用但到2014年4月,它仍然处于活跃状态。截至2022年3月,该API已经完全停止使用。

http://www.google.com/finance/info?q=NASDAQ:GOOG http://www.google.com/finance/info?q=CURRENCY:GBPUSD http://finance.google.com/finance/info?client=ig&q=AAPL,YHOO

您还可以获取图表:https://www.google.com/finance/getchart?q=YELP

请注意,如果您的应用程序是公开访问的,则使用Google Finance API违反了Google的服务条款

请查看python中完整的代码


1
这正好带我找到了我想要的!谢谢。 - Grizzly Peak Software
但是我无法通过这个URL获取交易量,你能帮我一下吗?如果我也需要交易量的详细信息。 - Sashi Kant
@DanDascalescu 谢谢 Dan。看起来我检查时它只是掉线了。评论已删除。 - jpgeek
太棒了!感谢Google的存在并将其公开!圣Google! - imbr
2
谢谢,至今仍然具有相关性(2016年9月)。 - CleanBold
8
很遗憾地说,截至2017年9月,那些链接已经失效了(出现了404错误页面)。 - St. John Johnson

41

有一个完整的API来管理投资组合。*链接已删除,Google不再提供此开发者API。

获取股票报价有点困难。我找到了一篇文章,其中有人使用Google电子表格获取股票报价。

您还可以使用小工具,但我想那不是您想要的。

您提到的API很有趣,但似乎没有文档记录(至少就我所能找到的而言)。

以下是一些关于历史价格的信息,仅供参考。


5
谷歌有一个未记录的 API,你可以使用它来更轻松地获取股票信息,因为它是基于 REST 的,不需要身份验证。以下是一个 C# 示例http://www.jarloo.com/google-stock-api/。 - Kelly
26
注意:谷歌财经API已于2011年5月26日正式停用,并将于2012年10月20日关闭。 - shawnwall
这个回答大多数是离题的。下面的回答才是正确的。 - Dan Dascalescu

17

在雅虎上使用curl获取数据,命令为curl -L "http://finance.yahoo.com/d/quotes.csv?s=msft&f=sl1d1t1c1ohgv&e=.csv"。在curl中需要加上-L参数,否则无法正常工作。 - arulraj.net
2
不再被接受或支持。 - Bitfinicon

11

编辑:Google已经移除了API调用,因此它不再起作用。

赞同Pareshkumar的答案。现在有一个Python包装器googlefinance可用于URL调用。

安装googlefinance

$pip install googlefinance

获取当前股票价格很容易:

>>> from googlefinance import getQuotes
>>> import json
>>> print json.dumps(getQuotes('AAPL'), indent=2)
[
  {
    "Index": "NASDAQ", 
    "LastTradeWithCurrency": "129.09", 
    "LastTradeDateTime": "2015-03-02T16:04:29Z", 
    "LastTradePrice": "129.09", 
    "Yield": "1.46", 
    "LastTradeTime": "4:04PM EST", 
    "LastTradeDateTimeLong": "Mar 2, 4:04PM EST", 
    "Dividend": "0.47", 
    "StockSymbol": "AAPL", 
    "ID": "22144"
  }
]

谷歌财经是一个提供实时股票数据的来源。雅虎还有其他API,比如yahoo-finance ,但它们对于纽约证券交易所和纳斯达克股票有15分钟的延迟。


很好的实时性,正是我正在寻找的! - imbr

4
您还可以通过GOOGLEFINANCE()函数直接在Google Sheets中提取来自Google Finance的数据,包括当前和历史数据。
GOOGLEFINANCE("NASDAQ:GOOGL", "price", DATE(2014,1,1), DATE(2014,12,31), "DAILY")

另一种方法是使用Yahoo Finance,可以通过yfinance 来实现。或者使用以下查询,它将返回一个JSON:

https://query1.finance.yahoo.com/v8/finance/chart/MSFT

代码用于解析右侧的价格和面板,在线IDE示例

from bs4 import BeautifulSoup
import requests, lxml, json
from itertools import zip_longest


def scrape_google_finance(ticker: str):
    # https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
    params = {
        "hl": "en"
        }

    # https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
    # https://www.whatismybrowser.com/detect/what-is-my-user-agent
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36",
        }

    html = requests.get(f"https://www.google.com/finance/quote/{ticker}", params=params, headers=headers, timeout=30)
    soup = BeautifulSoup(html.text, "lxml")
    
    # describe empty dict where data will be appended
    ticker_data = {
        "ticker_data": {},
        "about_panel": {}
    }
    
    ticker_data["ticker_data"]["current_price"] = soup.select_one(".AHmHk .fxKbKc").text
    ticker_data["ticker_data"]["quote"] = soup.select_one(".PdOqHc").text.replace(" • ",":")
    ticker_data["ticker_data"]["title"] = soup.select_one(".zzDege").text
    
    right_panel_keys = soup.select(".gyFHrc .mfs7Fc")
    right_panel_values = soup.select(".gyFHrc .P6K39c")
    
    for key, value in zip_longest(right_panel_keys, right_panel_values):
        key_value = key.text.lower().replace(" ", "_")

        ticker_data["about_panel"][key_value] = value.text
    
    return ticker_data
    

data = scrape_google_finance(ticker="GOOGL:NASDAQ")

print(json.dumps(data, indent=2))

JSON输出:

{
  "ticker_data": {
    "current_price": "$2,534.60",
    "quote": "GOOGL:NASDAQ",
    "title": "Alphabet Inc Class A"
  },
  "about_panel": {
    "previous_close": "$2,597.88",
    "day_range": "$2,532.02 - $2,609.59",
    "year_range": "$2,193.62 - $3,030.93",
    "market_cap": "1.68T USD",
    "volume": "1.56M",
    "p/e_ratio": "22.59",
    "dividend_yield": "-",
    "primary_exchange": "NASDAQ",
    "ceo": "Sundar Pichai",
    "founded": "Oct 2, 2015",
    "headquarters": "Mountain View, CaliforniaUnited States",
    "website": "abc.xyz",
    "employees": "156,500"
  }
}

这超出了你的问题范围。如果需要解析整个Google Finance Ticker页面,可以在SerpApi的博客文章“使用Python爬取Google Finance Ticker报价数据”中了解逐行解析的方法。


4
雅虎和谷歌数据的问题在于,如果您将其用于商业用途,则会违反服务条款。 当您的网站/应用程序仍很小时,这不是什么大问题,但一旦您发展壮大,您就会开始收到来自交易所的终止请求。
一个有许可的解决方案示例是 FinancialContent:http://www.financialcontent.com/json.phpXignite

3

3

这个谷歌API已经不再活跃,你可以尝试使用Xignite,但他们会收费:http://www.xignite.com


3
您所解释的最简单的方法是使用此链接,这适用于“道琼斯工业平均指数”。 链接2适用于“纳斯达克100”。
所有与纳斯达克有关的内容,请参考链接3
如果您需要与Microsoft相同的JSON表示法,请参考此旧帖子
更新:
要了解成交量和其他详细信息,我创建了一个vbscript,它使用IE对象从链接中获取详细信息,并警报特定id中的内容(创建.vbs文件并运行它即可)。
Set IE = CreateObject("InternetExplorer.Application")
while IE.readyState = 4: WScript.Sleep 10: wend
IE.Navigate "https://www.google.com/finance?q=INDEXNASDAQ%3ANDX&sq=NASDAQ&sp=2&ei=B3UoUsiIH5DIlgPEsQE"
IE.visible = true
while IE.readyState = 4: WScript.Sleep 10: wend
dim ht
ht= IE.document.getElementById("market-data-div").innerText
msgBox ht
IE.quit

这将弹出页面中的值,就像这样

3,124.54 0.00 (0.00%)
Sep 4 - Close
INDEXNASDAQ real-time data - Disclaimer
Range       -
52 week 2,494.38 - 3,149.24
Open        -
Vol.    0.00

我相信这会有所帮助...


1
请参考此链接以获取有关实时数据的详细信息,通常这些链接提供实时数据,但有些例外。 https://www.google.com/googlefinance/disclaimer/#realtime - MarmiK
再次感谢你,兄弟。这份资料真的很有帮助。不过,我怎样才可以获取音量信息呢? - Sashi Kant
1
如果您了解页面上的VBA或VBS(https://www.google.com/finance?q=INDEXNASDAQ%3ANDX&sq=NASDAQ&sp=2&ei=B3UoUsiIH5DIlgPEsQE),则元素的ID为'market-data-div',该div包含2个以上的div,第二个div具有包含体积`<td class="val">759.30M</td>`的表格。如果需要更多帮助,请发布一些代码或fiddle。 - MarmiK
不好意思,我不了解VBA或VBS,但我一定会去查看的。您能提供一个URL吗?该URL应该能够提供实时股票报价以及成交量信息。 - Sashi Kant
@SashiKant,我已更新我的答案,请查看适用于Windows PC的VBS代码,祝使用愉快 :) - MarmiK
显示剩余4条评论

2
这里有一个可以使用的示例。虽然还没有Google Finance,但这是Yahoo的示例。你需要使用HTMLAgilityPack,它非常棒。祝你寻找到心仪的股票。

使用YahooStockRequest(string Symbols);调用该过程。

其中Symbols = 逗号分隔的符号字符串,或者只是一个符号。

public string YahooStockRequest(string Symbols,bool UseYahoo=true)
        {
            {
                string StockQuoteUrl = string.Empty;

                try
                {
                    // Use Yahoo finance service to download stock data from Yahoo
                    if (UseYahoo)
                    {
                        string YahooSymbolString = Symbols.Replace(",","+");
                        StockQuoteUrl = @"http://finance.yahoo.com/q?s=" + YahooSymbolString + "&ql=1";
                    }
                    else
                    {
                        //Going to Put Google Finance here when I Figure it out.
                    }

                    // Initialize a new WebRequest.
                    HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(StockQuoteUrl);
                    // Get the response from the Internet resource.
                    HttpWebResponse webresp = (HttpWebResponse)webreq.GetResponse();
                    // Read the body of the response from the server.

                    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                    string pageSource;
                    using (StreamReader sr = new StreamReader(webresp.GetResponseStream()))
                    {
                        pageSource = sr.ReadToEnd();
                    }
                    doc.LoadHtml(pageSource.ToString());
                    if (UseYahoo)
                    {
                        string Results=string.Empty;
                        //loop through each Symbol that you provided with a "," delimiter
                        foreach (string SplitSymbol in Symbols.Split(new char[] { ',' }))
                        {
                            Results+=SplitSymbol + " : " + doc.GetElementbyId("yfs_l10_" + SplitSymbol).InnerText + Environment.NewLine;
                        }
                        return (Results);
                    }
                    else
                    {
                        return (doc.GetElementbyId("ref_14135_l").InnerText);
                    }

                }
                catch (WebException Webex)
                {
                    return("SYSTEM ERROR DOWNLOADING SYMBOL: " + Webex.ToString());

                }

            }
        }

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