利用页面交叉引用反馈爬取vulners.com的数据
因为实验室的工作需要,需要对vulners.com网站上的漏洞信息和相关链接进行数据爬取,但是vulners本身对爬虫的限制非常严格,前端页面都是由react.js生成的,很难单纯靠爬虫获取html数据。
vulners网址:https://vulners.com/
可选方案
(1)利用chrome driver+ selenium获取数据。
(2)利用chrome 插件本身作为数据爬虫的载体。
(3)利用PhantomJS或者scarpy-splash进行加载。
(4)采用官方API进行爬取。
各个方案的评估
(1)由于vulners是境外网站,在国内加载速度很慢,而这些浏览器加载工具仅仅在加载完成之后才会进行。这样速度就很慢了。
(说明:现代浏览器例如chrome都采用了多线程加载和一边渲染一遍展示的技术,因此给用户的感觉就是很快就能把页面渲染出来,其实后台的工作还没有完成,再加上现代的web前段常用的异步加载工具例如ajax等,更进一步降低了方法(1)(2)的效率)
(2)之前采用过PhantomJS之类的js加载工具,但是其功能还是相对有限。对于exploit-db之类的简单的js网站效果相对好一些,而在vulners上表现的不太好。
vulners api
最终笔者采用了使用vulners api的方法来进行数据提取,而vulners api这个方法也是存在问题的,就是每次最多能够获取2000到10000条数据,然而vulners本身有将近70w条数据。
爬取方案
由于最近vulners网站升级,因此具体的api内容暂时无法发布与此。现在介绍一下爬取思路和具体的工作方案。
爬取过程分两个大步:
(1)利用组里的软件漏洞词典,进行初始数据积累:
这个过程和”薅羊毛”类似,利用字典里面的分词,在vulners网站的搜索api上进行查询获取
具体的API为:https://vulners.com/api/v3/search/lucene/?query=(关键词)
这一过程一共积累了33w条数据。
(2)利用网页上的交叉引用,进一步获取数据。
vulners.com网站的每个漏洞页面上会有一些和它相关的漏洞的页面链接,之后可以利用这些数据来作为进一步获取的跳板。
https://vulners.com/api/v3/search/lucene/?query=(关键词)
&&reference=True。添加一个参数就可以获取相关数据。
总体来说系统的工作是按照如下流程进行的。
urls_to_fetch = [] #待爬取url队列
for token in software_vul_dict:
url = gen_url(token)
insert_db(search_by_lucence(url))
#这个过程是基础数据积累过程:
for item in db:
urls_to_fetch.append(gen_url(item))
for url in urls_to_fetch:#注意,这个队列有更新操作,因此迭代过程应该注意
(result,result_ref)=search_by_id_with_ref(url)
insert_db(result)
urls_to_fetch.append(gen_url(result_ref))