从巨潮资讯爬取上市公司公告

本文最后更新于 2022年10月16日 晚上

背景

最近闲着没什么事,就帮同学写了个爬取巨潮资讯上市公司公告的 python 脚本,根据公司的股票代码以及公告的日期自动下载公告( pdf 或者 html 格式)。
脚本开源在 cninfo-crawler

刚开始本来想用 selenium 爬的,结果搞到一半发现完全没有反爬,就直接用 requests 库了。

爬取过程

我们先进入巨潮资讯主页,打开 F12 开发人员工具,再随便搜索一个公司的股票代码跟公告日期。

image-20221016185005940

点击查询,然后关注右边开发者工具捕捉到的消息,将它们按照 Type 排序,我们要找的应该在 xhr 里面,而且方法应该是 POST

image-20221016185854408

一眼我们就发现 query 特别可疑,点开它看看。

image-20221016190046214

先看标头 POST 再看载荷

image-20221016190122109

这个应该就是我们搜索的时候填的表单,stock 里面的 300409 就是股票代码, 但是那个 9900023868 是啥,不太懂。 seDate 就是我们查询的时间段。其他参数不用改。

获取下载链接

看一下预览,很明显 adjunctUrl 就是下载链接了,可惜这是个相对链接,

image-20221016190321649

我们先点进去看一看,刚开始我尝试从 公告下载 捕获下载链接,但是事实证明完全没有用,后来发现可以点 全屏

image-20221016190456492

我们点进全屏,立马就发现 chrome 已经帮我们获取到了完整链接。

image-20221016190602567

因此,完整链接就是 http://static.cninfo.com.cn/adjunctUrl 拼接一下。

值得注意的是,并不是所有的文件都是 pdf,也有 html 所以如果要将下载下来的文件重命名的话,要处理下扩展名。

获取 orgId

这一部分我们说明一下那个神奇的数字 9900023868 怎么来的,因为单用 post 请求不带它的话根本不行,而这个数字每个股票代码不一样。

注意到 这里有一个 json 文件,我们点进去预览一下,发现有个 orgId,它就是了。

image-20221016191056092

保险起见,我们找一下道氏技术的信息(或者搜索一个其他股票对一下)

image-20221016191346392

没错,就是这样了。

因此,所有信息我们都有了。核心的下载代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
query_url = "http://www.cninfo.com.cn/new/hisAnnouncement/query"
download_url = "http://static.cninfo.com.cn"
if end_date == None:
end_date = start_date
data = {
"pageNum": "1",
"pageSize": "30",
"column": "szse",
"tabName": "fulltext",
"plate": "",
"stock": "{},{}".format(stockid, org_id),
"searchkey": "",
"secid": "",
"category": "",
"trade": "",
"seDate": "{}~{}".format(start_date, end_date),
"sortName": "",
"sortType": "",
"isHLtitle": "true",
}
c = requests.post(query_url, data=data, headers={'user-agent': ua})

其他的工作就是解析返回的json 与下载链接。本文就不再叙述了。

结语

巨潮资讯还是好爬的,完全没有做任何反爬。


从巨潮资讯爬取上市公司公告
https://blog.askk.cc/2022/10/16/cninfo-crawler/
作者
sukanka
发布于
2022年10月16日
许可协议