【Python爬虫】获取东方财富网A股上市公司财务数据

Python爬虫实战:一键获取东方财富网A股上市公司财务数据

前言

大家好!今天给大家带来一个实用的Python爬虫项目 —— 爬取东方财富网A股上市公司的财务数据。作为投资者或数据分析师,我们经常需要获取和分析上市公司的财务报表。通过这个项目,你可以轻松获取利润表、资产负债表、现金流量表和业绩报表等重要财务数据,让数据获取不再成为瓶颈!

展示

项目概述

本项目主要实现以下功能:

  1. 自动爬取东方财富网的财务数据
  2. 支持多种财务报表的获取(利润表、资产负债表、现金流量表、业绩报表)
  3. 数据自动保存为Excel格式,方便后续分析
  4. 支持按年份、分页获取数据

环境准备

在开始之前,请确保安装以下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(每股收益)
  • 提供公司的关键业绩指标

使用技巧

  1. 数据获取效率

    • 使用分页机制,避免一次性请求过多数据
    • 适当添加请求间隔,避免被反爬
  2. 数据存储优化

    • 使用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

总结

通过这个项目,我们实现了一个实用的财务数据爬虫工具。它不仅能帮助我们快速获取上市公司的财务数据,还为后续的数据分析提供了基础。当然,这个项目还有很多可以改进的地方,欢迎大家在评论区讨论交流!
希望这篇文章对大家有帮助!如果觉得不错,别忘了点赞收藏哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值