在本文中,我们将介绍如何使用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 = 1while True:table = scraper.get_table(page)if table:scraper.write_table(table)else:breakpage += 1

4 完整代码及结果截图

import csv
import json
import requests
from lxml import etreeclass 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:returndef 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_listdef 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 = 1while True:table = self.get_table(page)if table:self.write_table(table)else:breakpage += 1if __name__ == '__main__':scraper = DataScraper()scraper.run()


关于更多东方财富网、巨潮网、中国知网的爬虫,欢迎来参观我的github仓库

Python 爬取财务报表相关推荐

  1. python爬取网页表格数据匹配_爬取表格类网站数据并保存为excel文件

    本文转载自以下网站:50 行代码爬取东方财富网上市公司 10 年近百万行财务报表数据 https://www.makcyun.top/web_scraping_withpython6.html 主要学 ...

  2. python爬取表格数据匹配_爬取表格类网站数据并保存为excel文件

    本文转载自以下网站:50 行代码爬取东方财富网上市公司 10 年近百万行财务报表数据 https://www.makcyun.top/web_scraping_withpython6.html 主要学 ...

  3. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  4. 用Python爬取好奇心日报

    用Python爬取好奇心日报 本项目最后更新于2018-7-24,可能会因为没有更新而失效.如已失效或需要修正,请联系我! 本项目已授权微信公众号"菜鸟学Python"发表文章 爬 ...

  5. python爬取新闻并归数据库_Python爬取数据并写入MySQL数据库操作示例

    Python爬取数据并写入MySQL数据库的实例 首先我们来爬取 http://html-color-codes.info/color-names/ 的一些数据. 按 F12 或 ctrl+u 审查元 ...

  6. Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)

    来源:CSDN 本文约3500字,建议阅读9分钟. 本文根据Python爬取了赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考. 房价高是 ...

  7. python爬取天气_python3爬取各类天气信息

    本来是想从网上找找有没有现成的爬取空气质量状况和天气情况的爬虫程序,结果找了一会儿感觉还是自己写一个吧. 主要是爬取北京包括北京周边省会城市的空气质量数据和天气数据. 过程中出现了一个错误:Unico ...

  8. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  9. python爬取网页书籍名称代码_python爬取亚马逊书籍信息代码分享

    我有个需求就是抓取一些简单的书籍信息存储到mysql数据库,例如,封面图片,书名,类型,作者,简历,出版社,语种. 我比较之后,决定在亚马逊来实现我的需求. 我分析网站后发现,亚马逊有个高级搜索的功能 ...

最新文章

  1. SQLite数据库操作
  2. github 笔记
  3. BroadCastReceiver简介
  4. 数据结构与算法之堆排序
  5. 京东抢购机器人_双十二什么值得买?会自动收垃圾的扫拖机器人了解一下
  6. mysql_real_connect阻塞_mysql_real_connect 参数注意-阿里云开发者社区
  7. 如何开启MySQL的慢查询日志
  8. Masonry 布局 cell 高度适应的一种方案(实现类似朋友圈简单布局)
  9. 换了路由器电脑都连不上网了_高校连上网自由都实现不了?三大运营商:这锅我不背...
  10. USB 2.0学习笔记1——硬件/Lenovo
  11. app能不能跳转外部h5_uni-app微信小程序跳转外部H5链接
  12. 算法学习(二十)——GAE
  13. octet和byte的差异
  14. 基于RiskPariyBlackLitterman的因子择时
  15. 用键盘控制鼠标移动的Python脚本
  16. QT绘制不规则多边形
  17. mysql5.7应该导什么包_限定盲盒!只有快递小哥可以拆的“战马空投箱”…到底什么来头?...
  18. 网络管理与维护(5.2)RMON MIB
  19. 文档在线查看功能的实现
  20. Flume采集数据利器

热门文章

  1. 喝茶有讲究:各种茶的功效
  2. InfoPath 系列:表单的发布与共享
  3. 孙溟㠭书画《野狐禅》
  4. 中国31个三十一个省会城市的货郎担回路15404千米
  5. 0929 - CloudXNS 域名解析需要实名认证
  6. js正则表达式(字符含义)
  7. android log4j2,Log4j2最佳实践
  8. 平凡世界中每一个平凡人
  9. next cloud_Google Cloud Next '17主题演讲的5个重要要点
  10. 「镁客早报」三星折叠屏手机中国区发布会临时取消;特斯拉在地库中突然自燃...