爬虫练习--爬取CNNVD相关漏洞

目标 从国家信息安全漏洞库(CNNVD)中爬取目标软件的相关漏洞,统计漏洞类型、危害等级、相关数量等,并进行可视化。
具体流程

  1. 构造URL,根据关键词(如glibc)爬取相关软件的漏洞信息,统计其数量和网页数
  2. 构造URL,一个一个网页的爬取,找到每个具体漏洞的链接,保存这些链接
  3. 根据每个具体漏洞的链接,爬取相关页面,用正则表达式和BeautifulSoup找到我们需要的链接。
代码实现
  1. 爬取网页并保存到EXCEL文件中
# -*- coding:utf-8 -*- import requests frombs4 import BeautifulSoup import traceback import re import xlwt list=['glibc','Microsoft Office Word','Microsoft Internet Explorer']#想要查询的相关漏洞 num=[] # 存放每个实体对应的漏洞数目 page=[]# 存放每个实体对应的漏洞的页数 # 根据url爬取网页 def getHTMLTEXT(url,code="utf-8"): kv = {'user-agent': 'Mozilla/5.0'}# 模拟浏览器访问网站 try: r=requests.get(url,headers=kv,timeout=30) r.raise_for_status() r.encoding=code return r.text except: traceback.print_exc() return "" # 初始网页 def parsepage(name,url): type={}# 存放每个实体中的漏洞类型 html=getHTMLTEXT(url) soup=BeautifulSoup(html,'html.parser') #每个类型的数量 #text=soup.find_all('a',text=re.compile('总条数:')) #num.append(re.findall(r'[0-9,]+',text.__str__()[:][:])) #统计当前实体搜索结果共有多少页 value = https://www.it610.com/article/soup.find_all('input',id="pagecount") page.append(re.findall(r'[0-9]+',value.__str__())) #爬取对应漏洞下所有的网页 def all_page(name,url,n): type=[] #漏洞类型 level=[] #漏洞危害等级 name_info=[]#每个漏洞的名称 link=[] #每个漏洞的链接 #循环遍历每个网页 for p in range(1,int(n)+1): html=getHTMLTEXT(url+str(p)) soup = BeautifulSoup(html, 'html.parser') # 统计每个实体中具体漏洞的链接 text = soup.find_all('a',attrs={'class':'a_title2'}) for i in text: try: href = https://www.it610.com/article/i.attrs['href'] if(re.findall(r'.?CNNVD.?',href)): link.append(href) except: continue #对于每一个链接,去爬取链接的页面 for i in link: html=getHTMLTEXT('http://www.cnnvd.org.cn'+i) soup = BeautifulSoup(html, 'html.parser') title=soup.find_all('h2',style="") for m in title[0]: title=m #每个漏洞的具体名称 #寻找类型和等级 text=soup.find_all('a',style="color:#4095cc; cursor:pointer; ",href="") S=[] if len(text): for t in text[:2]: t=re.findall(r'[\u4E00-\u9FA5]+',str(t)) #匹配汉字 try: S.append(t[0]) except: S.append('未评定') type.append(S[0]) level.append(S[1]) name_info.append(title) #将列表信息写入EXCEL中 f = xlwt.Workbook()# 创建EXCEL工作簿 sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)# 创建sheet sheet1.write(0, 0, "漏洞名称") sheet1.write(0, 1, "类型") sheet1.write(0, 2, "危害等级") for i in range(len(name_info)): sheet1.write(i + 1, 0, name_info[i]) sheet1.write(i + 1, 1, type[i]) sheet1.write(i + 1, 2, level[i]) f.save(name+"_result.xls")#保存文件 if __name__=="__main__": url='http://www.cnnvd.org.cn/web/vulnerability/queryLds.tag?qcvCname=' for i in list: parsepage(i,url+i) for i in range(len(list)): turl=url+list[i]+'&pageno=' all_page(list[i],turl,page[i][0]) #创建工作簿 f=xlwt.Workbook()#创建EXCEL工作簿 sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)# 创建sheet for i in range(len(num)): sheet1.write(i,0,list[i]) sheet1.write(i,1,num[i]) f.save("实体总量.xls")

生成的文件如下所示
爬虫练习--爬取CNNVD相关漏洞
文章图片

2. 统计数据
import xlrd import xlwt import traceback def open_excel(path,name): type={} level={} try: data=https://www.it610.com/article/xlrd.open_workbook(path) table=data.sheet_by_name(sheet_name=u'sheet1') t=table.col_values(1)[1:] l=table.col_values(2)[1:] #去掉重复值 t1=set(t) l1=set(l) #初始化字典 for i in t1: type[i]=0 for i in l1: level[i]=0 #统计数量 for i in t: type[i]=type[i]+1 for i in l: level[i]=level[i]+1 f = xlwt.Workbook()# 创建EXCEL工作簿 tkeys=list(type.keys()) sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)# 创建sheet for i in range(len(tkeys)): sheet1.write(i, 0,tkeys[i]) sheet1.write(i, 1,type[tkeys[i]]) sheet2=f.add_sheet(u'sheet2',cell_overwrite_ok=True) lkeys=list(level.keys()) for i in range(len(lkeys)): sheet2.write(i,0,lkeys[i]) sheet2.write(i,1,level[lkeys[i]]) f.save(name+'_sum_up.xls') except : traceback.print_exc() print('Error!') if __name__=="__main__": path=['glibc_result.xls', 'Microsoft Internet Explorer_result.xls', 'Microsoft Office Word_result.xls'] name=['glibc','Microsoft Internet Explorer','Microsoft Office Word'] for i in range(len(path)): open_excel(path[i],name[i])

统计后的数据如下所示
爬虫练习--爬取CNNVD相关漏洞
文章图片

结果可视化 【爬虫练习--爬取CNNVD相关漏洞】用EXCEL将数据绘图,实现可视化,下面给出一例。
爬虫练习--爬取CNNVD相关漏洞
文章图片

爬虫练习--爬取CNNVD相关漏洞
文章图片

    推荐阅读