之前写过两篇科创板反馈意见爬虫的文章,没有用到代码,适合小白。第一篇是如何用八爪鱼设置爬取下载地址:10分钟教你爬取科创板反馈意见
如果还是不会设置,就看第二篇,我把设置好的配置文件上传了,直接在八爪鱼导入配置文件就能爬了:科创板爬虫,这次不用自己设置了
爬取下载地址后,用迅雷或者我传的下载器都能下载。
目前这两篇文章仍然有效,需要科创板反馈意见的朋友可以去看看。
创业板实行注册制后,反馈意见公开了,截止到9月18号也有200多条公司的记录了,我本想按之前科创板的方式做一个八爪鱼的配置文件上传,这样就没有什么学习成本了,而且也不用担心之后网站的变动,但是初步尝试一下不行.. 深交所不像上交所,在问询意见的界面不能直接下载↓
地址:http://listing.szse.cn/projectdynamic/ipo/index.html
上交所可以直接在这个界面爬到下载地址,所以八爪鱼的效率也不算低,10多分钟就能把所有的地址爬完。
深交所没有在这个界面放出地址,必须点进公司名,在详情里面找到反馈的文件↓
用八爪鱼的话一个一个页面去打开,效率太低了,所以这次只能靠代码了。
在工具的选择上,如果用python的话写出代码也没法直接给大家伙用,所以这次还是考虑用Excel的VBA来实现,写出来的.xlsm文件也会上传到网盘,可以直接下载使用,在公众号后台回复[爬虫工具]下载使用。
首先确定思路:
①打开深交所IPO板块获取网页源码,解析出所有公司详情页的链接→②打开所有公司详情页的链接解析出下载地址链接→③将下载地址与公司名整理好并赋值到单元格中
01
①打开深交所IPO板块获取网页源码,解析出所有公司详情页的链接:
这一步获取网页源码的目的是得到详情页的链接,因此先随便点开一个详情页,观察一下链接的规律↓
先打开这个链接,看看网址是什么↓
看到这个链接的形式,首先就猜到所有的详情页链接格式会不会是固定的前缀+id=XX? 于是打开第二个公司的详情页↓
果然只有后面的id数字变化了,所以第一步的目的就很明确了,那就是在IPO板块的页面取到所有公司对应的id。
用chrome浏览器右键查看网页源码↓
然后直接搜索id,找到对应的标签↓
竟然没有搜索到.. 心里一凉,这个网页不简单..
再试着点了一下后面的翻页按钮,网页的链接并没有变化,那应该是使用了Ajax+异步渲染的模式。
F12开启监听,点一下翻页看看返回的是什么东西↓
点击这个↓
emmm,东西都整整齐齐地在这个里面了,很好,所以我们第一步的发送请求的网址不再是深交所IPO板块的网址了,而是这个网址↓
这里有2个参数:
pageIndex=1&pageSize=10
直觉告诉我,它的意思是:页码为1,一页显示10条信息。
注意,我这里实际已经翻到了第二页,所以真正的第一页pageIndex=0
于是我把参数改为pageIndex=0&pageSize=9999
这样就不用翻页了,直接就能获取所有的公司id,并且不用在循环中反复给服务器发送请求,增加服务器压力。
VBA实现如下:
Set http = CreateObject("MSXML2.XMLHTTP.3.0")URL = "http://listing.szse.cn/api/ras/projectrends/query?stage=20&bizType=1&pageIndex=0&pageSize=9999" With http .Open "GET", URL, False .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36" '请求头 .send RES = .responseText End With
1行:创建对象MSXML2.XMLHTTP.3.0
4-6行:用GET方法发送请求,请求头增加了一个浏览器的信息
7行:返回的文本赋值给变量RES
接下来就是把返回的文本解析成公司和对应id的样子,首先康康返回了啥↓
可以看到每个公司的id前面都有一个字符串"prjid",那么按这个规律,直接用split函数就能粗略的切割出来(一般会用正则表达式来解析,这里简单起见就用split函数了)
代码如下:
sp1 = Split(RES, "prjid"":")
切割完康康长啥样:
可以看出再用,"分割ID、用cmpnm":"和","cmpsnm"分割公司名就行。
代码如下:
For i = 1 To UBound(sp1)fxxh = Split(sp1(i), ",""")(0) '发行公司序号fxnm = Split(Split(sp1(i), "cmpnm"":""")(1), """,""cmpsnm")(0) '发行公司名称Next
此时,已获取到了所有公司的ID,变量名为fxxh。
02
②打开公司详情页,解析下载地址
既然得到了公司的ID,那么将前缀和ID拼接一下,就能得到详情页的链接了,代码如下:
URL = "http://listing.szse.cn/api/ras/projectrends/details?id=" & fxxh
首先,我们先看看详情页中的下载链接要怎样获取:
先随意打开一个详情页查看源代码,直接搜索".pdf",如果能搜索到并且对应上的话,直接把网页源码获取到,慢慢解析就行了↓
遗憾的是又没搜索到,那他应该又是用了异步渲染,果然不是那么好爬的,继续F12监听,刷新一下页面,看看发送了哪些请求↓
这里一眼就挑出了一个最特殊的,直接搜索里面有没有.pdf吧↓
这里搜索出来了.pdf,但是看样子不像是网站链接,可能又需要拼接一下,我们随便打开一个下载链接,看看长啥样↓
果不其然又是拼接而成的,RAS_之前的链接是固定的,所以我们只需要取到所有的RAS_XXXX.pdf就行了。
看看这个xhr请求的是哪个地址↓
所以第二步最开始拼接的网址错了(因为那个详情页搜索不到.pdf),我们需要请求这个网址,依旧是固定前缀+公司的ID
重写拼接链接↓
URL = "http://listing.szse.cn/api/ras/projectrends/details?id=" & fxxh
03
已经找到正确的详情页了,那么只用获取文本进行解析就行了:
With http .Open "GET", URL, False .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36" '请求头 .send RES2 = .responseText sp2 = Split(RES2, """dfphynm"":""") '框出每段开头 For j = 1 To UBound(sp2) sp3 = Split(sp2(j), """,""dftitle""") '截掉不用段落 dl = "http://reportdocs.static.szse.cn/UpFiles/rasinfodisc/RAS_" & Split(sp3(0), """,""dfnm"":""")(0) '分割 nm = Split(sp3(0), """,""dfnm"":""")(1) p = Range("A1048576").End(xlUp).Row + 1 Cells(p, 1) = fxnm Cells(p, 2) = dl Cells(p, 3) = nm Next End With
1-5行:发送请求,获取文本
6-10行:切割出RAS_XXX.pdf及对应文件名(同上不再赘述)
11-14行:将相应的下载地址和文件名写入单元格
至此,这个爬虫已经写完了,实际运行结果如下↓
想了想,还是没有把爬地址和下载放在一起,可以自行决定部分下载,以后如果更新了新的反馈意见,直接爬新的就行了,要下载时再复制到下载器中下载。
这篇文章不是手把手教你VBA爬虫,只是作为一个实战案例分享出来,如果有VBA基础,可以稍微研究一下,要是对爬虫感兴趣的话,还是建议去学Python爬虫,各种库用起来更加方便。
end
要是内容对你有用,可以分享到你的朋友圈噢~