diff --git a/doc/软件使用说明书.docx b/doc/软件使用说明书.docx
new file mode 100644
index 0000000..73fc4cd
Binary files /dev/null and b/doc/软件使用说明书.docx differ
diff --git a/doc/(最终版)软件设计规格说明书-漏洞信息管理系统.doc b/doc/软件设计规格说明书-漏洞信息管理系统.doc
similarity index 100%
rename from doc/(最终版)软件设计规格说明书-漏洞信息管理系统.doc
rename to doc/软件设计规格说明书-漏洞信息管理系统.doc
diff --git a/src/jiemian/guis/__pycache__/jiemian.cpython-36.pyc b/src/jiemian/guis/__pycache__/jiemian.cpython-36.pyc
deleted file mode 100644
index fb08700..0000000
Binary files a/src/jiemian/guis/__pycache__/jiemian.cpython-36.pyc and /dev/null differ
diff --git a/src/jiemian/guis/__pycache__/jiemian.cpython-37.pyc b/src/jiemian/guis/__pycache__/jiemian.cpython-37.pyc
deleted file mode 100644
index 01f5e53..0000000
Binary files a/src/jiemian/guis/__pycache__/jiemian.cpython-37.pyc and /dev/null differ
diff --git a/src/jiemian/guis/__pycache__/jiemian2.cpython-36.pyc b/src/jiemian/guis/__pycache__/jiemian2.cpython-36.pyc
deleted file mode 100644
index 9185e87..0000000
Binary files a/src/jiemian/guis/__pycache__/jiemian2.cpython-36.pyc and /dev/null differ
diff --git a/src/jiemian/guis/__pycache__/jiemian2.cpython-37.pyc b/src/jiemian/guis/__pycache__/jiemian2.cpython-37.pyc
deleted file mode 100644
index 961cfa7..0000000
Binary files a/src/jiemian/guis/__pycache__/jiemian2.cpython-37.pyc and /dev/null differ
diff --git a/src/jiemian/guis/__pycache__/jiemian3.cpython-36.pyc b/src/jiemian/guis/__pycache__/jiemian3.cpython-36.pyc
deleted file mode 100644
index 8e20287..0000000
Binary files a/src/jiemian/guis/__pycache__/jiemian3.cpython-36.pyc and /dev/null differ
diff --git a/src/jiemian/guis/__pycache__/jiemian3.cpython-37.pyc b/src/jiemian/guis/__pycache__/jiemian3.cpython-37.pyc
deleted file mode 100644
index 9239d13..0000000
Binary files a/src/jiemian/guis/__pycache__/jiemian3.cpython-37.pyc and /dev/null differ
diff --git a/src/jiemian/漏洞爬取统计检索.py b/src/jiemian/漏洞爬取统计检索.py
deleted file mode 100644
index e1a5a68..0000000
--- a/src/jiemian/漏洞爬取统计检索.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-import sys
-from PyQt5.QtWidgets import *
-from PyQt5.QtCore import *
-from PyQt5.QtGui import *
-from guis.jiemian import *
-from guis.jiemian2 import *
-from guis.jiemian3 import *
-
-
-class Window1(QMainWindow, Ui_MainWindow):
- def __init__(self, parent=None):
- super(Window1, self).__init__(parent)
- self.setupUi(self)
-
- self.pushButton_2.clicked.connect(self.w2)
- self.pushButton_3.clicked.connect(self.w3)
- def w2(self):
- self.window2=Window2()
- self.window2.show()
- def w3(self):
- self.window3=Window3(
- )
- self.window3.show()
-
-
-class Window2(QMainWindow, Ui_MainWindow2):
- def __init__(self, parent=None):
- super(Window2, self).__init__(parent)
- self.setupUi(self)
-
-class Window3(QMainWindow, Ui_MainWindow3):
- def __init__(self, parent=None):
- super(Window3, self).__init__(parent)
- self.setupUi(self)
-if __name__ == '__main__':
- QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
- app = QApplication(sys.argv)
- win = Window1()
- win.show()
- sys.exit(app.exec_())
diff --git a/src/漏洞爬取统计检索/captcha.png b/src/漏洞爬取统计检索/captcha.png
new file mode 100644
index 0000000..c150d59
--- /dev/null
+++ b/src/漏洞爬取统计检索/captcha.png
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
client: 117.136.89.114, server: ff72b00, time: 29/Nov/2021:22:00:44 +0800
+
+
+
+
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian.cpython-36.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian.cpython-36.pyc
new file mode 100644
index 0000000..8d58da9
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian.cpython-36.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian.cpython-37.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian.cpython-37.pyc
new file mode 100644
index 0000000..6305d10
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian.cpython-37.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian2.cpython-36.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian2.cpython-36.pyc
new file mode 100644
index 0000000..f9bdb2b
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian2.cpython-36.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian2.cpython-37.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian2.cpython-37.pyc
new file mode 100644
index 0000000..9952a03
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian2.cpython-37.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian3.cpython-36.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian3.cpython-36.pyc
new file mode 100644
index 0000000..f931013
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian3.cpython-36.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian3.cpython-37.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian3.cpython-37.pyc
new file mode 100644
index 0000000..ea21d67
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian3.cpython-37.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian4.cpython-36.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian4.cpython-36.pyc
new file mode 100644
index 0000000..ed5cc24
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian4.cpython-36.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian4.cpython-37.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian4.cpython-37.pyc
new file mode 100644
index 0000000..52616dd
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian4.cpython-37.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian5.cpython-36.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian5.cpython-36.pyc
new file mode 100644
index 0000000..ade5722
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian5.cpython-36.pyc differ
diff --git a/src/漏洞爬取统计检索/guis/__pycache__/jiemian5.cpython-37.pyc b/src/漏洞爬取统计检索/guis/__pycache__/jiemian5.cpython-37.pyc
new file mode 100644
index 0000000..5adec62
Binary files /dev/null and b/src/漏洞爬取统计检索/guis/__pycache__/jiemian5.cpython-37.pyc differ
diff --git a/src/jiemian/guis/jiemian.py b/src/漏洞爬取统计检索/guis/jiemian.py
similarity index 87%
rename from src/jiemian/guis/jiemian.py
rename to src/漏洞爬取统计检索/guis/jiemian.py
index 4b6e781..c9151ec 100644
--- a/src/jiemian/guis/jiemian.py
+++ b/src/漏洞爬取统计检索/guis/jiemian.py
@@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(800, 600)
+ MainWindow.resize(802, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
@@ -37,13 +37,17 @@ class Ui_MainWindow(object):
self.pushButton_3.setMinimumSize(QtCore.QSize(141, 51))
self.pushButton_3.setObjectName("pushButton_3")
self.horizontalLayout.addWidget(self.pushButton_3)
+ self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
+ self.pushButton_5.setObjectName("pushButton_5")
+ self.horizontalLayout.addWidget(self.pushButton_5)
self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setMinimumSize(QtCore.QSize(780, 0))
self.textEdit.setObjectName("textEdit")
self.gridLayout.addWidget(self.textEdit, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 802, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
@@ -59,3 +63,4 @@ class Ui_MainWindow(object):
self.pushButton.setText(_translate("MainWindow", "漏洞信息更新"))
self.pushButton_2.setText(_translate("MainWindow", "漏洞信息检索"))
self.pushButton_3.setText(_translate("MainWindow", "漏洞信息统计"))
+ self.pushButton_5.setText(_translate("MainWindow", "设置"))
diff --git a/src/jiemian/guis/jiemian.ui b/src/漏洞爬取统计检索/guis/jiemian.ui
similarity index 84%
rename from src/jiemian/guis/jiemian.ui
rename to src/漏洞爬取统计检索/guis/jiemian.ui
index 85ff5d3..e97aea5 100644
--- a/src/jiemian/guis/jiemian.ui
+++ b/src/漏洞爬取统计检索/guis/jiemian.ui
@@ -6,7 +6,7 @@
0
0
- 800
+ 802
600
@@ -82,10 +82,24 @@
+ -
+
+
+ 设置
+
+
+
-
-
+
+
+
+ 780
+ 0
+
+
+
@@ -94,8 +108,8 @@
0
0
- 800
- 22
+ 802
+ 26
diff --git a/src/jiemian/guis/jiemian2.py b/src/漏洞爬取统计检索/guis/jiemian2.py
similarity index 63%
rename from src/jiemian/guis/jiemian2.py
rename to src/漏洞爬取统计检索/guis/jiemian2.py
index 9e3a6bc..7b9cca0 100644
--- a/src/jiemian/guis/jiemian2.py
+++ b/src/漏洞爬取统计检索/guis/jiemian2.py
@@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow2(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(800, 600)
+ MainWindow.resize(804, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
@@ -24,92 +24,61 @@ class Ui_MainWindow2(object):
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setMinimumSize(QtCore.QSize(71, 41))
self.label.setMaximumSize(QtCore.QSize(16777215, 41))
- font = QtGui.QFont()
- font.setFamily("宋体")
- font.setPointSize(16)
- self.label.setFont(font)
+
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setMinimumSize(QtCore.QSize(131, 21))
self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 21))
- font = QtGui.QFont()
- font.setFamily("Times New Roman")
- font.setPointSize(16)
- self.lineEdit.setFont(font)
+
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setMinimumSize(QtCore.QSize(111, 41))
self.label_2.setMaximumSize(QtCore.QSize(16777215, 41))
- font = QtGui.QFont()
- font.setFamily("宋体")
- font.setPointSize(16)
- self.label_2.setFont(font)
+
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
self.dateEdit = QtWidgets.QDateEdit(self.centralwidget)
self.dateEdit.setMinimumSize(QtCore.QSize(111, 21))
self.dateEdit.setMaximumSize(QtCore.QSize(16777215, 21))
- font = QtGui.QFont()
- font.setFamily("Times New Roman")
- font.setPointSize(12)
- self.dateEdit.setFont(font)
+
self.dateEdit.setCalendarPopup(True)
self.dateEdit.setObjectName("dateEdit")
self.horizontalLayout.addWidget(self.dateEdit)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setMinimumSize(QtCore.QSize(111, 41))
self.label_3.setMaximumSize(QtCore.QSize(16777215, 41))
- font = QtGui.QFont()
- font.setFamily("宋体")
- font.setPointSize(16)
- self.label_3.setFont(font)
+
self.label_3.setObjectName("label_3")
self.horizontalLayout.addWidget(self.label_3)
self.dateEdit_2 = QtWidgets.QDateEdit(self.centralwidget)
self.dateEdit_2.setMinimumSize(QtCore.QSize(111, 21))
self.dateEdit_2.setMaximumSize(QtCore.QSize(16777215, 21))
- font = QtGui.QFont()
- font.setFamily("Times New Roman")
- font.setPointSize(12)
- self.dateEdit_2.setFont(font)
+
self.dateEdit_2.setCalendarPopup(True)
self.dateEdit_2.setObjectName("dateEdit_2")
self.horizontalLayout.addWidget(self.dateEdit_2)
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setMinimumSize(QtCore.QSize(102, 41))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- font.setBold(True)
- font.setWeight(75)
- self.label_4.setFont(font)
+
self.label_4.setObjectName("label_4")
self.horizontalLayout.addWidget(self.label_4)
+ self.pushButton = QtWidgets.QPushButton(self.centralwidget)
+ self.pushButton.setObjectName("pushButton")
+ self.horizontalLayout.addWidget(self.pushButton)
self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setObjectName("tableWidget")
- self.tableWidget.setColumnCount(6)
+ self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
- item = QtWidgets.QTableWidgetItem()
- self.tableWidget.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.tableWidget.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.tableWidget.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.tableWidget.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- self.tableWidget.setHorizontalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.tableWidget.setHorizontalHeaderItem(5, item)
self.tableWidget.horizontalHeader().setCascadingSectionResizes(False)
self.tableWidget.horizontalHeader().setSortIndicatorShown(False)
self.tableWidget.horizontalHeader().setStretchLastSection(False)
self.gridLayout.addWidget(self.tableWidget, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 804, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
@@ -125,16 +94,5 @@ class Ui_MainWindow2(object):
self.label.setText(_translate("MainWindow", "编号:"))
self.label_2.setText(_translate("MainWindow", "开始时间:"))
self.label_3.setText(_translate("MainWindow", "结束时间:"))
- self.label_4.setText(_translate("MainWindow", " 共:0条"))
- item = self.tableWidget.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "漏洞标题"))
- item = self.tableWidget.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "危害级别"))
- item = self.tableWidget.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "点击数"))
- item = self.tableWidget.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "评论"))
- item = self.tableWidget.horizontalHeaderItem(4)
- item.setText(_translate("MainWindow", "关注"))
- item = self.tableWidget.horizontalHeaderItem(5)
- item.setText(_translate("MainWindow", "时间"))
+ self.label_4.setText(_translate("MainWindow", " 共:0条"))
+ self.pushButton.setText(_translate("MainWindow", "查找"))
diff --git a/src/jiemian/guis/jiemian2.ui b/src/漏洞爬取统计检索/guis/jiemian2.ui
similarity index 87%
rename from src/jiemian/guis/jiemian2.ui
rename to src/漏洞爬取统计检索/guis/jiemian2.ui
index 665e728..278f568 100644
--- a/src/jiemian/guis/jiemian2.ui
+++ b/src/漏洞爬取统计检索/guis/jiemian2.ui
@@ -6,7 +6,7 @@
0
0
- 800
+ 804
600
@@ -180,7 +180,14 @@
- 共:0条
+ 共:0条
+
+
+
+ -
+
+
+ 查找
@@ -197,36 +204,6 @@
false
-
-
- 漏洞标题
-
-
-
-
- 危害级别
-
-
-
-
- 点击数
-
-
-
-
- 评论
-
-
-
-
- 关注
-
-
-
-
- 时间
-
-
@@ -236,7 +213,7 @@
0
0
- 800
+ 804
22
diff --git a/src/jiemian/guis/jiemian3.py b/src/漏洞爬取统计检索/guis/jiemian3.py
similarity index 88%
rename from src/jiemian/guis/jiemian3.py
rename to src/漏洞爬取统计检索/guis/jiemian3.py
index ac48e9a..06d11c8 100644
--- a/src/jiemian/guis/jiemian3.py
+++ b/src/漏洞爬取统计检索/guis/jiemian3.py
@@ -9,7 +9,7 @@
from PyQt5 import QtCore, QtGui, QtWidgets
-
+from PyQt5.QtChart import QChartView
class Ui_MainWindow3(object):
def setupUi(self, MainWindow):
@@ -67,6 +67,11 @@ class Ui_MainWindow3(object):
self.widget = QtWidgets.QWidget(self.tab)
self.widget.setMinimumSize(QtCore.QSize(731, 461))
self.widget.setObjectName("widget")
+ self.gridLayout_4 = QtWidgets.QGridLayout(self.widget)
+ self.gridLayout_4.setObjectName("gridLayout_4")
+ self.graphicsView = QChartView(self.widget)
+ self.graphicsView.setObjectName("graphicsView")
+ self.gridLayout_4.addWidget(self.graphicsView, 0, 0, 1, 1)
self.gridLayout_2.addWidget(self.widget, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
@@ -80,6 +85,9 @@ class Ui_MainWindow3(object):
self.comboBox_2.setMaximumSize(QtCore.QSize(100, 22))
self.comboBox_2.setObjectName("comboBox_2")
self.comboBox_2.addItem("")
+ self.comboBox_2.addItem("")
+ self.comboBox_2.addItem("")
+ self.comboBox_2.addItem("")
self.horizontalLayout_2.addWidget(self.comboBox_2)
self.label_3 = QtWidgets.QLabel(self.tab_2)
self.label_3.setMinimumSize(QtCore.QSize(54, 12))
@@ -115,6 +123,11 @@ class Ui_MainWindow3(object):
self.widget_2 = QtWidgets.QWidget(self.tab_2)
self.widget_2.setMinimumSize(QtCore.QSize(731, 461))
self.widget_2.setObjectName("widget_2")
+ self.gridLayout_5 = QtWidgets.QGridLayout(self.widget_2)
+ self.gridLayout_5.setObjectName("gridLayout_5")
+ self.graphicsView_2 = QChartView(self.widget_2)
+ self.graphicsView_2.setObjectName("graphicsView_2")
+ self.gridLayout_5.addWidget(self.graphicsView_2, 0, 0, 1, 1)
self.gridLayout_3.addWidget(self.widget_2, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
@@ -140,7 +153,11 @@ class Ui_MainWindow3(object):
self.pushButton_2.setText(_translate("MainWindow", "查询"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "漏洞分布"))
self.comboBox_2.setItemText(0, _translate("MainWindow", "全部"))
+ self.comboBox_2.setItemText(1, _translate("MainWindow", "高危"))
+ self.comboBox_2.setItemText(2, _translate("MainWindow", "中危"))
+ self.comboBox_2.setItemText(3, _translate("MainWindow", "低危"))
self.label_3.setText(_translate("MainWindow", "开始时间:"))
self.label_4.setText(_translate("MainWindow", "结束时间:"))
self.pushButton.setText(_translate("MainWindow", "查询"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "漏洞趋势图"))
+
diff --git a/src/jiemian/guis/jiemian3.ui b/src/漏洞爬取统计检索/guis/jiemian3.ui
similarity index 90%
rename from src/jiemian/guis/jiemian3.ui
rename to src/漏洞爬取统计检索/guis/jiemian3.ui
index 57b03ee..bc4d5dc 100644
--- a/src/jiemian/guis/jiemian3.ui
+++ b/src/漏洞爬取统计检索/guis/jiemian3.ui
@@ -159,6 +159,11 @@
461
+
+ -
+
+
+
@@ -189,6 +194,21 @@
全部
+ -
+
+ 高危
+
+
+ -
+
+ 中危
+
+
+ -
+
+ 低危
+
+
-
@@ -302,6 +322,11 @@
461
+
+
-
+
+
+
@@ -322,6 +347,13 @@
+
+
+ QChartView
+ QGraphicsView
+
+
+
diff --git a/src/漏洞爬取统计检索/guis/jiemian4.py b/src/漏洞爬取统计检索/guis/jiemian4.py
new file mode 100644
index 0000000..daf6109
--- /dev/null
+++ b/src/漏洞爬取统计检索/guis/jiemian4.py
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'jiemian4.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow4(object):
+ def setupUi(self, MainWindow4):
+ MainWindow4.setObjectName("MainWindow4")
+ MainWindow4.resize(802, 600)
+ self.centralwidget = QtWidgets.QWidget(MainWindow4)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
+ self.gridLayout.setObjectName("gridLayout")
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setMinimumSize(QtCore.QSize(61, 21))
+ self.label.setMaximumSize(QtCore.QSize(61, 21))
+
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+ self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
+ self.lineEdit.setMinimumSize(QtCore.QSize(71, 21))
+ self.lineEdit.setMaximumSize(QtCore.QSize(71, 21))
+ self.lineEdit.setObjectName("lineEdit")
+ self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
+ self.pushButton = QtWidgets.QPushButton(self.centralwidget)
+ self.pushButton.setMinimumSize(QtCore.QSize(61, 28))
+ self.pushButton.setMaximumSize(QtCore.QSize(61, 28))
+ self.pushButton.setObjectName("pushButton")
+ self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
+ self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
+ self.progressBar.setProperty("value", 0)
+ self.progressBar.setObjectName("progressBar")
+ self.gridLayout.addWidget(self.progressBar, 0, 3, 1, 1)
+ self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
+ self.pushButton_4.setObjectName("pushButton_4")
+ self.gridLayout.addWidget(self.pushButton_4, 0, 4, 1, 1)
+ self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
+ self.pushButton_5.setObjectName("pushButton_5")
+ self.gridLayout.addWidget(self.pushButton_5, 0, 5, 1, 1)
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setMinimumSize(QtCore.QSize(780, 0))
+ self.textEdit.setObjectName("textEdit")
+ self.gridLayout.addWidget(self.textEdit, 1, 0, 1, 6)
+ MainWindow4.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow4)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 802, 26))
+ self.menubar.setObjectName("menubar")
+ MainWindow4.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow4)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow4.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow4)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow4)
+
+ def retranslateUi(self, MainWindow4):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow4.setWindowTitle(_translate("MainWindow4", "漏洞管理系统"))
+ self.label.setText(_translate("MainWindow4", "验证码:"))
+ self.pushButton.setText(_translate("MainWindow4", "确定"))
+ self.pushButton_4.setText(_translate("MainWindow4", "开始"))
+ self.pushButton_5.setText(_translate("MainWindow4", "设置"))
diff --git a/src/漏洞爬取统计检索/guis/jiemian4.ui b/src/漏洞爬取统计检索/guis/jiemian4.ui
new file mode 100644
index 0000000..22fcbfd
--- /dev/null
+++ b/src/漏洞爬取统计检索/guis/jiemian4.ui
@@ -0,0 +1,125 @@
+
+
+ MainWindow4
+
+
+
+ 0
+ 0
+ 802
+ 600
+
+
+
+ 漏洞管理系统
+
+
+
+ -
+
+
+
+ 61
+ 21
+
+
+
+
+ 61
+ 21
+
+
+
+
+ 宋体
+ 9
+
+
+
+ 验证码:
+
+
+
+ -
+
+
+
+ 71
+ 21
+
+
+
+
+ 71
+ 21
+
+
+
+
+ -
+
+
+
+ 61
+ 28
+
+
+
+
+ 61
+ 28
+
+
+
+ 确定
+
+
+
+ -
+
+
+ 0
+
+
+
+ -
+
+
+ 开始
+
+
+
+ -
+
+
+ 设置
+
+
+
+ -
+
+
+
+ 780
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/漏洞爬取统计检索/guis/jiemian5.py b/src/漏洞爬取统计检索/guis/jiemian5.py
new file mode 100644
index 0000000..e28ea65
--- /dev/null
+++ b/src/漏洞爬取统计检索/guis/jiemian5.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'jiemian5.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow5(object):
+ def setupUi(self, MainWindow5):
+ MainWindow5.setObjectName("MainWindow5")
+ MainWindow5.resize(659, 714)
+ self.centralwidget = QtWidgets.QWidget(MainWindow5)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
+ self.gridLayout.setObjectName("gridLayout")
+ self.label = QtWidgets.QLabel(self.centralwidget)
+
+ self.label.setScaledContents(False)
+ self.label.setAlignment(QtCore.Qt.AlignCenter)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+ self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
+ self.tableWidget.setObjectName("tableWidget")
+ self.tableWidget.setColumnCount(0)
+ self.tableWidget.setRowCount(0)
+ self.gridLayout.addWidget(self.tableWidget, 1, 0, 1, 1)
+ MainWindow5.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow5)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 659, 26))
+ self.menubar.setObjectName("menubar")
+ MainWindow5.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow5)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow5.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow5)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow5)
+
+ def retranslateUi(self, MainWindow5):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow5.setWindowTitle(_translate("MainWindow5", "MainWindow"))
+ self.label.setText(_translate("MainWindow5", "漏洞名称"))
diff --git a/src/漏洞爬取统计检索/guis/jiemian5.ui b/src/漏洞爬取统计检索/guis/jiemian5.ui
new file mode 100644
index 0000000..e72f068
--- /dev/null
+++ b/src/漏洞爬取统计检索/guis/jiemian5.ui
@@ -0,0 +1,56 @@
+
+
+ MainWindow5
+
+
+
+ 0
+ 0
+ 659
+ 714
+
+
+
+ MainWindow
+
+
+
+ -
+
+
+
+ 楷体
+ 24
+
+
+
+ 漏洞名称
+
+
+ false
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
diff --git a/src/漏洞爬取统计检索/pythonProject/__pycache__/main.cpython-36.pyc b/src/漏洞爬取统计检索/pythonProject/__pycache__/main.cpython-36.pyc
new file mode 100644
index 0000000..cd485ef
Binary files /dev/null and b/src/漏洞爬取统计检索/pythonProject/__pycache__/main.cpython-36.pyc differ
diff --git a/src/漏洞爬取统计检索/pythonProject/__pycache__/main.cpython-37.pyc b/src/漏洞爬取统计检索/pythonProject/__pycache__/main.cpython-37.pyc
new file mode 100644
index 0000000..b1aaaba
Binary files /dev/null and b/src/漏洞爬取统计检索/pythonProject/__pycache__/main.cpython-37.pyc differ
diff --git a/src/漏洞爬取统计检索/pythonProject/captcha.png b/src/漏洞爬取统计检索/pythonProject/captcha.png
new file mode 100644
index 0000000..efec7c5
Binary files /dev/null and b/src/漏洞爬取统计检索/pythonProject/captcha.png differ
diff --git a/src/漏洞爬取统计检索/pythonProject/geckodriver.log b/src/漏洞爬取统计检索/pythonProject/geckodriver.log
new file mode 100644
index 0000000..e69de29
diff --git a/src/漏洞爬取统计检索/pythonProject/main.py b/src/漏洞爬取统计检索/pythonProject/main.py
new file mode 100644
index 0000000..0c9a28c
--- /dev/null
+++ b/src/漏洞爬取统计检索/pythonProject/main.py
@@ -0,0 +1,455 @@
+import threading
+import requests
+from lxml import etree
+from PIL import Image
+import xlsxwriter
+from requests.utils import add_dict_to_cookiejar
+import execjs
+import hashlib
+import json
+import re
+import time
+import random
+
+
+def get_UserAgents():
+ UserAgents = [
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
+ "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
+ "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
+ "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
+ "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
+ "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
+ "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12",
+ "Opera/9.27 (Windows NT 5.2; U; zh-cn)",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13",
+ "Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 ",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 ",
+ "Mozilla/5.0 (Linux; U; Android 3.2; ja-jp; F-01D Build/F0001) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 ",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 ",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.9 (KHTML, like Gecko) Chrome/ Safari/530.9 ",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
+ ]
+ UserAgent = random.choice(UserAgents)
+ return UserAgent
+
+
+session = requests.session()
+session_ = requests.session()
+link_list = []
+
+
+class myThread(threading.Thread):
+ def __init__(self, threadID, name, counter, flag):
+ threading.Thread.__init__(self)
+ self.threadID = threadID
+ self.name = name
+ self.counter = counter
+ self.flag = flag
+
+ def run(self):
+ spider(self.flag)
+
+
+def get_proxy():
+ proxy = session_.get("http://127.0.0.1:5010/get/").json().get("proxy")
+ print(proxy)
+ return {"http": "http://{}".format(proxy)}
+
+
+
+def login(email, password):
+ response = session.get('https://www.cnvd.org.cn/user/aesEncrypt?password=' + password)
+ passwd = re.findall(r'"data":"(.*?)\\r\\n"', response.text)[0]
+ captcha = get_captcha()
+ session.headers.update({
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
+ 'Accept-Encoding': 'gzip,deflate,br',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0',
+ 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Cache-Control': 'max-age=0',
+ 'Connection': 'keep-alive',
+ 'Host': 'www.cnvd.org.cn',
+ 'Origin': 'https://www.cnvd.org.cn',
+ 'Referer': 'https://www.cnvd.org.cn/user/login',
+ 'Upgrade-Insecure-Requests': '1',
+ 'Sec-Fetch-Dest': 'document',
+ 'Sec-Fetch-Mode': 'navigate',
+ 'Sec-Fetch-Site': 'same-origin',
+ 'Sec-Fetch-User': '?1'
+ })
+ form = {
+ 'email': email,
+ 'passwordHidden': passwd,
+ 'myCode': captcha
+ }
+ r = session.post('https://www.cnvd.org.cn/user/doLogin/loginForm', data=form)
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', r.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0]
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+ r = session.post('https://www.cnvd.org.cn/user/doLogin/loginForm', data=form)
+ data = json.loads(re.findall(r';go\((.*?)\)', r.text)[0])
+ jsl_clearance_s = get__jsl_clearance_s(data)
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+ r = session.post('https://www.cnvd.org.cn/user/doLogin/loginForm', data=form)
+ session.cookies.update(r.cookies)
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', r.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s))
+ add_dict_to_cookiejar(session.cookies, {'__jsluid_h': jsl_clearance_s})
+ r = session.get('https://www.cnvd.org.cn/user/reportManage')
+ print(r.text)
+ return 0
+
+
+def get_captcha():
+ image = Image.open('captcha.png')
+ image.show()
+ captcha = input("验证码:")
+ return captcha
+
+
+def get__jsl_clearance_s(data):
+ """
+ 通过加密对比得到正确cookie参数
+ :param data: 参数
+ :return: 返回正确cookie参数
+ """
+ chars = len(data['chars'])
+ for i in range(chars):
+ for j in range(chars):
+ __jsl_clearance_s = data['bts'][0] + data['chars'][i] + data['chars'][j] + data['bts'][1]
+ encrypt = None
+ if data['ha'] == 'md5':
+ encrypt = hashlib.md5()
+ elif data['ha'] == 'sha1':
+ encrypt = hashlib.sha1()
+ elif data['ha'] == 'sha256':
+ encrypt = hashlib.sha256()
+ encrypt.update(__jsl_clearance_s.encode())
+ result = encrypt.hexdigest()
+ if result == data['ct']:
+ return __jsl_clearance_s
+
+
+def setCookie(url):
+ response1 = session.get(url)
+
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', response1.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0]
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+
+ response2 = session.get(url)
+ data = json.loads(re.findall(r';go\((.*?)\)', response2.text)[0])
+ jsl_clearance_s = get__jsl_clearance_s(data)
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+ response3 = session.get(url)
+ with open('captcha.png', 'wb') as f:
+ f.write(response3.content)
+
+
+class CNVD(object):
+ def __init__(self):
+ self.host_url = "https://www.cnvd.org.cn"
+ self.base_url1 = "https://www.cnvd.org.cn/flaw/list?max={}&offset={}"
+ self.base_url2 = "https://www.cnvd.org.cn/webinfo/list?type=2&max={}&offset={}"
+
+ def get_list_page(self, max_page, max, flag):
+ """
+ 获取列表页html内容
+ Arguments: max_page {[int]} -- [最大分页页码]
+ """
+ for page in range(max_page):
+ print("正在采集第<%s>页" % str(page + 1))
+ time.sleep(5)
+ offset = (page) * max
+ if flag == 1:
+ url = self.base_url1.format(max, offset)
+ else:
+ url = self.base_url2.format(max, offset)
+ response = session.get(url=url)
+ time.sleep(3)
+ content = response.text
+
+ yield content
+
+ def parse_list_page(self, content):
+ """
+ 获取列表页中的详情页href,返回href列表
+ Arguments:
+ content {[str]} -- [列表页html内容]
+ Returns:
+ [list] -- [详情页href列表]
+ """
+ html = etree.HTML(content)
+ href_list = html.xpath("//tbody/tr/td//a/@href")
+ return href_list
+
+ def handle_str(self, td_list):
+ """
+ 字符串去除空格\r\n\t等字符
+ Arguments:
+ td_list {[list]} -- [获取文本的列表]
+ Returns:
+ [type] -- [返回处理后的合并文本]
+ """
+ result = ''
+ for td_str in td_list[1:]:
+ result += td_str.strip()
+
+ result = "".join(result.split())
+
+ # 去除"危害级别"中的括号
+ if result.endswith("()"):
+ result = result[:-2]
+
+ return result
+
+ def parse_detail_page1(self, content):
+ """
+ 从详情页中提取信息
+ Arguments:
+ content {[str]} -- [详情页html内容]
+ Returns:
+ [dict] -- [提取信息字典]
+ """
+
+ html = etree.HTML(content)
+ # print(content)
+ item = {}
+ if "请检查您的操作是否正确!您访问的资源不存在或已被删除" in content:
+ return item
+ # print(html.xpath("//div[@class='blkContainerPblk']//div[@class='blkContainerSblk']//h1/text()")[0])
+ item['漏洞名称'] = '' if len(
+ html.xpath("//div[@class='blkContainerPblk']//div[@class='blkContainerSblk']//h1/text()")) == 0 else \
+ html.xpath("//div[@class='blkContainerPblk']//div[@class='blkContainerSblk']//h1/text()")[0]
+
+ tr_list = html.xpath("//div[@class='tableDiv']//table[@class='gg_detail']//tbody/tr")
+ # print(tr_list)
+ tr_list.pop(-1)
+ for tr in tr_list:
+ td_list = tr.xpath("./td/text()|./td/a/text()")
+ item[td_list[0]] = self.handle_str(td_list)
+ # print(item)
+ return item
+
+ def parse_detail_page2(self, content):
+ """
+ 从爬取到的一条新闻页中提取具体的新闻内容
+ Arguments:
+ content {[str]} -- [详情页html内容]
+ Returns:
+ [dict] -- [提取信息字典]
+ """
+ html = etree.HTML(content)
+ item = {}
+ item['新闻标题'] = '' if len(
+ html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']/h1/text()")) == 0 else \
+ html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']/h1/text()")[0]
+ item['发布时间'] = '' if len(html.xpath(
+ "//div[@class='blkContainer']//div[@class='blkContainerSblk']//div[@ class='artInfo']/text()")) == 0 else \
+ html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']//div[@ class='artInfo']/text()")[0]
+ tmp_str = '' if len(html.xpath(
+ "//div[@class='blkContainer']//div[@class='blkContainerSblk']//div [@ class='blkContainerSblkCon clearfix']/p/text()")) == 0 else \
+ html.xpath(
+ "//div [@ class='blkContainerSblkCon clearfix']/p/text() | //div[@class='blkContainerSblkCon clearfix']/p/span/text()")
+ # print(self.handle_str(tmp_str)[:-5])
+ item['新闻内容'] = self.handle_str(tmp_str)[:-5]
+ tr_list = html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']")
+ for tr in tr_list:
+ td_list = tr.xpath(
+ "./div[@class='blkContainerSblkCon clearfix']/p/text()|./div[@class='blkContainerSblkCon clearfix']/p/a//text()")
+ # print(td_list)
+ if '参考链接:' in td_list[-1]:
+ item['参考链接'] = td_list[-1][5:]
+ item['新闻内容'] = td_list[0]
+ elif '参考链接:' in td_list:
+ item['新闻内容'] = td_list[0]
+ item['参考链接'] = td_list[-1]
+ else:
+ item['参考链接'] = td_list[-1]
+ # print(item)
+ return item
+
+ def get_detail_info(self, href, flag):
+ """
+ 通过详情页href,获取详情页html内容
+ Arguments:
+ href {[str]} -- [详情页href]
+ Returns:
+ [调用详情页解析函数] -- [提取信息]
+ """
+ url = self.host_url + href
+ print("正在采集详情页<%s>" % url)
+ if url == "https://www.cnvd.org.cn/flaw/show/":
+ return {}
+ __session = requests.session()
+ headers = {'User-Agent': get_UserAgents()}
+
+ try:
+ proxy = get_proxy()
+ response1 = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response1 = __session.get(url=url, headers=headers)
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', response1.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0]
+ add_dict_to_cookiejar(__session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+
+ try:
+ response2 = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response2 = __session.get(url=url, headers=headers)
+ data = json.loads(re.findall(r';go\((.*?)\)', response2.text)[0])
+ jsl_clearance_s = get__jsl_clearance_s(data)
+ add_dict_to_cookiejar(__session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+
+ try:
+ response = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response = __session.get(url=url, headers=headers)
+ while "您访问频率太高,请稍候再试。" in response.content.decode():
+ time.sleep(3)
+ __session.close()
+ return self.get_detail_info(href, flag)
+ print(response.content.decode())
+ try:
+ response = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response = __session.get(url=url, headers=headers)
+ time.sleep(1)
+ __session.close()
+
+ if flag == 1:
+ return self.parse_detail_page1(response.content.decode())
+ elif flag == 2:
+ return self.parse_detail_page2(response.content.decode())
+
+
+def vulnerability_xlsx1(vlist):
+ workbook = xlsxwriter.Workbook('vulnerabilities_data1.xlsx')
+ worksheet = workbook.add_worksheet()
+
+ column_names = ['漏洞名称', 'CNVD-ID', '公开日期', '危害级别', 'CVE ID', '漏洞描述', '漏洞类型', '参考链接', '厂商补丁', '来源链接', '影响产品']
+ for i in range(len(column_names)):
+ worksheet.write(0, i, column_names[i])
+
+ for i in range(len(vlist)):
+ for j in range(len(column_names)):
+ worksheet.write(i + 1, j, vlist[i][column_names[j]] if column_names[j] in vlist[i].keys() else '')
+
+ workbook.close()
+
+
+def vulnerability_xlsx2(vlist):
+ workbook = xlsxwriter.Workbook('vulnerabilities_data2.xlsx')
+ worksheet = workbook.add_worksheet()
+
+ column0_names = ['新闻标题', '发布时间', '新闻内容', '参考链接']
+ for i in range(len(column0_names)):
+ worksheet.write(0, i, column0_names[i])
+ for i in range(len(vlist)):
+ for j in range(len(column0_names)):
+ worksheet.write(i + 1, j, vlist[i][column0_names[j]] if column0_names[j] in vlist[i].keys() else '')
+
+ workbook.close()
+
+
+def spider(flag):
+ if flag == 1:
+ spider1()
+ elif flag == 2:
+ spider2()
+
+
+def spider1():
+ vlist = []
+ cnvd = CNVD()
+ max_page = 10
+ max = 100
+ content_generator = cnvd.get_list_page(max_page, max, 1)
+ tmp = []
+ for content in content_generator:
+ href_list = cnvd.parse_list_page(content)
+ for href in href_list:
+ link_list.append(href)
+ item = cnvd.get_detail_info(href, 1)
+ vlist.append(item)
+ vulnerability_xlsx1(vlist)
+
+
+def spider2():
+ vlist = []
+ cnvd = CNVD()
+ max_page = 1
+ max = 10
+ content_generator = cnvd.get_list_page(max_page, max, 2)
+ for content in content_generator:
+ href_list = cnvd.parse_list_page(content)
+ for href in href_list:
+ item = cnvd.get_detail_info(href, 2)
+ vlist.append(item)
+ vulnerability_xlsx2(vlist)
+
+
+def check_new():
+ cnvd = CNVD()
+ max_page = 10
+ max = 100
+ content_generator = cnvd.get_list_page(max_page, max, 1)
+ for content in content_generator:
+ href_list = cnvd.parse_list_page(content)
+ # print(href_list)
+ if href_list[0] not in link_list:
+ return True
+ else:
+ return False
+
+def pachon():
+ setCookie('https://www.cnvd.org.cn/common/myCodeNew')
+ login('lijieshi18@163.com', 'ig-srd8C24jPMgk')
+ threads = []
+ # 创建新线程
+ thread1 = myThread(1, "Thread-1", 1, 1)
+ thread2 = myThread(2, "Thread-2", 2, 2)
+ # 开启新线程
+ thread1.start()
+ thread2.start()
+ # 添加线程到线程列表
+ threads.append(thread1)
+ threads.append(thread2)
+ # 等待所有线程完成
+ for t in threads:
+ t.join()
+ while 1:
+ time.sleep(3600)
+ if check_new():
+ thread1 = myThread(1, "Thread-1", 1, 1)
+ thread2 = myThread(2, "Thread-2", 2, 2)
+ thread1.start()
+ thread2.start()
+ threads.append(thread1)
+ for t in threads:
+ t.join()
+if __name__ == "__main__":
+ pachon()
+
diff --git a/src/漏洞爬取统计检索/pythonProject/vulnerabilities_data1.xlsx b/src/漏洞爬取统计检索/pythonProject/vulnerabilities_data1.xlsx
new file mode 100644
index 0000000..c0a9086
Binary files /dev/null and b/src/漏洞爬取统计检索/pythonProject/vulnerabilities_data1.xlsx differ
diff --git a/src/漏洞爬取统计检索/数据.xlsx b/src/漏洞爬取统计检索/数据.xlsx
new file mode 100644
index 0000000..a5e5ea0
Binary files /dev/null and b/src/漏洞爬取统计检索/数据.xlsx differ
diff --git a/src/漏洞爬取统计检索/漏洞爬取统计检索.py b/src/漏洞爬取统计检索/漏洞爬取统计检索.py
new file mode 100644
index 0000000..95f6b2d
--- /dev/null
+++ b/src/漏洞爬取统计检索/漏洞爬取统计检索.py
@@ -0,0 +1,818 @@
+# -*- coding: utf-8 -*-
+import os
+import sys
+import sys
+
+from PyQt5.QtWidgets import QApplication, QMainWindow
+from PyQt5.QtChart import QChart, QChartView, QPieSeries, QPieSlice,QLineSeries
+from PyQt5.QtGui import QPainter, QPen
+from PyQt5.QtCore import Qt
+
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import *
+from PyQt5.QtChart import *
+import xlwt
+import xlrd
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from guis.jiemian import *
+from guis.jiemian2 import *
+from guis.jiemian3 import *
+from guis.jiemian4 import *
+from guis.jiemian5 import *
+from pythonProject.main import pachon
+import time
+import sys
+from PyQt5 import QtWidgets, QtCore
+from PyQt5.QtCore import QThread
+import threading
+import requests
+from lxml import etree
+from PIL import Image
+import xlsxwriter
+from requests.utils import add_dict_to_cookiejar
+import execjs
+import hashlib
+import json
+import re
+import time
+import random
+
+
+def get_UserAgents():
+ UserAgents = [
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
+ "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
+ "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
+ "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
+ "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
+ "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
+ "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
+ "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
+ "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12",
+ "Opera/9.27 (Windows NT 5.2; U; zh-cn)",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13",
+ "Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 ",
+ "Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 ",
+ "Mozilla/5.0 (Linux; U; Android 3.2; ja-jp; F-01D Build/F0001) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 ",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7",
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 ",
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.9 (KHTML, like Gecko) Chrome/ Safari/530.9 ",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
+ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
+ ]
+ UserAgent = random.choice(UserAgents)
+ return UserAgent
+
+
+session = requests.session()
+session_ = requests.session()
+link_list = []
+
+
+class myThread(threading.Thread):
+ def __init__(self, threadID, name, counter, flag):
+ threading.Thread.__init__(self)
+ self.threadID = threadID
+ self.name = name
+ self.counter = counter
+ self.flag = flag
+
+ def run(self):
+ spider(self.flag)
+
+
+def get_proxy():
+ proxy = session_.get("http://127.0.0.1:5010/get/").json().get("proxy")
+ print(proxy)
+ return {"http": "http://{}".format(proxy)}
+
+
+
+def login(email, password):
+ response = session.get('https://www.cnvd.org.cn/user/aesEncrypt?password=' + password)
+ passwd = re.findall(r'"data":"(.*?)\\r\\n"', response.text)[0]
+ captcha = get_captcha()
+ session.headers.update({
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
+ 'Accept-Encoding': 'gzip,deflate,br',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0',
+ 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Cache-Control': 'max-age=0',
+ 'Connection': 'keep-alive',
+ 'Host': 'www.cnvd.org.cn',
+ 'Origin': 'https://www.cnvd.org.cn',
+ 'Referer': 'https://www.cnvd.org.cn/user/login',
+ 'Upgrade-Insecure-Requests': '1',
+ 'Sec-Fetch-Dest': 'document',
+ 'Sec-Fetch-Mode': 'navigate',
+ 'Sec-Fetch-Site': 'same-origin',
+ 'Sec-Fetch-User': '?1'
+ })
+ form = {
+ 'email': email,
+ 'passwordHidden': passwd,
+ 'myCode': captcha
+ }
+ r = session.post('https://www.cnvd.org.cn/user/doLogin/loginForm', data=form)
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', r.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0]
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+ r = session.post('https://www.cnvd.org.cn/user/doLogin/loginForm', data=form)
+ data = json.loads(re.findall(r';go\((.*?)\)', r.text)[0])
+ jsl_clearance_s = get__jsl_clearance_s(data)
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+ r = session.post('https://www.cnvd.org.cn/user/doLogin/loginForm', data=form)
+ session.cookies.update(r.cookies)
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', r.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s))
+ add_dict_to_cookiejar(session.cookies, {'__jsluid_h': jsl_clearance_s})
+ r = session.get('https://www.cnvd.org.cn/user/reportManage')
+ print(r.text)
+ return 0
+
+
+def get_captcha():
+ image = Image.open('captcha.png')
+ image.show()
+ captcha = input("验证码:")
+ return captcha
+
+
+def get__jsl_clearance_s(data):
+ """
+ 通过加密对比得到正确cookie参数
+ :param data: 参数
+ :return: 返回正确cookie参数
+ """
+ chars = len(data['chars'])
+ for i in range(chars):
+ for j in range(chars):
+ __jsl_clearance_s = data['bts'][0] + data['chars'][i] + data['chars'][j] + data['bts'][1]
+ encrypt = None
+ if data['ha'] == 'md5':
+ encrypt = hashlib.md5()
+ elif data['ha'] == 'sha1':
+ encrypt = hashlib.sha1()
+ elif data['ha'] == 'sha256':
+ encrypt = hashlib.sha256()
+ encrypt.update(__jsl_clearance_s.encode())
+ result = encrypt.hexdigest()
+ if result == data['ct']:
+ return __jsl_clearance_s
+
+
+def setCookie(url):
+ response1 = session.get(url)
+
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', response1.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0]
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+
+ response2 = session.get(url)
+ data = json.loads(re.findall(r';go\((.*?)\)', response2.text)[0])
+ jsl_clearance_s = get__jsl_clearance_s(data)
+ add_dict_to_cookiejar(session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+ response3 = session.get(url)
+ with open('captcha.png', 'wb') as f:
+ f.write(response3.content)
+
+
+class CNVD(object):
+ def __init__(self):
+ self.host_url = "https://www.cnvd.org.cn"
+ self.base_url1 = "https://www.cnvd.org.cn/flaw/list?max={}&offset={}"
+ self.base_url2 = "https://www.cnvd.org.cn/webinfo/list?type=2&max={}&offset={}"
+
+ def get_list_page(self, max_page, max, flag):
+ """
+ 获取列表页html内容
+ Arguments: max_page {[int]} -- [最大分页页码]
+ """
+ for page in range(max_page):
+ print("正在采集第<%s>页" % str(page + 1))
+ time.sleep(5)
+ offset = (page) * max
+ if flag == 1:
+ url = self.base_url1.format(max, offset)
+ else:
+ url = self.base_url2.format(max, offset)
+ response = session.get(url=url)
+ time.sleep(3)
+ content = response.text
+ yield content
+
+ def parse_list_page(self, content):
+ """
+ 获取列表页中的详情页href,返回href列表
+ Arguments:
+ content {[str]} -- [列表页html内容]
+ Returns:
+ [list] -- [详情页href列表]
+ """
+ html = etree.HTML(content)
+ href_list = html.xpath("//tbody/tr/td//a/@href")
+ return href_list
+
+ def handle_str(self, td_list):
+ """
+ 字符串去除空格\r\n\t等字符
+ Arguments:
+ td_list {[list]} -- [获取文本的列表]
+ Returns:
+ [type] -- [返回处理后的合并文本]
+ """
+ result = ''
+ for td_str in td_list[1:]:
+ result += td_str.strip()
+
+ result = "".join(result.split())
+
+ # 去除"危害级别"中的括号
+ if result.endswith("()"):
+ result = result[:-2]
+
+ return result
+
+ def parse_detail_page1(self, content):
+ """
+ 从详情页中提取信息
+ Arguments:
+ content {[str]} -- [详情页html内容]
+ Returns:
+ [dict] -- [提取信息字典]
+ """
+
+ html = etree.HTML(content)
+ # print(content)
+ item = {}
+ if "请检查您的操作是否正确!您访问的资源不存在或已被删除" in content:
+ return item
+ # print(html.xpath("//div[@class='blkContainerPblk']//div[@class='blkContainerSblk']//h1/text()")[0])
+ item['漏洞名称'] = '' if len(
+ html.xpath("//div[@class='blkContainerPblk']//div[@class='blkContainerSblk']//h1/text()")) == 0 else \
+ html.xpath("//div[@class='blkContainerPblk']//div[@class='blkContainerSblk']//h1/text()")[0]
+
+ tr_list = html.xpath("//div[@class='tableDiv']//table[@class='gg_detail']//tbody/tr")
+ # print(tr_list)
+ tr_list.pop(-1)
+ for tr in tr_list:
+ td_list = tr.xpath("./td/text()|./td/a/text()")
+ item[td_list[0]] = self.handle_str(td_list)
+ # print(item)
+ return item
+
+ def parse_detail_page2(self, content):
+ """
+ 从爬取到的一条新闻页中提取具体的新闻内容
+ Arguments:
+ content {[str]} -- [详情页html内容]
+ Returns:
+ [dict] -- [提取信息字典]
+ """
+ html = etree.HTML(content)
+ item = {}
+ item['新闻标题'] = '' if len(
+ html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']/h1/text()")) == 0 else \
+ html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']/h1/text()")[0]
+ item['发布时间'] = '' if len(html.xpath(
+ "//div[@class='blkContainer']//div[@class='blkContainerSblk']//div[@ class='artInfo']/text()")) == 0 else \
+ html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']//div[@ class='artInfo']/text()")[0]
+ tmp_str = '' if len(html.xpath(
+ "//div[@class='blkContainer']//div[@class='blkContainerSblk']//div [@ class='blkContainerSblkCon clearfix']/p/text()")) == 0 else \
+ html.xpath(
+ "//div [@ class='blkContainerSblkCon clearfix']/p/text() | //div[@class='blkContainerSblkCon clearfix']/p/span/text()")
+ # print(self.handle_str(tmp_str)[:-5])
+ item['新闻内容'] = self.handle_str(tmp_str)[:-5]
+ tr_list = html.xpath("//div[@class='blkContainer']//div[@class='blkContainerSblk']")
+ for tr in tr_list:
+ td_list = tr.xpath(
+ "./div[@class='blkContainerSblkCon clearfix']/p/text()|./div[@class='blkContainerSblkCon clearfix']/p/a//text()")
+ # print(td_list)
+ if '参考链接:' in td_list[-1]:
+ item['参考链接'] = td_list[-1][5:]
+ item['新闻内容'] = td_list[0]
+ elif '参考链接:' in td_list:
+ item['新闻内容'] = td_list[0]
+ item['参考链接'] = td_list[-1]
+ else:
+ item['参考链接'] = td_list[-1]
+ # print(item)
+ return item
+
+ def get_detail_info(self, href, flag):
+ """
+ 通过详情页href,获取详情页html内容
+ Arguments:
+ href {[str]} -- [详情页href]
+ Returns:
+ [调用详情页解析函数] -- [提取信息]
+ """
+ url = self.host_url + href
+ print("正在采集详情页<%s>" % url)
+ if url == "https://www.cnvd.org.cn/flaw/show/":
+ return {}
+ __session = requests.session()
+ headers = {'User-Agent': get_UserAgents()}
+
+ try:
+ proxy = get_proxy()
+ response1 = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response1 = __session.get(url=url, headers=headers)
+ jsl_clearance_s = re.findall(r'cookie=(.*?);location', response1.text)[0]
+ jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0]
+ add_dict_to_cookiejar(__session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+
+ try:
+ response2 = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response2 = __session.get(url=url, headers=headers)
+ data = json.loads(re.findall(r';go\((.*?)\)', response2.text)[0])
+ jsl_clearance_s = get__jsl_clearance_s(data)
+ add_dict_to_cookiejar(__session.cookies, {'__jsl_clearance_s': jsl_clearance_s})
+
+ try:
+ response = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response = __session.get(url=url, headers=headers)
+ while "您访问频率太高,请稍候再试。" in response.content.decode():
+ time.sleep(3)
+ __session.close()
+ return self.get_detail_info(href, flag)
+ print(response.content.decode())
+ try:
+ response = __session.get(url=url, headers=headers, proxies=proxy)
+ except:
+ response = __session.get(url=url, headers=headers)
+ time.sleep(1)
+ __session.close()
+ if flag == 1:
+ return self.parse_detail_page1(response.content.decode())
+ elif flag == 2:
+ return self.parse_detail_page2(response.content.decode())
+
+
+def vulnerability_xlsx1(vlist):
+ workbook = xlsxwriter.Workbook('vulnerabilities_data1.xlsx')
+ worksheet = workbook.add_worksheet()
+
+ column_names = ['漏洞名称', 'CNVD-ID', '公开日期', '危害级别', 'CVE ID', '漏洞描述', '漏洞类型', '参考链接', '厂商补丁', '来源链接', '影响产品']
+ for i in range(len(column_names)):
+ worksheet.write(0, i, column_names[i])
+
+ for i in range(len(vlist)):
+ for j in range(len(column_names)):
+ worksheet.write(i + 1, j, vlist[i][column_names[j]] if column_names[j] in vlist[i].keys() else '')
+
+ workbook.close()
+
+
+def vulnerability_xlsx2(vlist):
+ workbook = xlsxwriter.Workbook('vulnerabilities_data2.xlsx')
+ worksheet = workbook.add_worksheet()
+
+ column0_names = ['新闻标题', '发布时间', '新闻内容', '参考链接']
+ for i in range(len(column0_names)):
+ worksheet.write(0, i, column0_names[i])
+ for i in range(len(vlist)):
+ for j in range(len(column0_names)):
+ worksheet.write(i + 1, j, vlist[i][column0_names[j]] if column0_names[j] in vlist[i].keys() else '')
+
+ workbook.close()
+
+
+def spider(flag):
+ if flag == 1:
+ spider1()
+ elif flag == 2:
+ spider2()
+
+
+def spider1():
+ vlist = []
+ cnvd = CNVD()
+ max_page = 10
+ max = 100
+ content_generator = cnvd.get_list_page(max_page, max, 1)
+ tmp = []
+ for content in content_generator:
+ href_list = cnvd.parse_list_page(content)
+ for href in href_list:
+ link_list.append(href)
+ item = cnvd.get_detail_info(href, 1)
+ vlist.append(item)
+ vulnerability_xlsx1(vlist)
+
+
+def spider2():
+ vlist = []
+ cnvd = CNVD()
+ max_page = 1
+ max = 10
+ content_generator = cnvd.get_list_page(max_page, max, 2)
+ for content in content_generator:
+ href_list = cnvd.parse_list_page(content)
+ for href in href_list:
+ item = cnvd.get_detail_info(href, 2)
+ vlist.append(item)
+ vulnerability_xlsx2(vlist)
+
+
+def check_new():
+ cnvd = CNVD()
+ max_page = 10
+ max = 100
+ content_generator = cnvd.get_list_page(max_page, max, 1)
+ for content in content_generator:
+ href_list = cnvd.parse_list_page(content)
+ # print(href_list)
+ if href_list[0] not in link_list:
+ return True
+ else:
+ return False
+
+def pachon():
+ setCookie('https://www.cnvd.org.cn/common/myCodeNew')
+ login('lijieshi18@163.com', 'ig-srd8C24jPMgk')
+ threads = []
+ # 创建新线程
+ thread1 = myThread(1, "Thread-1", 1, 1)
+ thread2 = myThread(2, "Thread-2", 2, 2)
+ # 开启新线程
+ thread1.start()
+ thread2.start()
+ # 添加线程到线程列表
+ threads.append(thread1)
+ threads.append(thread2)
+ # 等待所有线程完成
+ for t in threads:
+ t.join()
+ while 1:
+ time.sleep(3600)
+ if check_new():
+ thread1 = myThread(1, "Thread-1", 1, 1)
+ thread2 = myThread(2, "Thread-2", 2, 2)
+ thread1.start()
+ thread2.start()
+ threads.append(thread1)
+ for t in threads:
+ t.join()
+
+
+class One_Thread(QThread):
+ """
+ 多线程应用:开启多线程,在主界面调用线程开启主界面的函数,放卡死
+ """
+ signal = QtCore.pyqtSignal(str) # str int 都可以
+
+ # *args:列表参数**kwargs:字典参数
+ def __init__(self, *args, **kwargs):
+ super(One_Thread, self).__init__()
+ self.main_win = kwargs.get('main_win') # 获取主函数对象
+ self.signal.connect(self.refresh) # 调用返回的数据
+
+
+ def run(self):
+
+ pachon()
+
+ def refresh(self, m):
+ self.main_win.line_edit.setText(str(m))
+
+
+
+
+class Window1(QMainWindow, Ui_MainWindow):
+ def __init__(self, parent=None):
+ super(Window1, self).__init__(parent)
+ self.setupUi(self)
+ self.textEdit.append('>>欢迎使用本系统')
+ self.pushButton.clicked.connect(self.w1)
+ self.pushButton_2.clicked.connect(self.w2)
+ self.pushButton_3.clicked.connect(self.w3)
+
+ self.pushButton_5.clicked.connect(self.setting_time)
+ def setting_time(self):
+ #设置时间
+ value, ok = QInputDialog.getText(self, "输入更新时间", "时间:00:00\n\n请输入时间:", QLineEdit.Normal, "00:00")
+ def w1(self):
+ self.window1 = Window4()
+ self.window1.show()
+
+
+ def w2(self):
+ self.window2=Window2()
+ self.window2.show()
+ def w3(self):
+ self.window3=Window3(
+ )
+ self.window3.show()
+
+
+def read_excel(path):
+ #读取excel
+ datas = []
+ workBook = xlrd.open_workbook(path)
+ sheet = workBook.sheet_by_index(0)
+ for i in range(sheet.nrows):
+ data = []
+ for j in range(sheet.ncols):
+ data.append(sheet.cell(i,j).value)
+ datas.append(data)
+
+ return datas
+
+def write_excel(datas,file_name):
+ """将数据保存在excel中"""
+ try:
+ # todo 创建excel文件
+ xl = xlwt.Workbook()
+ # todo 添加sheet
+ sheet = xl.add_sheet('sheet1')
+ datas = datas
+ for i in range(0,len(datas)):
+ for j in range(len(datas[0])):
+ try:
+ sheet.write(i,j,str(datas[i][j]))
+ except Exception as e:
+ print(e)
+ else:
+ continue
+
+ # todo 关闭文件
+ xl.save(r'{}{}.xls'.format(file_name,str(time.strftime("%Y%m%d%H%M%S", time.localtime()))))
+ except Exception as e:
+ pass
+
+
+
+class Window2(QMainWindow, Ui_MainWindow2):
+ def __init__(self, parent=None):
+ super(Window2, self).__init__(parent)
+ self.setupUi(self)
+ self.dateEdit.setDate(QDate.currentDate())
+ self.dateEdit_2.setDate(QDate.currentDate())
+ self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 禁止编辑
+ self.tableWidget.doubleClicked.connect(self.show_one)
+ self.get_data()
+ self.pushButton.clicked.connect(self.search)
+ def show_one(self):
+
+ #显示数据
+ data = self.datas[self.tableWidget.selectionModel().selection().indexes()[0].row() + 1]
+ self.w = Window5()
+ self.w.get_data(data)
+ self.w.show()
+
+ def get_data(self):
+ excel_list = []
+ for a,b,c in os.walk('pythonProject'):
+ for i in c:
+ if 'data' in i or 'xl' in i:
+ excel_list.append(i)
+
+ break
+
+ self.datas = read_excel(os.path.join('pythonProject',excel_list[-1]))
+
+ def search(self):
+ new_data1 = []
+ title = self.datas[0]
+ id = self.lineEdit.text()
+ if id != '':
+ for i in self.datas[1:]:
+ if id in i:
+ new_data1.append(i)
+ else:
+ new_data1 = self.datas[1:]
+ date1 = self.dateEdit.date().toString(Qt.ISODate).replace('-','')
+ date2 = self.dateEdit_2.date().toString(Qt.ISODate).replace('-','')
+ new_data2 = []
+ if date1 == date2:
+ new_data2 = new_data1
+ else:
+ for i in new_data1:
+ nd = i[2].replace('-' ,'')
+ if nd <= date2 and nd >= date1:
+ new_data2.append(i)
+ tbale_datas = new_data2
+ self.tableWidget.setColumnCount(len(title)) # 设置好列数
+ self.tableWidget.setHorizontalHeaderLabels(title)
+
+ row = len(tbale_datas)
+ self.tableWidget.setRowCount(row) # 设置好行数
+ self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
+
+ try:
+ for i in range(0,row):
+ for j in range(len(title)):
+ S = QTableWidgetItem(str(tbale_datas[i][j]))
+ S.setTextAlignment(Qt.AlignCenter) # 居中显示
+ self.tableWidget.setItem(i, j, S)
+ except Exception as e:
+ print(e)
+class Window3(QMainWindow, Ui_MainWindow3):
+ def __init__(self, parent=None):
+ super(Window3, self).__init__(parent)
+ self.setupUi(self)
+ self.dateEdit.setDate(QDate.currentDate())
+ self.dateEdit_2.setDate(QDate.currentDate())
+ self.dateEdit_3.setDate(QDate.currentDate())
+ self.dateEdit_4.setDate(QDate.currentDate())
+
+
+ self.pushButton_2.clicked.connect(self.search1)
+ self.pushButton.clicked.connect(self.search2)
+ self.get_datas()
+ def get_datas(self):
+ #获取数据
+ self.datas = read_excel('数据.xlsx')
+ def search1(self):
+ #饼图
+ date1 = self.dateEdit.date().toString(Qt.ISODate).replace('-', '')
+ date2 = self.dateEdit_2.date().toString(Qt.ISODate).replace('-', '')
+ data = {}
+ for i in self.datas[1:]:
+ if date1 != date2:
+ da = (i[3] + '00').replace('-', '')
+ if da>date2 or dadate2 or da