zoukankan      html  css  js  c++  java
  • crawler_exa3

    优化中...

    #! /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 = "
    漏洞名称:" + line[0] + "
    漏洞链接:" + line[1] + "
    受影响的版本:
    " + line[2]+"
    "
            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
    To: %s
    Subject: %s
    
    " %
              ("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()
  • 相关阅读:
    s2-032批量脚本
    javascript 1
    threading模块和queue模块实现程序并发功能和消息队列
    Python标准库06 子进程 (subprocess包)
    常用服务对应的正则
    re
    requests
    198. 打家劫舍
    746. 使用最小花费爬楼梯
    70. 爬楼梯
  • 原文地址:https://www.cnblogs.com/tdcqma/p/7603603.html
Copyright © 2011-2022 走看看