yFinance 的 JSON 解码错误 [JSONDecodeError:预期值:第 1 行第 1 列(字符 0)]

Posted

技术标签:

【中文标题】yFinance 的 JSON 解码错误 [JSONDecodeError:预期值:第 1 行第 1 列(字符 0)]【英文标题】:JSON Decode Error with yFinance [JSONDecodeError: Expecting value: line 1 column 1 (char 0)] 【发布时间】:2021-09-20 15:47:19 【问题描述】:

过去几周我一直在使用 yfinance 来提取一些股票的历史数据。我通常在每周结束时运行该程序来存储该周的数据,但是这个问题错误只是在上周开始随机发生。下面是一个调用 MMM 历史价格数据的简单示例。但是,期权合约方法也会出现同样的错误。

import yfinance as yf
mmm = yf.Ticker('MMM')
mmm.history()

错误堆栈:

JSONDecodeError                           Traceback (most recent call last)
<ipython-input-6-68e978705cca> in <module>
      1 mmm = yf.Ticker('MMM')
----> 2 mmm.history()

~/opt/anaconda3/lib/python3.8/site-packages/yfinance/base.py in history(self, period, interval, start, end, prepost, actions, auto_adjust, back_adjust, proxy, rounding, tz, **kwargs)
    155                                "Our engineers are working quickly to resolve "
    156                                "the issue. Thank you for your patience.")
--> 157         data = data.json()
    158 
    159         # Work with errors

~/opt/anaconda3/lib/python3.8/site-packages/requests/models.py in json(self, **kwargs)
    896                     # used.
    897                     pass
--> 898         return complexjson.loads(self.text, **kwargs)
    899 
    900     @property

~/opt/anaconda3/lib/python3.8/json/__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    355             parse_int is None and parse_float is None and
    356             parse_constant is None and object_pairs_hook is None and not kw):
--> 357         return _default_decoder.decode(s)
    358     if cls is None:
    359         cls = JSONDecoder

~/opt/anaconda3/lib/python3.8/json/decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~/opt/anaconda3/lib/python3.8/json/decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

【问题讨论】:

您阅读了邮件吗?雅虎财经服务似乎出现了中断。 过早地假设 http 响应包含 JSON 可能会导致失望,正如您所发现的那样 - 您应该在尝试解码之前对响应是 JSON 进行基本检查,例如首先检查字符是 [ 或 ,或者用 try/except 保护解码。 我想我今天在第三个问题中看到了这个问题。而且总是同样的问题 - 它使用来自 Yahoo 的数据,它改变了它的页面,你必须将模块更新到更新的版本。 【参考方案1】:

我是 Stack Overflow 的新手,所以我无法投票,但我遇到了类似的问题。在看到@Barmar 离开的答案后,我去了 yfinance github,作者建议使用pip install yfinance --upgrade --no-cache-dir 来解决当前的任何问题。为我工作,我希望它对你有用,因为我们似乎有类似的问题:]

【讨论】:

也为我工作。 我发现即使你什么都不做,但只要尝试足够的时间,它仍然有一定的可能工作,如果我按照你的建议做了'upgrade --no-cache-dir',我仍然有问题。我正在使用 python3.9 和 pandas 1.3.4、matplotlib 3.4.3、yfinance 0.1.64【参考方案2】:

试试这个:

pip uninstall yfinance
pip uninstall pandas-datareader
pip install yfinance --upgrade --no-cache-dir
pip install pandas-datareader

【讨论】:

成功了,结果卸载了yfinance并重新安装了新版本,谢谢Gabriele Nicodemi【参考方案3】:

tl;dr 2021 年 7 月的某个时候,Yahoo Finance 对其代码进行了一些更改,现在必须更新与之“对话”的 Python 库,因此您可能需要更新您的模块。

这是我的故事:

我使用了一个稍微不同的包,名为yahoo_fin。我也遇到了这个错误,这一切都始于 2021 年 7 月 9 日。巧合的是,我在 yahoo_fin 的文档网站here 上看到雅虎财经最近发生了一些变化,这可能是影响所有这些库的原因这似乎从雅虎财经中提取了他们的股票数据。

更新:2021 年 7 月 9 日 yahoo_fin 0.8.9.1 是 yahoo_fin 的最新版本。这包括由于雅虎财经网站最近的变化而产生的第二批补丁,这些变化影响了 get_data、get_live_price 和其他几种方法。如果您使用的是旧版本,请更新到 0.8.9.1。此外,还有两个新函数 get_company_info 和 get_company_officers,用于抓取公司相关数据。

更新:2021 年 7 月 yahoo_fin 0.8.9 于 2021 年 7 月发布。此版本包括修复因雅虎财经最近更改而导致的获取请求问题的补丁。这些更新会影响几个函数,包括抓取选项数据、get_quote_table,

最后,我不得不运行pip install yahoo_fin --update,这解决了它。

【讨论】:

【参考方案4】:

如果有人仍然面临 jsonDecoder 错误的问题。尝试从 pycharm 文件夹的 venv 中删除 yfin。不知何故,我的系统没有在 pycharm 的 venv 中升级 yfin。我不得不手动删除 yfin 文件夹并升级 yfin。它现在为我工作。谢谢

【讨论】:

【参考方案5】:

我已经放弃了 yfinance 并开始使用yahoo_fin。它使用起来很简单,但由于它的维护而更好。

from yahoo_fin.stock_info import *
df = get_data('BYND', start_date='2020-08-14')

【讨论】:

【参考方案6】:

我在使用“from yahoo_fin import stock_info as si”时遇到了同样的情况。

解决的问题:

pip install yahoo_fin --upgrade

【讨论】:

【参考方案7】:

解决方法是用股票名称(ticker_list)替换List中的字符串''、'^'、'/':

ticker_list = [i.strip(' ') for i in ticker_list]
ticker_list = [i.replace('^', '-P') for i in ticker_list]
ticker_list = [i.replace('/', '-') for i in ticker_list]

干杯。

【讨论】:

【参考方案8】:

我正在尝试 yfinance,但 yahoo_fin 更好。它不会在您的提示中打印出许多无用的消息。正如凯南所说,我也放弃了 yfinance。 yahoo_fin 在返回错误时也不会停止我的线程,所以这里我们有另一个积极的观点。

在你的 CMD 中执行:

pip install yahoo-fin

在你的代码中做:

from yahoo_fin.stock_info import *
df = get_data("TSLA")

【讨论】:

以上是关于yFinance 的 JSON 解码错误 [JSONDecodeError:预期值:第 1 行第 1 列(字符 0)]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 解码简单的根级 json 值

yfinance json.decoder.JSONDecodeError

如何使用 yfinance 下载数据修复此错误

yfinance 中的错误

快速解码 JSON 数组或字典错误

弹出JSON解码错误,不知道还有啥可以尝试的