我正在尝试从损益表、资产负债表和现金流量报告中收集数据框中给定股票代码的雅虎财务数据。(下面提供了 URL)
我从使用 yfinance 的资产负债表中使用了此函数没有像雅虎财经那样的“总债务” 但它只适用于股票代码“AAPL”而没有其他内容。 我想要一个更强大的网络抓取工具,它适用于任何股票代码并能够获取所有内容其中 3 个报告无需太多修改。
2022-09-30 2021-09-30 2020-09-30 2019-09-30
Total Assets 352755000000 351002000000 323888000000 338516000000
Total Liabilities Net Minority Interest 302083000000 287912000000 258549000000 248028000000
Total Equity Gross Minority Interest 50672000000 63090000000 65339000000 90488000000
Total Capitalization 149631000000 172196000000 164006000000 182295000000
Common Stock Equity 50672000000 63090000000 65339000000 90488000000
Net Tangible Assets 50672000000 63090000000 65339000000 90488000000
Working Capital -18577000000 9355000000 38321000000 57101000000
Invested Capital 170741000000 187809000000 177775000000 198535000000
Tangible Book Value 50672000000 63090000000 65339000000 90488000000
Total Debt 120069000000 124719000000 112436000000 108047000000
Net Debt 96423000000 89779000000 74420000000 59203000000
Share Issued 15943425000 16426786000 16976763000 17772944000
Ordinary Shares Number 15943425000 16426786000 16976763000 17772944000
我计划为每个报告提供单独的功能
https://finance.yahoo.com/quote/{ticker}/financials?p={ticker}
import pandas as pd
import requests
from datetime import datetime
from bs4 import BeautifulSoup
def retrieve_balance_sheet(ticker):
ticker = ticker.upper()
url = f"https://finance.yahoo.com/quote/{ticker}/balance-sheet?p={ticker}"
header = {'Connection': 'keep-alive',
'Expires': '-1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
}
r = requests.get(url, headers=header)
html = r.text
soup = BeautifulSoup(html, "html.parser")
div = soup.find_all('div', attrs={'class': 'D(tbhg)'})
if len(div) < 1:
print("Fail to retrieve table column header")
exit(0)
col = []
for h in div[0].find_all('span'):
text = h.get_text()
if text != "Breakdown":
col.append( datetime.strptime(text, "%m/%d/%Y") )
df = pd.DataFrame(columns=col)
for div in soup.find_all('div', attrs={'data-test': 'fin-row'}):
i = 0
idx = ""
val = []
for h in div.find_all('span') :
if i == 0:
idx = h.get_text()
else:
num = int(h.get_text().replace(",", "")) * 1000
val.append( num )
i += 1
row = pd.DataFrame([val], columns=col, index=[idx] )
df = pd.concat([df, row])
return df
- https://finance.yahoo.com/quote/{ticker}/balance-sheet?p={ticker}
- https://finance.yahoo.com/quote/{ticker}/cash-flow?p= {股票代码}
- https://finance.yahoo.com/quote/{ticker}/cash-flow?p={ticker}
当然,以下是如何使用 Python 从雅虎财经获取任何股票代码的损益表、资产负债表和现金流量表的财务数据的方法。
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_financial_data(ticker):
"""
从雅虎财经获取给定股票代码的财务数据。
Args:
ticker: 股票代码(例如,AAPL)。
Returns:
一个包含损益表、资产负债表和现金流量表的字典。
"""
# 创建要存储数据的字典
financial_data = {}
# 循环遍历报表类型列表
for statement_type in ['financials', 'balance-sheet', 'cash-flow']:
# 构造 URL
url = f"https://finance.yahoo.com/quote/{ticker}/{statement_type}?p={ticker}"
# 使用 requests 库获取网页内容
response = requests.get(url)
# 使用 BeautifulSoup 解析 HTML 内容
soup = BeautifulSoup(response.content, 'html.parser')
# 查找包含数据的表头
headers = [header.text for header in soup.find_all('div', {'class': 'D(ib) Fz(18px) Ta(start)'})]
# 查找包含数据行的所有行
rows = soup.find_all('div', {'data-test': 'fin-row'})
# 创建一个空列表来存储数据
data = []
# 循环遍历所有行
for row in rows:
# 获取每一列的数据并将其附加到数据列表中
data.append([value.text for value in row.find_all('div', {'class': 'Ta(c)'})])
# 将数据转换为 pandas DataFrame
df = pd.DataFrame(data, columns=headers)
# 将日期列转换为日期时间对象
df[headers[0]] = pd.to_datetime(df[headers[0]])
# 将日期列设置为索引
df = df.set_index(headers[0])
# 将 DataFrame 添加到财务数据字典中
financial_data[statement_type] = df
# 返回财务数据字典
return financial_data
# 测试函数
ticker = 'AAPL'
financial_data = get_financial_data(ticker)
# 打印损益表
print(financial_data['financials'])
# 打印资产负债表
print(financial_data['balance-sheet'])
# 打印现金流量表
print(financial_data['cash-flow'])
解释:
- 导入必要的库:
-
requests
: 用于向雅虎财经发送 HTTP 请求以获取网页内容。 -
beautifulsoup4
: 用于解析 HTML 内容并提取必要的数据。 -
pandas
: 用于处理和操作数据,特别是创建 DataFrames。 -
定义
get_financial_data
函数: -
该函数接受一个
ticker
参数,该参数表示要从中获取财务数据的股票代码。 -
它使用一个循环来遍历三种不同类型的报表:
-
financials
: 损益表 -
balance-sheet
: 资产负债表 -
cash-flow
: 现金流量表
-
-
对于每种报表类型,它都会构造 URL 并使用
requests
库获取网页内容。 -
然后,它使用
BeautifulSoup
解析 HTML 内容。 -
它使用 BeautifulSoup 的
find_all
方法找到包含列标题和数据行的特定 HTML 元素。 - 它从这些 HTML 元素中提取文本内容并将其存储在列表中。
-
最后,它使用提取的数据创建一个 pandas DataFrame 并将其存储在
financial_data
字典中。 -
调用
get_financial_data
函数: -
代码使用
AAPL
作为股票代码调用get_financial_data
函数。 -
该函数返回一个包含所有三种财务报表的字典。
-
打印财务报表:
-
代码打印存储在
financial_data
字典中的所有三种财务报表。
这段代码演示了如何使用网络抓取从雅虎财经获取财务数据。但是,在抓取网站时,请务必注意网站的使用条款,并且不要过度请求网站以避免被屏蔽。
标签:python,pandas,beautifulsoup,yahoo-finance From: 76459687