【爬虫实战】深交所服务业年报数据
本文作者:万浩,中南财经政法大学统计与数学学院
本文编辑:周一鸣
技术总编:王玉婷
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. 批量年报提取
通过股票代码匹配想要的年报,并生成包含url链接的结果表格:爬取结果.xlsx,代码和结果如下所示。
import requests
import time
import random
import 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 os
import time
import random
import pandas as pd
import requests
data = pd.read_excel('爬取结果.xlsx',converters={'secCode':str,
'title':str,'url':str,'secName':str})
Code_list=reversed(list(set(data['secCode'])))
sum=0
for 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("下载完成")
最后,我们为大家揭秘雪球网(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)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。