---
# System prepended metadata

title: 通用漏洞爬虫

---

通用漏洞爬虫
===

本文写于2018年4月15日

这是换到python3后写的第一个比较大的东西，稍微总结一下

源码地址：GitHub   https://github.com/786662216/vulnerability-spider

最终效果：通用漏洞安全情报  http://www.sheshuaiyan.top/cve/

一开始换到3后，print是函数也好，pip和python2冲突也罢。最让人受不了的还是有些库的差别真的是很大，很多类的方法参数都不一样了。编码也是，不知怎么回事前面就加了个b硬生生改成二进制字节流了

主要是从http://www.cnvd.org.cn/、https://www.seebug.org/、http://cve.scap.org.cn/  这三个网站中爬取的

主体思路还是挺笨的，直接用request把整个网页源码下载下来再用正则去匹配，没有用scapy之类的框架。花了一些时间去写正则，得到的数据放到csv中，用php取出来后处理一下放到模板中去。中间遇到了一些问题

一、首先是CNVD和seebug有反爬机制，都是用的知道创宇的加速乐。seebug就不用说了，用的是自家的；但CNVD也用的这个东西，所以绕过反爬的方法是一样的。首先了解一下加速乐是怎么反爬的

* 判断客户端的cookie正不正确。如果不正确（或者没有），返回521状态码
* set-cookie（__jsluid）并且返回一段js代码通过浏览器执行后又可以生成一个cookie（__jsl_clearance）
* 只有这两个cookie一起发送给服务器，才会返回正确的网页内容
* 注意，刚才（2018年6月20日14:00:45）发现只需要jsuid即可，需要在之后加上 max-age=31536000; path=/; HttpOnly

只要获得这两个cookies就可以了，那么思路就有两种：

1、分析/解密js，算出__jsl_clearance）

2、直接用selenium模拟浏览器访问，再通过自带的方法直接拿出这两个cookies

一开始用的第一种方法，问题不大，但是没什么通用性

二、因为要放到没有图形界面的服务器上跑（ubuntu server 14.04），所以selenium还不能直接用，还用到了一个库中的类：Display的pyvirtualdisplay。这个东西可以假装有个界面在运行，原理就是欺骗系统底层这里有一个800x600的窗口正在访问某个页面，这样就可以在linux服务器上运行这个爬虫了，不要忘了装好Display所依赖的其他库和软件，这个库对windows很不友好。

上面提到的对其他软件和库的依赖是一个问题，还有两个问题：一个是header问题，一个是账户权限问题。

不得不说加速乐后台处理的还是很细心，如果有一个头对不上就直接返回js而不是html正文，尤其是User-Agent。于是又装了个ubuntu14.04的虚拟机安装了chrome（因为我用的webdriver是chrome），把头粘下来换了上去，但是还是不行，虽然没有返回js但是报错了，查了一下才知道Display不能用root账号启用webdriver，没明白为什么。于是又创建了一个新账户，给文件加了权限后，用新账户运行就没有任何问题了。

三、最后便是一些比较小的问题。

* 首先是加了datetime这个库，用来设定每天什么时候运行；
* 因为要爬好几个网站，所以有很多python文件，以后没准还要加。每次在bash下一个一个运行太麻烦，写了个shell脚本让他一次性全部启动；
* 运行结果无论成功还是有错误还要写入到log日志中，这个也在shell中实现了；
* 用php取出csv文件中的数据时，可能会有空行、数据为空等问题，处理一下即可；





