[英]Scraping historical data from Yahoo Finance with Python
正如你們中的一些人現在可能知道的那樣,似乎 Yahoo! Finance 已停止使用其用於股票市場數據的 API。 雖然我知道fix-yahoo-finance
解決方案的存在,但我試圖通過直接從 Yahoo 抓取歷史數據來為我的代碼實施更穩定的解決方案。
所以這是我目前所擁有的:
import requests
from bs4 import BeautifulSoup
page = requests.get("https://finance.yahoo.com/quote/AAPL/history?period1=345423600&period2=1495922400&interval=1d&filter=history&frequency=1d")
soup = BeautifulSoup(page.content, 'html.parser')
soup
print(soup.prettify())
要從 Yahoo 表中獲取數據,我可以執行以下操作:
c=soup.find_all('tbody')
print(c)
我的問題是,如何將“c”變成更好的數據框? 謝謝!
我寫這個是為了直接從下載 csv 鏈接從 YF 獲取歷史數據。 它需要發出兩個請求,一個是獲取 cookie 和 crumb,另一個是獲取數據。 它返回一個熊貓數據框
import re
from io import StringIO
from datetime import datetime, timedelta
import requests
import pandas as pd
class YahooFinanceHistory:
timeout = 2
crumb_link = 'https://finance.yahoo.com/quote/{0}/history?p={0}'
crumble_regex = r'CrumbStore":{"crumb":"(.*?)"}'
quote_link = 'https://query1.finance.yahoo.com/v7/finance/download/{quote}?period1={dfrom}&period2={dto}&interval=1d&events=history&crumb={crumb}'
def __init__(self, symbol, days_back=7):
self.symbol = symbol
self.session = requests.Session()
self.dt = timedelta(days=days_back)
def get_crumb(self):
response = self.session.get(self.crumb_link.format(self.symbol), timeout=self.timeout)
response.raise_for_status()
match = re.search(self.crumble_regex, response.text)
if not match:
raise ValueError('Could not get crumb from Yahoo Finance')
else:
self.crumb = match.group(1)
def get_quote(self):
if not hasattr(self, 'crumb') or len(self.session.cookies) == 0:
self.get_crumb()
now = datetime.utcnow()
dateto = int(now.timestamp())
datefrom = int((now - self.dt).timestamp())
url = self.quote_link.format(quote=self.symbol, dfrom=datefrom, dto=dateto, crumb=self.crumb)
response = self.session.get(url)
response.raise_for_status()
return pd.read_csv(StringIO(response.text), parse_dates=['Date'])
你可以這樣使用它:
df = YahooFinanceHistory('AAPL', days_back=30).get_quote()
或者,使用 python 庫yfinance和yahoofinancials 。
import pandas as pd
import yfinance as yf
from yahoofinancials import YahooFinancials
選擇公司股票代碼,例如。 '蘋果'。
df = yf.download('AAPL')
這會將歷史股票數據存儲到數據框 df。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.