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

目标

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

具体流程

  1. 构造URL,根据关键词(如glibc)爬取相关软件的漏洞信息,统计其数量和网页数
  2. 构造URL,一个一个网页的爬取,找到每个具体漏洞的链接,保存这些链接
  3. 根据每个具体漏洞的链接,爬取相关页面,用正则表达式和BeautifulSoup找到我们需要的链接。

代码实现

  1. 爬取网页并保存到EXCEL文件中
# -*- coding:utf-8 -*-
import requests
from  bs4 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 = 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 = 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相关漏洞_第1张图片
2. 统计数据

import xlrd
import xlwt
import traceback
def open_excel(path,name):
    type={}
    level={}
    try:
        data=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相关漏洞_第2张图片

结果可视化

用EXCEL将数据绘图,实现可视化,下面给出一例。
爬虫练习--爬取CNNVD相关漏洞_第3张图片
爬虫练习--爬取CNNVD相关漏洞_第4张图片

你可能感兴趣的:(python练习)