每日公告数量@TOC
本文从东方财富网上市公司公告页面获取沪深A股1991-2019年公告数据,按照数据获取的先后顺序,将数据分为以下两个部分一是上市公司公告信息,包括:序号(index)、股票代码(code)、股票名称(name)、公告标题(title)、公告链接(url)、公告日期(date)、小标签(label)、公告类别(class),数据格式如下:
序号 | 股票代码 | 股票名称 | 公告标题 | 公告链接 | 公告日期 | 小标签 | 公告类别 |
---|---|---|---|---|---|---|---|
1 | 300576 | 容大感光 | 关于***的公告 | http://***.html | 2020-01-03 | 董事会决议 | 重大事项 |
二是上市公司公告正文及其类别,包括:公告链接(url)、公告正文(content)、公告类别(class),数据格式如下:
公告链接 | 公告正文 | 公告类别 |
---|---|---|
http://***.html | 深圳市容大感光*** | 重大事项 |
本文的公告数据来自“东方财富网>数据中心>公告大全>沪深A股公告”页面。每个网址都会向用户提供Robots协议(又称爬虫协议)。该协议规定了爬虫程序在各个网页中的权限。如:爬虫协议规定了哪些页面可以被网络爬虫程序抓取,哪些网页不能被抓取。因此,爬虫协议能够判断用户操作的合法性。本文采用python的RobotFileParser模块读取东方财富网公告页面的Robots协议,并判断其爬虫操作的合法性。如果该页面允许爬虫程序抓取信息,则RobotFileParser返回True,如果不允许,返回False。结果显示,东方财富网允许爬虫程序获取公告信息及正文内容,解析爬虫协议的代码如下:
from urllib.robotparser import RobotFileParser
rp=RobotFileParser()
rp.set_url('http://data.eastmoney.com/notices/robots.txt')
rp.read()
#判断公告列表是否可以被抓取
print(rp.can_fetch('*','http://data.eastmoney.com/notices'))
print(rp.can_fetch('*','http://data.eastmoney.com/notices/detail/000651/... .html'))
'''
结果如下:
公告信息列表页面:True
公告正文页面:True
'''
东方财富网沪深A股公告查询的结果只能返回前1000页公告列表,为了获取更多的股票公告,采取按照股票代码查询公告的方式,每次返回对应股票的上市公司公告信息列表页面,例如:股票代码为600158的公告信息页面的网址如下所示:
http://data.eastmoney.com/notices/stock/600158.html
获取其他上市公司公告信息只需将网址中的股票代码替换成相应的股票代码。而单个上市公司的股票信息列表一般不超过1000页。因此,通过上述方式就能获取所有上市公司的公告信息。
通过东方财富网的Choice金融终端的数据导出功能获取沪深A股全部上市公司的股票数据,包含序号(index)、股票代码(code)、股票名称(name)。截至目前,沪深A股总共有3763只股票,详细股票代码及名称见附录。
获取上市公司公告信息的总流程如下:
(1)读取上司公司股票数据;
(2)遍历股票代码及名称,获取股票代码对应的上市公司公告信息。
(3)重复步骤)(2)直到最后一个上市公司的公告信息被获取时,爬虫停止运行。
总流程图如下:
其中,url_spider为获取单个上市公司公告信息的子流程,该模块采用Selenium网页自动化测试工具和chrome浏览器模拟用户浏览公告页面的操作,从而获取上市公司公告信息。url_spider的主要步骤如下:
(1)输入股票代码;
(2)打开浏览器,并输入股票代码对应网址;
(3)点击公告分类选项,如重大事项等;
(4)获取公告信息并写入数据库;
(5)判断是否为最后一页,如果是,点击“下一页”;
(6)重复步骤(4)(5),直到最后一页为止。
(7)重复步骤(3)(4)(5)(6),直到获取完所有分类选项为止。
下面是url_spider的程序流程图:
通过获取公告信息已经抓取到了所有公告正文的链接(URL),然后利用python requests库发送请求,获取每条链接对应的公告正文。具体步骤如下:
(1)从公告信息数据库中读取公共哦正文网址列表,记为url_list;
(2)遍历url_list,抓取链接对应的上市公司公告正文;
(3)将抓取到的公告正文写入公告正文数据库;
(4)重复步骤(2)(3),直到最后一篇公告正文被写入公告正文数据库。
获取公告正文的程序流程图如下:
上市公司公告信息几乎每天都在产生,增量式爬虫能够及时的获取新增公告。增量式抓取数据的方法是在已经获取到历史数据的基础上,向数据集中追加新产生的数据的方法。同时,增量爬虫能够解决因网络连接失败、程序报错、等问题使得程序意外终止,再次启动程序时程序“遗忘”任务进度的问题。防止数据重复获取,浪费时间、计算和存储资源。要实现增量式爬取只需在普通爬虫中添加日志模块和定时启动模块。日志模块负责记录了任务进度和在程序暂停或报错时自动保存当前进度。定时启动模块负责每日定时启动爬虫程序,并获取最新上市公司公告信息。数据抓取任务非常占用网络传输资源、计算资源,当计算机执行爬虫任务是会影响计算机的正常使用,因此爬虫任务适合在计算机空闲时执行,例如,每天的零点到次日的七点人们一般不会使用电脑。通过linux的crontab实现定时启动和关闭爬虫程序。
为了方便查看、移动和备份数据,爬虫程序获取到的上市公司公告信息数据和公告正文数据被分别存储在多个文件中,在对数据进行处理、分析之前需要读取这些文件并且将这些数据合并到同一个表格中。最后,公告链接,公告标题,公告类别等信息需要与公告正文数据对应起来,由于公告正文链接与公告正文一一对应,因此公告信息数据与公告正文数据可以通过公告链接进行连接。
首先,对公告信息数据进行清洗。由于爬虫程序可能重复获取到同一条公告信息,需要对数据进行去重,即,对重复样本只保留其中一个样本,一般保留第一个样本,后面与之重复的样本全部删除;此外,在数据集中存在极少数同一个样本对应多个类别的情况,这样的样本会对分类算法造成干扰,所以需要全部删除这样的样本;包含缺失值、异常值的样本同样需要删除。去重、删除异常样本之前总样本量为883723,经过去重、删除异常样本之后总样本量为700220。
在将公告正文数据投入模型之前需要作以下预处理:
(1)删除公告正文中的特殊字符;
(2)删除重复公告;
(3)设置公告最大长度。
由于公告内容非常多且重要信息主要集中在标题和首段,所以减少计算机性能和时间的开销,截取公告前n个字符是最简单有效的方法。
如何解决:
训练模型时只需将公告标题和正文内容与公告类别一一对应起来。以也就是说不能出现一篇公告有多个类别的情况;从上面测试的结果可以分析出,一篇公告对应多个类别的情况并不是很多,所以只需删除这种情况的公告即可。(这里其实时做了一个假设,即:假设股票公告所属类别唯一。由于公告类别不唯一的情况很少,所以这个假设是合理的。)
数据不均衡是指不同类别的样本在数据集中的占比不均衡。上市公司类别分布情况如下:
如图所示,上市公司类别分布及不均衡。重大事项、财务报告、信息变更等类别的样本量远大于风险提示、融资公告、资产重组、持股变动。样本不均衡问题会使预测为小样本量的类别的概率下降,从而导致分类的正确率下降。本文同时采取以下方法解决样本不均衡问题:
(1)对大样本量的类别作欠采样;
(2)对小样本量的类别作过采样;
(3)根据样本类别分布,设置不同权重,增加预测为小样本量的类别的概率。
1、[Python爬虫]利用Selenium等待Ajax加载及模拟自动翻页,爬取东方财富网公司公告
2、[Python爬虫]爬取东方财富网公司公告需要注意的几个问题
3、Python 爬虫基础Selenium库的使用(二十二01)
4、selenium.webdriver.support.ui 和selenium.webdriver.support.wait的区别
5、Chrome无界面启动使用
6、python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)
7、pandas.to_csv
8、python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
9、multiprocessing — 基于进程的并行
10、2、利用map实现并行任务技巧
11、python的return详解。
12、(Python)利用pandas向一个csv文件追加写入数据
13、pandas的唯一值、值计数以及成员资格
14、pandas的值计数,唯一值,成员资格
15、Pandas删除数据的几种情况