查看原文
其他

【爬虫实战】深交所服务业年报数据

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:万浩,中南财经政法大学统计与数学学院

本文编辑:周一鸣

技术总编:王玉婷

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

引言

由于上市公司的年报各项数据非常完整,而且需要由会计事务所进行审计,因此分析年报的内容将非常有利于研究上市公司的业务、财务和持股情况,今天小编将带领大家爬取深交所服务业年报,并下载年报文本。


1. 单个年报爬取

首先来到深圳证券交易所首页(https://www.szse.cn/index/index.html),依次点击信息披露、上市公司信息和定期报告菜单,可以看到最新的企业年报,选择检索年份:2022年,即可得到年报的url。

将鼠标置于红圈处,可以看到爬取的内容,从中可以找到年报所属公司的股票代码、公司名称以及年报标题等数据。

根据url就可以爬取结果并输出。以股票代码为222396的星网锐捷为例,打印出年报所属公司的股票代码、公司名称、年报标题以及年报的url链接,代码和结果如下所示。

import requests
url = 'https://www.szse.cn/api/disc/announcement/annList?random=0.1872953156324726'headers = {'Use-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Refrer':'https://www.szse.cn/disclosure/listed/fixed/index.html', 'Content-Type':'application/json'}d = {'seDate': ["", ""], 'stock': ["002396"],'channelCode': ["fixed_disc"],'pageSize': 50,'pageNum': 1}res = requests.post(url,headers=headers,json=d).json()
print(res['data'][0]['secCode'][0])print(res['data'][0]['secName'][0])print(res['data'][0]['title'])print('https://www.szse.cn/api/disc/info/download?id='+res['data'][0]['id'])


2. 批量年报提取
接着,我们可以找到服务业公司的股票代码,并得到表格:服务业股票代码.xlsx,如下所示。

通过股票代码匹配想要的年报,并生成包含url链接的结果表格:爬取结果.xlsx,代码和结果如下所示。

import requestsimport timeimport randomimport pandas as pd
def extract_data(data): results=dict() onedata=pd.DataFrame() for i in data: if i['title'].endswith("年年度报告(更新后)") is True: i['title'] = i['title'][0:-5] if (i['title'].endswith("年年度报告") is False): continue results['secCode']=[i['secCode'][0]] results['secName']=[i['secName'][0]] results['title']=[i['title']] results['publishTime']=[i['publishTime']] results['url']=['https://www.szse.cn/api/disc/info/download?id='+i['id']] df=pd.DataFrame(results) onedata=pd.concat([onedata,df]) return onedata
alldata = pd.DataFrame()firm = pd.read_excel('服务业股票代码.xlsx',converters={'code':str})for stock in firm['code']: url = 'https://www.szse.cn/api/disc/announcement/annList?random=0.1872953156324726' headers = { 'Use-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13', 'Refrer': 'https://www.szse.cn/disclosure/listed/fixed/index.html', 'Content-Type': 'application/json'} d = {'seDate': ["", ""], 'stock': [stock], 'channelCode': ["fixed_disc"], 'pageSize': 50, 'pageNum': 1} r = requests.post(url, headers=headers, json=d).json() onedata = extract_data(r['data']) alldata = pd.concat([alldata,onedata]) # 由于data长度为50,所以每次页面为r['announceCount'] // 50 + 1 pages = r['announceCount'] // 50 + 1 for page in range(2,pages+1): data = {'seData': ["", ""], 'stock': [stock], 'channelCode': ["fixed_disc"], 'pageSize': 50, 'pageNum': page} res = requests.post(url, headers=headers, json=data).json() onedata = extract_data(res['data']) alldata = pd.concat([alldata, onedata]) time.sleep(random.uniform(0.8,1)) alldata.to_excel('爬取结果.xlsx')


3. 下载年报结果

最后,通过所得的url,我们可以批量下载年报PDF,新建名为年报结果的文件夹,并将年报下载到文件夹中,代码和部分年报结果如下所示。

import osimport timeimport randomimport pandas as pdimport requestsdata = pd.read_excel('爬取结果.xlsx',converters={'secCode':str, 'title':str,'url':str,'secName':str})Code_list=reversed(list(set(data['secCode'])))sum=0for Code in Code_list: sum=sum+1 path='年报结果\{}'.format(Code) if os.path.exists(path): continue os.mkdir(path) for i in range(0, len(data['secCode'])): # print(list(data['secCode'][i:i + 1])[0]) if Code==(list(data['secCode'][i:i + 1])[0]): print("开始下载股票代码{}的{}".format(list(data['secCode'][i:i + 1])[0], list(data['title'][i:i + 1])[0])) a = "".join(list(filter(str.isdigit, list(data['title'][i:i + 1])[0]))) file_path = "年报结果/{}/{}.pdf".format(Code, a) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'} res = requests.get(list(data['url'][i:i + 1])[0], headers) time.sleep(random.uniform(0.8, 1)) with open(file_path, 'wb') as fp: fp.write(res.content) print("下载完成")

后续还可以将PDF格式转换为文本格式,即可对企业营运状况进行文本分析,感兴趣的同学可以尝试一下。
END
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!





往期推文推荐  

“挂羊头卖狗肉”?

Python与excel交互--xlsxwriter模块

cnmapsearch——离公司最近的快餐店在哪

Python中的异常处理 Python交互式数据可视化——酷炫的Altair库 hk系列命令(3)—— hktrade hk系列命令(2)—— hkar hk系列命令(1)—— hkstock 超好用的字符串方法 基于Python的假设检验实现Stata与MySQL交互--基础操作 Jupyter Notebook中的魔术命令《Stata正则表达式》由中国金融出版社出版发行   匿名函数lambda到底怎么用?Stata绘图系列—NBER Working paper仿图Camelot:从PDF中提取表格数据Stata之计算财务指标——融资约束 列表生成式|让你的代码更简洁

     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存