Python 爬取财务报表

这篇具有很好参考价值的文章主要介绍了Python 爬取财务报表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在本文中,我们将介绍如何使用Python编写一个简单的数据抓取器,用于爬取东方财富网上的各类财务报表数据。我们将利用requestslxml库进行数据请求和解析,并将抓取到的数据保存到CSV文件中。

1. 准备工作

首先,确保你已经安装了以下Python库:

pip install requests
pip install lxml

2. 创建数据抓取器

我们将创建一个名为DataScraper的类,用于封装所有数据抓取相关的方法。数据抓取器的主要功能包括:

  • 获取报表数据
  • 解析并提取表头信息
  • 将数据写入CSV文件

2.1 初始化

DataScraper类的__init__方法中,我们将初始化一些必要的属性,如报表类型、报表名称等。此外,我们还需要设置请求URL和请求头,以便稍后进行数据请求。

class DataScraper:
    def __init__(self):
        self.pagename_type = {
            # ...
        }

        self.pagename_en = {
            # ...
        }

        self.en_list = []

        self.url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
        self.headers = {
            # ...
        }

2.2 获取报表数据

我们定义一个名为get_table的方法,用于向东方财富网发送请求并获取报表数据。传入页数作为参数,返回当前页的报表数据。

    def get_table(self, page):
        # ...

2.3 解析表头

在抓取数据之前,我们需要解析表头信息。我们创建一个名为get_header的方法,传入一个包含所有英文表头的列表。该方法将请求报表页面,使用lxml库解析HTML,并提取中文表头信息。

    def get_header(self, all_en_list):
        # ...

2.4 写入表头

接下来,我们创建一个名为write_header的方法,用于将解析到的表头信息写入CSV文件。在该方法中,我们首先调用get_header方法获取表头信息,然后使用csv.writer将其写入CSV文件。

    def write_header(self, table_data):
        # ...

2.5 写入报表数据

定义一个名为write_table的方法,用于将抓取到的报表数据逐行写入CSV文件。在该方法中,我们遍历抓取到的数据,并将每一行数据写入CSV文件。

    def write_table(self, table_data):
        # ...

2.6 获取时间列表

为了让用户选择爬取的报表时间,我们定义一个名为get_timeList的方法。该方法将发送请求到东方财富网,解析并提取可选的时间列表。

    def get_timeList(self):
        # ...

3 使用数据抓取器

在创建好DataScraper类之后,我们可以使用以下代码来实例化它并爬取所需的报表数据:

if __name__ == '__main__':
    scraper = DataScraper()

    timeList = scraper.get_timeList()
    for index, value in enumerate(timeList):
        if (index + 1) % 5 == 0:
            print(value)
        else:
            print(value, end=' ; ')
    timePoint = str(input('\n请选择时间(可选项如上):'))
    pagename = str(input('请输入报表类型(业绩报表;业绩快报;业绩预告;预约披露时间;资产负债表;利润表;现金流量表):'))
    # 校验输入
    assert timePoint in timeList, '时间输入错误'
    assert pagename in list(scraper.pagename_type.keys()), '报表类型输入错误'
    table_type = scraper.pagename_type[pagename]
    filename = f'{pagename}_{timePoint}.csv'

    # 写入表头
    scraper.write_header(scraper.get_table(1))

    # 循环遍历所有页数
    page = 1
    while True:
        table = scraper.get_table(page)
        if table:
            scraper.write_table(table)
        else:
            break
        page += 1

4 完整代码及结果截图

import csv
import json
import requests
from lxml import etree


class DataScraper:
    def __init__(self):
        self.pagename_type = {
            "业绩报表": "RPT_LICO_FN_CPD",
            "业绩快报": "RPT_FCI_PERFORMANCEE",
            "业绩预告": "RPT_PUBLIC_OP_NEWPREDICT",
            "预约披露时间": "RPT_PUBLIC_BS_APPOIN",
            "资产负债表": "RPT_DMSK_FN_BALANCE",
            "利润表": "RPT_DMSK_FN_INCOME",
            "现金流量表": "RPT_DMSK_FN_CASHFLOW"
        }

        self.pagename_en = {
            "业绩报表": "yjbb",
            "业绩快报": "yjkb",
            "业绩预告": "yjyg",
            "预约披露时间": "yysj",
            "资产负债表": "zcfz",
            "利润表": "lrb",
            "现金流量表": "xjll"
        }

        self.en_list = []

        self.url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
        self.headers = {
            'Accept': '*/*',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'closed',
            'Referer': 'https://data.eastmoney.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
            'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"'
        }

    def get_table(self, page):
        params = {
            'sortTypes': '-1,-1',
            'reportName': self.table_type,
            'columns': 'ALL',
            'filter': f'(REPORT_DATE=\'{self.timePoint}\')'
        }

        if self.table_type in ['RPT_LICO_FN_CPD']:
            params['filter'] = f'(REPORTDATE=\'{self.timePoint}\')'
        params['pageNumber'] = str(page)
        response = requests.get(url=self.url, params=params, headers=self.headers)
        data = json.loads(response.text)
        if data['result']:
            return data['result']['data']
        else:
            return

    def get_header(self, all_en_list):
        ch_list = []
        url = f'https://data.eastmoney.com/bbsj/{self.pagename_en[self.pagename]}.html'
        response = requests.get(url)
        res = etree.HTML(response.text)
        for en in all_en_list:
            ch = ''.join(
                [i.strip() for i in res.xpath(f'//div[@class="dataview"]//table[1]//th[@data-field="{en}"]//text()')])
            if ch:
                ch_list.append(ch)
                self.en_list.append(en)
        return ch_list

    def write_header(self, table_data):
        with open(self.filename, 'w', encoding='utf-8', newline='') as f:
            writer = csv.writer(f)
            headers = self.get_header(list(table_data[0].keys()))
            writer.writerow(headers)

    def write_table(self, table_data):
        with open(self.filename, 'a', encoding='utf-8', newline='') as csvfile:
            writer = csv.writer(csvfile)
            for item in table_data:
                row = []
                for key in item.keys():
                    if key in self.en_list:
                        row.append(str(item[key]))
                print(row)
                writer.writerow(row)

    def get_timeList(self):
        headers = {
            'Referer': 'https://data.eastmoney.com/bbsj/202206.html',
        }
        response = requests.get('https://data.eastmoney.com/bbsj/202206.html', headers=headers)
        res = etree.HTML(response.text)
        return res.xpath('//*[@id="filter_date"]//option/text()')

    def run(self):
        self.timeList = self.get_timeList()
        for index, value in enumerate(self.timeList):
            if (index + 1) % 5 == 0:
                print(value)
            else:
                print(value, end=' ; ')

        self.timePoint = str(input('\n请选择时间(可选项如上):'))
        self.pagename = str(
            input('请输入报表类型(业绩报表;业绩快报;业绩预告;预约披露时间;资产负债表;利润表;现金流量表):'))
        assert self.timePoint in self.timeList, '时间输入错误'
        assert self.pagename in list(self.pagename_type.keys()), '报表类型输入错误'
        self.table_type = self.pagename_type[self.pagename]
        self.filename = f'{self.pagename}_{self.timePoint}.csv'
        self.write_header(self.get_table(1))
        page = 1
        while True:
            table = self.get_table(page)
            if table:
                self.write_table(table)
            else:
                break
            page += 1


if __name__ == '__main__':
    scraper = DataScraper()
    scraper.run()

Python 爬取财务报表
关于更多东方财富网、巨潮网、中国知网的爬虫,欢迎来参观我的github仓库文章来源地址https://www.toymoban.com/news/detail-481487.html

到了这里,关于Python 爬取财务报表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬取电影信息:Ajax介绍、爬取案例实战 + MongoDB存储

    Ajax(Asynchronous JavaScript and XML)是一种用于在Web应用程序中实现异步通信的技术。它允许在不刷新整个网页的情况下,通过在后台与服务器进行数据交换,实时更新网页的一部分。Ajax的主要特点包括: 异步通信: Ajax是异步的,这意味着它可以在不阻塞用户界面的情况下进行

    2024年02月09日
    浏览(31)
  • 如何利用python爬取网站数据

    Python是一种非常适合用于网络爬虫的编程语言,以下是Python爬取网站数据的步骤: 1. 确定目标网站和所需数据:首先要找到需要爬取数据的网站,确定你需要爬取的数据是哪一部分。 2. 发送请求:使用Python中的requests库向目标网站发送请求,获取网站的HTML源码。 3. 解析HTM

    2024年02月06日
    浏览(31)
  • Python爬虫:如何使用Python爬取网站数据

    更新:2023-08-13 15:30 想要获取网站的数据?使用Python爬虫是一个绝佳的选择。Python爬虫是通过自动化程序来提取互联网上的信息。本文章将会详细介绍Python爬虫的相关技术。 在使用Python爬虫之前,我们需要理解网络协议和请求。HTTP是网络传输的重要协议,它是在Web浏览器和

    2024年02月13日
    浏览(38)
  • Python小姿势 - # 如何使用Python爬取网页数据

    如何使用Python爬取网页数据 今天我们来学习一下如何使用Python来爬取网页数据。 首先,我们需要准备一个空白的文件,在文件中输入以下代码: ``` import requests url = \\\'http://www.baidu.com\\\' r = requests.get(url) print(r.text) ``` 上面的代码中,我们首先导入了 requests 库,然后声明了一个

    2024年02月04日
    浏览(37)
  • 【python】import时,python是如何找到我们需要的包的?

    参考:https://docs.python.org/3/tutorial/modules.html#the-module-search-path 当执行 import spam 时,编译器首先从内嵌模块(buil-in module)中寻找 spam 库,如果内嵌模块不含有 spam ,编译器将依据 sys.path 所给的一系列文件夹路径寻找名为 spam.py 的文件。 其中: sys.path 由以下内容初始化: 输入

    2023年04月08日
    浏览(35)
  • 如何在C++中将int类型的变量转换为string类型呢?今天我们就来介绍两种方法。

    如何在C++中将int类型的变量转换为string类型呢?今天我们就来介绍两种方法。 第一种方法是使用C++11标准引入的std::to_string()函数。这个函数可以将数字类型的变量转换为对应的字符串类型。下面是一个使用示例: 上面的代码将整型变量num转换为字符串类型,并输出到控制台

    2024年02月08日
    浏览(40)
  • Python如何运用爬虫爬取京东商品评论

    打开京东商品网址(添加链接描述) 查看商品评价 。我们点击评论翻页,发现网址未发生变化,说明该网页是动态网页。 我们在 浏览器右键点击“检查” ,,随后 点击“Network” ,刷新一下,在搜索框中 输入”评论“ ,最终找到 网址(url) 。我们点击Preview,发现了我们需要

    2024年02月07日
    浏览(39)
  • 【python】websocket原理详细剖析,如何使用python爬取ws协议数据?

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月24日
    浏览(36)
  • 华纳云:Python中如何使用Selenium爬取网页数据

    这篇文章主要介绍“Python中如何使用Selenium爬取网页数据”,在日常操作中,相信很多人在Python中如何使用Selenium爬取网页数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中如何使用Selenium爬取网页数据”的疑惑有所帮助!接下

    2024年02月07日
    浏览(46)
  • python爬虫如何写,有哪些成功爬取的案例

    编写Python爬虫时,常用的库包括Requests、Beautiful Soup和Scrapy。以下是三个简单的Python爬虫案例,分别使用Requests和Beautiful Soup,以及Scrapy。 1. 使用Requests和Beautiful Soup爬取网页内容: 2. 使用Requests和正则表达式爬取图片: 3. 使用Scrapy爬取网站: 首先,确保已安装Scrapy: 创建一个

    2024年01月19日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包