【问题标题】:HTTP Error 404 from googlefinance in python 2.7python 2.7中来自googlefinance的HTTP错误404
【发布时间】:2017-10-25 14:15:20
【问题描述】:

在 python 2.7 shell 中,我运行了以下代码:

$from googlefinance import getQuotes
$import json
$from urllib2 import urlopen
$print json.dumps(getQuotes('AAPL'), indent=2)

第 4 条命令错误信息如下:

Traceback (most recent call last):
  Python Shell, prompt 3, line 1
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\site-packages\googlefinance\__init__.py", line 70, in getQuotes
    content = json.loads(request(symbols))
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\site-packages\googlefinance\__init__.py", line 33, in request
    resp = urlopen(req)
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\urllib2.py", line 435, in open
    response = meth(req, response)
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\urllib2.py", line 548, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\urllib2.py", line 473, in error
    return self._call_chain(*args)
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\urllib2.py", line 407, in _call_chain
    result = func(*args)
  File "C:\Users\mlashkar\_development\python\v2.7\Lib\urllib2.py", line 556, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found

不知道发生了什么。 这是我的活动图像。

【问题讨论】:

  • 可能与最近发生的 Google 财经网址更改有关:github.com/hongtaocai/googlefinance/issues/39
  • 是的@birryree,这似乎是新报告的问题......
  • 我已经发布了一个示例,说明如何直接获取数据而不是使用模块,如果对您有帮助的话。

标签: python json google-finance


【解决方案1】:

Google Finance 似乎修改了他们的网址/端点,而 googlefinance 包尚未更新以反映更改。

由于这些更改中的大多数对最终用户来说相当不透明(而且您使用的库在 2 年内没有更新),因此您自己处理原始的 Google 财经响应可能会更好。

Google 金融端点

您可以通过以下 URL 检索有关特定股票代码的信息:

https://finance.google.com/finance?output=json&q=TICKER_SYMBOL

回应

Google 财经以这种格式返回 JSON 结果

\n// [\n{\n"symbol" : "AAPL",\n"exchange" : "NASDAQ",\n"id": "22144",\n"t" 
: "AAPL",\n"e" : "NASDAQ",\n"name" : "Apple Inc."\n, "f_reuters_url" : 
"http:\\x2F\\x2Fstocks.us.reuters.com\\x2Fstocks\\x2Fratios.asp?rpc=66\\x26symbol=AAPL.O",\n"f_recent_quarter_date" : "Q3 (Jul \\x2717)",\n"f_annual_date" : "2016",\n"f_ttm_date" : "2015",\n"financials" :

    ... a lot more stuff ...
[\n]\n}]\n'

Python 的 JSON 解析器无法按原样加载它,因为它具有前导 //,并将所有内容包装在 [] 中。它还在需要解码的各种字符串中包含 Unicode 转义字符。

完整代码及解析

我将为此使用requests 模块,但如果您想要一个带有内置urllib 模块的示例,我也可以展示它。

import json

import requests

rsp = requests.get('https://finance.google.com/finance?q=AAPL&output=json')

if rsp.status_code in (200,):

    # This magic here is to cut out various leading characters from the JSON 
    # response, as well as trailing stuff (a terminating ']\n' sequence), and then
    # we decode the escape sequences in the response
    # This then allows you to load the resulting string
    # with the JSON module.
    fin_data = json.loads(rsp.content[6:-2].decode('unicode_escape'))

    # print out some quote data
    print('Opening Price: {}'.format(fin_data['op']))
    print('Price/Earnings Ratio: {}'.format(fin_data['pe']))
    print('52-week high: {}'.format(fin_data['hi52']))
    print('52-week low: {}'.format(fin_data['lo52']))

这将输出:

Opening Price: 162.71
Price/Earnings Ratio: 18.43
52-week high: 164.94
52-week low: 102.53

完整代码 JSON 中包含的数据比我输出的要多得多,因此您可以决定如何使用其中的任何一个。

替代品

或者,您可以使用 yahoo-finance 模块,因为雅虎仍然提供真正的金融 API,所以它可能不太可能出现此类问题。

【讨论】:

  • 简直太棒了@birryree!感谢您提供详细信息!
  • @birryree 这个端点不支持一次多查询?
  • @bkcollection 不幸的是,没有。不知道模块过去使用的端点是否有替代品。
  • @birryree 谢谢。我们现在可以通过谷歌在一次查询中获得报价列表的任何其他方式吗?
  • http://finance.yahoo.com/d/quotes.csv?s=AAPL+GOOG+MSFT&f=snbaopl1 的一个问题是股票报价的时间,刷新后有时会回到上一个,这意味着我在上午 11 点收到报价,然后在上午 11.05 再次刷新,但有时股票报价获取上午 10.50 的数据,甚至返回昨天的报价。不确定是否有人有其他解决方法。
【解决方案2】:

如果您使用的是 Python 3.6 或 2.7,请尝试使用: 匡德尔https://www.quandl.com/ 用WIKI好像很稳定 例子: 苹果 = quandl.get('WIKI/AAPL', start_date="2016-12-31", end_date="") 时间序列文档: https://docs.quandl.com/docs/time-series-2 如果您提出超过 50 个请求,Quandl 需要一个密钥(免费使用)

【讨论】:

    【解决方案3】:

    使用谷歌股票 ID 在此端点上工作的多个股票详细信息

    https://finance.google.com/finance/data?dp=mra&output=json&catid=all&cid=13564339,5904015
    

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2016-06-20
      • 2015-12-12
      • 2018-08-08
      • 2015-01-05
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多