Python爬虫实战:一键获取东方财富网A股上市公司财务数据
前言
大家好!今天给大家带来一个实用的Python爬虫项目 —— 爬取东方财富网A股上市公司的财务数据。作为投资者或数据分析师,我们经常需要获取和分析上市公司的财务报表。通过这个项目,你可以轻松获取利润表、资产负债表、现金流量表和业绩报表等重要财务数据,让数据获取不再成为瓶颈!
项目概述
本项目主要实现以下功能:
- 自动爬取东方财富网的财务数据
- 支持多种财务报表的获取(利润表、资产负债表、现金流量表、业绩报表)
- 数据自动保存为Excel格式,方便后续分析
- 支持按年份、分页获取数据
环境准备
在开始之前,请确保安装以下Python库:
pip install requests
pip install pandas
pip install openpyxl
代码实现
1. 通用设计思路
我们的代码设计遵循以下思路:
- 使用requests库发送HTTP请求获取数据
- 通过json库解析返回的JSON数据
- 使用pandas处理数据并保存为Excel
- 实现分页获取,确保数据完整性
2. 核心功能实现
2.1 获取最大页数
所有报表都需要先获取数据的最大页数,这里以利润表为例:
def get_max_page(year):
url = f"https://datacenter-web.eastmoney.com/api/data/v1/get?&sortColumns=PARENT_NETPROFIT&sortTypes=-1&pageSize=50&pageNumber=1&reportName=RPT_DMSK_FN_INCOME&columns=ALL&filter=(SECURITY_TYPE_CODE+in+(%22058001001%22%2C%22058001008%22))(TRADE_MARKET_CODE!%3D%22069001017%22)(REPORT_DATE%3D%27{year}-12-31%27)"
response = requests.get(url)
data_text = json.loads(response.text)
max_page = data_text['result']['pages']
return max_page
2.2 数据爬取与保存
以下是爬取数据并保存的核心代码结构:
for year in range(2023, 2024):
for page in range(1, get_max_page(year)+1):
# 1. 构造请求URL
url = "..." # 具体URL根据不同报表类型设置
# 2. 发送请求获取数据
response = requests.get(url)
# 3. 解析JSON数据
data_dict = json.loads(response.text)
data = data_dict.get('result').get('data')
# 4. 转换为DataFrame
df = pd.DataFrame(data)
# 5. 保存到Excel
with pd.ExcelWriter(filepath, engine='openpyxl', mode='a') as writer:
df.to_excel(writer, index=False, sheet_name=f'{year}年—第{page}页')
3. 各报表特点分析
3.1 利润表(Income Statement)
- API端点:RPT_DMSK_FN_INCOME
- 排序字段:PARENT_NETPROFIT(净利润)
- 主要展示公司的收入、成本、费用和利润情况
3.2 资产负债表(Balance Sheet)
- API端点:RPT_DMSK_FN_BALANCE
- 排序字段:MONETARYFUNDS(货币资金)
- 反映公司的资产、负债和所有者权益
3.3 现金流量表(Cash Flow Statement)
- API端点:RPT_DMSK_FN_CASHFLOW
- 排序字段:CCE_ADD(现金及现金等价物增加额)
- 展示公司的现金流入和流出情况
3.4 业绩报表(Performance Report)
- API端点:RPT_LICO_FN_CPD
- 排序字段:BASIC_EPS(每股收益)
- 提供公司的关键业绩指标
使用技巧
-
数据获取效率
- 使用分页机制,避免一次性请求过多数据
- 适当添加请求间隔,避免被反爬
-
数据存储优化
- 使用Excel的追加模式,避免内存占用过大
- 按年份和页码组织数据,便于后续查询
这里以利润表为例,给出完整代码,其他数据获取也都是如法炮制
import requests
import json
import pandas as pd
# 获取某一年数据页数的最大页数
def get_max_page(year):
url = f"https://datacenter-web.eastmoney.com/api/data/v1/get?&sortColumns=PARENT_NETPROFIT&sortTypes=-1&pageSize=50&pageNumber=1&reportName=RPT_DMSK_FN_INCOME&columns=ALL&filter=(SECURITY_TYPE_CODE+in+(%22058001001%22%2C%22058001008%22))(TRADE_MARKET_CODE!%3D%22069001017%22)(REPORT_DATE%3D%27{year}-12-31%27)"
response = requests.get(url)
data_text = json.loads(response.text)
max_page = data_text['result']['pages']
return max_page
# 现金流量表爬取
for year in range(2023, 2024):
for page in range(1, get_max_page(year)+1):
print(f"======================正在爬取{year}第{page}页数据=============================")
url =f"https://datacenter-web.eastmoney.com/api/data/v1/get?&sortColumns=PARENT_NETPROFIT&sortTypes=-1&pageSize=50&pageNumber={page}&reportName=RPT_DMSK_FN_INCOME&columns=ALL&filter=(SECURITY_TYPE_CODE+in+(%22058001001%22%2C%22058001008%22))(TRADE_MARKET_CODE!%3D%22069001017%22)(REPORT_DATE%3D%27{year}-12-31%27)"
Income_Statement_Data = requests.get(url)
# (一)打印利润表数据
# 将String数据转化为Dict数据
isd_dict = json.loads(Income_Statement_Data.text)
# 分层取值
isd_datas = isd_dict.get('result').get('data')
# (二)保存利润表数据到excel文件
# 将数据转化为DataFrame数据
isd_df = pd.DataFrame(isd_datas)
# 使用追加模式——保存到excel文件
filepath = fr'D:\Py\利润表.xlsx'
# 创建Excel写入器(追加模式)
with pd.ExcelWriter(filepath, engine='openpyxl', mode='a') as writer:
isd_df.to_excel(writer, index=False, sheet_name=f'{year}年—第{page}页')
if page == get_max_page(year):
break
总结
通过这个项目,我们实现了一个实用的财务数据爬虫工具。它不仅能帮助我们快速获取上市公司的财务数据,还为后续的数据分析提供了基础。当然,这个项目还有很多可以改进的地方,欢迎大家在评论区讨论交流!
希望这篇文章对大家有帮助!如果觉得不错,别忘了点赞收藏哦!