教育行業漏洞報告平台(Beta)數據爬取分析


解決問題

對教育漏洞提交平台的漏洞相關數據進行分析。

內容與要求

爬取網站提交的漏洞的相關信息,對每年漏洞數量,漏洞類型變化,漏洞類型比例,提交漏洞排名,存在漏洞數最多等方面進行統計分析,並可視化

使用工具

Requests 用於爬取頁面
BeautifulSoup用於頁面分析
Pandas用於數據分析
Time 用於爬取時進度條顯示進度
tqdm用於爬取時進度條顯示進度
matplotlib用於數據可視化,繪制統計圖
wordcloud 用於數據可視化,繪制雲圖

爬取數據

網站分析

1、網站為:教育行業漏洞報告平台(Beta),該網站是專門針對教育學校網站的漏洞提交搜集平台
2、對網站漏洞頁面數據爬取,url為https://src.sjtu.edu.cn/list/?page=1

3、截止2020-1-3 22:00,共有2172個頁面,所以可以通過修改page的參數請求不同頁面
4、查看頁面結構,如下圖,發現第一個table標簽里為所需數據,每一行在tr標簽中,每一個表格在td在中,所以通過bs4可以進行進行提取

開始爬取


大約一個半小時后

全部保存到excel文件中

程序如下

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
from tqdm import tqdm

mylist = []
user = {'user-agent': 'Mozilla/5.0'}
for i in tqdm(range(1,2173)):#共有2172頁需要爬取,設置url鏈接中page的參數,其中tqdm用於進度條
    url = 'https://src.sjtu.edu.cn/list/?page='+str(i)
    r = requests.get(url, headers=user)#請求頁面
    r.encoding = r.apparent_encoding
    html = BeautifulSoup(r.text, 'html.parser')
    mytable=html.find('table')#找到頁面中的表格
    mytr=mytable.find_all('tr')#找到表格中所有行
    mytr.pop(0)#去掉數據中表頭那一行
    #對每一行各個單元格處理
    for m in mytr:
        tds=m('td')#將這一行所有單元格保存在tds中
        j=tds[1].a.string.split()[0]#第二個單元格(這一個單元格保存的數據為xx學校存在xx漏洞)包圍在<a>標簽中,將其中的字符串取出來,並去掉空格換行等
        jj=j.split('存在')#將改字符串通過存在分割
        #因為里面的數據有一點不是xx學校存在xx漏洞的形式,需要分別處理
        if(len(jj)==2):#如果有存在這個字符
            ty = jj.pop()#保存漏洞類型
            school = jj.pop()#保存學校
        else:#如果沒有,將漏洞類型設為其它
            school=jj.pop()
            ty='其他漏洞'
        #將這一行所有內容存在mylist中
        mylist.append([tds[0].string.split('-')[0],school,ty,tds[2].string,tds[3].string])#第一個單元格通過-分割,只取年份
    time.sleep(2)#一方面降低爬取速度,一方面用於顯示爬取進度條
my=pd.DataFrame(mylist,columns=['年份','學校','類型','程度','提交人'])
my.to_excel(r'C:\Users\Desktop\my.xlsx')

數據分析

因為2020只有1月的數據,所以分析時將2020年的數據先去除data = data.drop(data[data['年份'] == 2020].index)

對每年漏洞數量分析


可以看出,漏洞發現數量在這三年是波動的,但總體還是在增加。隨着互聯網發展,相應的安全問題肯定也越來越多。

對漏洞類型比例的統計


可以看到,漏洞類型前三是常見的信息泄露,sql注入,弱口令。學校網站一般都面向學生,保存有大量學生的個人信息,加上學生的自我保護意識弱。一旦違法者利用漏洞竊取信息,再將這些信息倒賣,或利用信息進行詐騙,將引起嚴重后果。切實感受學校網站的口令一般都是由規律的學號,身份證號構成,安全性確實不夠。

對提交漏洞者分析


前幾名的大佬提交了上千漏洞,雖然一些漏洞可以批量刷出來,但三年間能提交這么多,實在佩服。

所使用的罩圖

對學校存在漏洞數分析


從上圖可以看到被存在漏洞數居前列的有很多名校,作為國內有影響力的高校,安全防護也需要同步跟上。另外上海交通大學的漏洞數遙遙領先,遠遠超出其它高校,個人猜想,可能跟這個平台是由上海交通大學參與建設的關系。

對各年各漏洞程度分析


從上圖可以比較得出,雖然漏洞數量有增長,但高危漏洞在下降,這也是國家政策推動,人們對安全的意識逐步提高的結果。

程序

import pandas as pd
import matplotlib.pyplot as plt
from wordcloud import WordCloud

data = pd.read_excel(r'C:\Users\Desktop\my.xlsx')#讀取爬取到的數據
data = data.drop(data[data['年份'] == 2020].index)#因為爬取日期為2017-2020.1,所以只分析2017-2019的數據,將2020年的數據全部去掉

#對每年漏洞數量分析
#實際讀取相應列就可以,但是發現生成的折線圖的點不是順序連接的,可能是由於x軸的年份是數值形式,所以下幾步將年份轉化為字符串形式
d = dict(data['年份'].value_counts())#讀取年份這一列,轉化為字典
#構造新的字典
dd = {}
dd['2017'] = d[2017]
dd['2018'] = d[2018]
dd['2019'] = d[2019]
ddd = pd.Series(dd)
plt.figure(1)#開始畫折線圖,新建繪圖一
ddd.plot()
plt.rcParams['font.sans-serif'] = ['simsun']#以顯示中文,奇怪的是,其他字體無法顯示,試了幾個,這個字體才能顯示
plt.xlabel('年份')#x軸標簽
plt.ylabel('漏洞數量')#y軸標簽
plt.title('各年漏洞數量變化')#標題
plt.savefig(r'C:\Users\Desktop\各年漏洞數量變化.jpg')#保存

#對漏洞類型比例的統計
t_num = data['類型'].value_counts()[:10]#只取排名前十的
plt.figure(2)#開始畫餅圖,新建繪圖二
t_num.plot.pie(autopct='%.1f %%')#設置顯示比例
plt.title('漏洞類型比例')
plt.savefig(r'C:\Users\Desktop\漏洞類型比例.jpg')

#對提交漏洞者分析
people = data['提交人'].value_counts()[:10]#只取提交漏洞前十
plt.figure(3)#開始畫柱狀圖,新建繪圖三
people.plot.bar()
plt.title('提交漏洞前十')
plt.savefig(r'C:\Users\Desktop\提交漏洞前十.jpg')
#對前十名的昵稱繪制雲圖
c_mask = plt.imread(r'C:\Users\Desktop\hack.jpg')  # 讀入罩圖
wc = WordCloud(font_path="simhei.ttf",  # 設置字體
               mask=c_mask,  # 添加罩圖
               background_color="white",  # 設置背景色
               max_font_size=60)  # 最大字體
wc.generate_from_frequencies(people)  # 產生詞雲
wc.to_file(r'C:\Users\Desktop\1.jpg')

#對學校存在漏洞數分析
school = data['學校'].value_counts()[:20]#只取前20名
plt.figure(4)#開始畫柱狀圖,新建繪圖四
school.plot.bar()
plt.xticks(fontsize=5)#設置x軸大小,發現轉一個角度效果也不好,干脆字體設置小點
plt.title('被發現漏洞數前十學校')
plt.savefig(r'C:\Users\Desktop\被發現漏洞數前十學校.jpg')

#對各年各漏洞類型數量分析
df = pd.DataFrame(index=['2017', '2018', '2019'])#新建DataFrame類型df
#取出原數據程度為高危的年份那一列,對數量統計,即高危漏洞在各個年出現的數量,再按年份進行升序排列,取得值,插入到df中
df.insert(0, '高危', data[data['程度'] == '高危']['年份'].value_counts().sort_index().values)
df.insert(1, '中危', data[data['程度'] == '中危']['年份'].value_counts().sort_index().values)
df.insert(2, '低危', data[data['程度'] == '低危']['年份'].value_counts().sort_index().values)
plt.figure(5)#開始畫折線圖,新建繪圖五
df.plot()
plt.xlabel('年份')
plt.ylabel('漏洞數量')
plt.title('各年漏洞威脅程度')
plt.savefig(r'C:\Users\Desktop\各年漏洞威脅程度.jpg')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM