如何修复 python 中新的 unable to read URL error for yahoo finance

问题描述 投票:0回答:6

去年我一直在使用这段代码从 Yahoo Finance 中提取(抓取)股票价格,但现在它产生了一个错误。有谁知道为什么会这样以及如何解决它?


# Importing necessary packages
from pandas_datareader import data as web
import datetime as dt
import matplotlib.pyplot as plt
import pandas as pd
import os
import numpy as np

# Stock selection from Yahoo Finance
stock = input("Enter stock symbol or ticket symbol (Exp. General Electric is 'GE'): ")

# Visualizing the stock over time and setting up the dataframe
start_date = (dt.datetime.now() - dt.timedelta(days=40000)).strftime("%m-%d-%Y")
df = web.DataReader(stock, data_source='yahoo', start=start_date)
#THE ERROR IS ON THIS LINE^

plt.plot(df['Close'])
plt.title('Stock Prices Over Time',fontsize=14)
plt.xlabel('Date',fontsize=14)
plt.ylabel('Mid Price',fontsize=14)
plt.show()

RemoteDataError:无法读取网址:https://finance.yahoo.com/quote/MCD/history?period1=-1830801600&period2=1625284799&interval=1d&frequency=1d&filter=history 响应文本: b' 雅虎 HTML { 高度:100%; } 身体 { 背景:#fafafc url(https://s.yimg.com/nn/img/sad-panda-201402200631.png) 50% 50%; 背景尺寸:封面; 高度:100%; 文本对齐:居中; 字体:300 18px "helvetica neue", helvetica, verdana, tahoma, arial, sans-serif; } 桌子 { 高度:100%; 宽度:100%; 表格布局:固定; 边界崩溃:崩溃; 边界间距:0; 边框:无; } h1 { 字体大小:42px; 字体粗细:400; 颜色:#400090; } p { 颜色:#1A1A1A; } #message-1 { 字体粗细:粗体; 保证金:0; } #message-2 { 显示:内联块; *显示:内联; 缩放:1; 最大宽度:17em; _宽度:17em; } document.write('&test=\'+encodeURIComponent(\'%\')+\'" width="0px" height="0px"/>');var beacon = new Image();beacon.src=" //bcn.fp.yahoo.com/p?s=1197757129&t="+ne...

python pandas yahoo-finance datareader pandas-datareader
6个回答
7
投票

我使用这段代码从雅虎提取数据:

start = pd.to_datetime(['2007-01-01']).astype(int)[0]//10**9 # convert to unix timestamp.
end = pd.to_datetime(['2020-12-31']).astype(int)[0]//10**9 # convert to unix timestamp.
url = 'https://query1.finance.yahoo.com/v7/finance/download/' + stock_ticker + '?period1=' + str(start) + '&period2=' + str(end) + '&interval=1d&events=history'
df = pd.read_csv(url)

4
投票

我有同样的问题。在最近的某个时候,pdr 停止了与雅虎的合作(再次)。 AlphaVantage 并不拥有雅虎拥有的所有股票;据我所知,googlefinance 包只获取当前报价,而不是时间序列; yahoo-finance 软件包不起作用(或者我没能让它起作用); Econdb 发回某种奇怪的数据帧(也许这是可以修复的); Quandl 对非美股设有付费专区。

所以因为我很便宜,所以我研究了 Yahoo CSV 下载功能并想出了这个,它返回一个 df 就像 pdr 一样:

import pandas as pd
from datetime import datetime as dt
import calendar
import io
import requests

# Yahoo history csv base url
yBase = 'https://query1.finance.yahoo.com/v7/finance/download/'
yHeaders = {
    'Accept': 'text/csv;charset=utf-8'
    }

def getYahooDf(ticker, startDate, endDate=None): # dates in ISO format
    start = dt.fromisoformat(startDate) # To datetime.datetime object
    fromDate = calendar.timegm(start.utctimetuple()) # To Unix timestamp format used by Yahoo
    if endDate is None:
        end=dt.now()
    else:
        end = dt.fromisoformat(endDate)
    toDate = calendar.timegm(end.utctimetuple())
    params = { 
        'period1': str(fromDate),
        'period2': str(toDate),
        'interval': '1d',
        'events': 'history',
        'includeAdjustedClose': 'true'
    }
    response = requests.request("GET", yBase + ticker, headers=yHeaders, params=params)
    if response.status_code < 200 or response.status_code > 299:
        return None
    else:
        csv = io.StringIO(response.text)
        df = pd.read_csv(csv, index_col='Date')
        return df

3
投票

如果您向会话数据对象提供标头,然后将其提供给数据读取器(例如,出于缓存目的),也可以使用

import requests_cache

session = requests_cache.CachedSession(cache_name='cache', backend='sqlite', expire_after=expire_after)

# just add headers to your session and provide it to the reader
session.headers = {     'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0',     'Accept': 'application/json;charset=utf-8'     }

data = web.DataReader(stock_names, 'yahoo', start, end, session=session)

0
投票
pip install yfinance
import pandas_datareader as pdr
from datetime import datetime
TWTR = yf.Ticker('TWTR')
ticker =  TWTR.history(period='1y')[['Open', 'High', 'Low', 'Close', 'Volume']]  # return is 

0
投票

如果您使用的是 Google Colab,请先升级库:

!pip install --upgrade pandas-datareader

!pip install --upgrade pandas

希望有用! :)

别忘了重新启动工作区并重新运行


0
投票
!pip install yfinance

import yfinance as yf

start_date = '2010-01-01'
end_date = '2022-03-04'

df = yf.download('AAPL', start=start_date, end=end_date)

print(df)
© www.soinside.com 2019 - 2024. All rights reserved.