crawler_exa3

優化中...php

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Tdcqma

'''
v1.0:
    因爲網站結構存在變動的可能性,一旦爬蟲爬取的頁面發生變化則會影響正則表達式的匹配,致使爬蟲失效。
爲了解決這個問題從新架構該爬蟲,新的爬蟲將分3個部分,即:
    【1】信息收集:一旦網站結構發生變化只須要更改此部分的正則表達式便可,收集的信息須要保存至一個嵌套列表中。
    【2】信息篩選:即便網站結構發生變化也不須要變動此部分。
    【3】信息發送:即便網站結構發生變化也不須要變動此部分。

'''

import urllib.request
import ssl,re
import smtplib,email
import datetime

# ---------------------------------------------
# 【1】信息收集,正則表達匹配網站信息,包括date、title、url等,
#      將全部信息保存至sec_all_list列表中
# ---------------------------------------------

# 指定以當前日期(年月日格式)爲搜索條件
#today = str(datetime.date.today())
today = "2017-09-25"    # 臨時指定測試時間
str_domain = "http://www.nsfocus.net"
sec_all_list = []   # 收集全部漏洞信息並保存在列表中

# 因一天的漏洞個數可能要佔用好幾個網站頁面,因此指定被掃描網站須要掃描的網頁數範圍,默認讀取10頁
for i in range(10):
    url = "http://www.nsfocus.net/index.php?act=sec_bug&type_id=&os=&keyword=&page=%s" % (i+1)
    request = urllib.request.Request(url)
    # 當嘗試訪問https開始當站點時,設置全局取消SSL證書驗證
    ssl._create_default_https_context = ssl._create_unverified_context
    response = urllib.request.urlopen(request)
    data = response.read().decode('utf-8')

    if today in data:

        # 用於匹配內容的正則表達式部分
        str_re = "<.*" + today + ".*"
        res = re.findall(str_re, data)

        for line in res:

            sec_sub_list = []  # 收集單獨的漏洞信息

            # 收集漏洞標題
            title_craw = re.findall("/vulndb/\d+.*</a>", line)  # 獲取標題
            title = title_craw[0][15:-4]
            sec_sub_list.append(title)

            # 收集漏洞url
            url_craw = re.findall("/vulndb/\d+", line)  # 獲取連接
            sub_url = str_domain + url_craw[0]
            sec_sub_list.append(sub_url)

            # 收集漏洞受影響的版本
            vul_request = urllib.request.Request(sub_url)
            vul_response = urllib.request.urlopen(vul_request)
            vul_data = vul_response.read().decode('utf-8')

            affected_version = re.findall("<blockquote>.*</blockquote>", vul_data, re.S)
            affected_version = str(affected_version[0][12:-13])
            aff_ver = affected_version.replace("<br />","")
            sec_sub_list.append(aff_ver)

            # 將全部收集的子列表保存至彙總列表sec_all_list中
            sec_all_list.append(sec_sub_list)

# ---------------------------------------------
# 【2】信息篩選
# ---------------------------------------------

# 篩選後的內容最終會保存至msg變量中
msg = ""

# 調用get_sec_info函數,將目標系統或應用名稱做爲參數傳入,便可獲取相關爬蟲告警信息
def get_sec_info(vul):
    if vul in line[0]:
        sec_info = "\n漏洞名稱:" + line[0] + "\n漏洞連接:" + line[1] + "\n受影響的版本:\n" + line[2]+"\n"
        global msg
        msg += sec_info

for line in sec_all_list:

    get_sec_info("Apache")
    get_sec_info("Cisco")
    get_sec_info("EMC")
    get_sec_info("Samba")

# 爲放置數據丟失,同時將篩選後的爬蟲信息寫入文本f中,f指向secInfo-lvmeng.txt文檔。
f = open("secInfo-lvmeng.txt", 'w', encoding='utf-8')
f.writelines(msg)

# ---------------------------------------------
# 【3】信息發送
# ---------------------------------------------

chst = email.charset.Charset(input_charset = 'utf-8')
header = ("From: %s\nTo: %s\nSubject: %s\n\n" %
          ("from_mail@163.com",
           "to_mail@163.com",
           chst.header_encode("[爬蟲安全通告-綠盟]")))

# 借用163smtp服務器發送郵件,將上面讀到的報警信息做爲郵件正文發送。

email_con = header.encode('utf-8') + msg.encode('utf-8')
smtp = smtplib.SMTP("smtp.163.com")
smtp.login("from_mail@163.com","from_mail_pass")
smtp.sendmail('from_mail@163.com','to_mail',email_con)
print('mail send success!')
smtp.quit()
本站公眾號
   歡迎關注本站公眾號,獲取更多信息