优化中...

  1. #! /usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author: Tdcqma
  4.  
  5. '''
  6. v1.0:
  7. 由于网站结构存在变更的可能性,一旦爬虫爬取的页面发生变化则会影响正则表达式的匹配,导致爬虫失效。
  8. 为了解决这个问题重新架构该爬虫,新的爬虫将分3个部分,即:
  9. 【1】信息收集:一旦网站结构发生变化只需要更改此部分的正则表达式即可,收集的信息需要保存至一个嵌套列表中。
  10. 【2】信息筛选:即使网站结构发生变化也不需要变更此部分。
  11. 【3】信息发送:即使网站结构发生变化也不需要变更此部分。
  12.  
  13. '''
  14.  
  15. import urllib.request
  16. import ssl,re
  17. import smtplib,email
  18. import datetime
  19.  
  20. # ---------------------------------------------
  21. # 【1】信息收集,正则表达匹配网站信息,包括date、title、url等,
  22. # 将所有信息保存至sec_all_list列表中
  23. # ---------------------------------------------
  24.  
  25. # 指定以当前日期(年月日格式)为搜索条件
  26. #today = str(datetime.date.today())
  27. today = "2017-09-25" # 临时指定测试时间
  28. str_domain = "http://www.nsfocus.net"
  29. sec_all_list = [] # 收集所有漏洞信息并保存在列表中
  30.  
  31. # 因一天的漏洞个数可能要占用好几个网站页面,所以指定被扫描网站需要扫描的网页数范围,默认读取10页
  32. for i in range(10):
  33. url = "http://www.nsfocus.net/index.php?act=sec_bug&type_id=&os=&keyword=&page=%s" % (i+1)
  34. request = urllib.request.Request(url)
  35. # 当尝试访问https开始当站点时,设置全局取消SSL证书验证
  36. ssl._create_default_https_context = ssl._create_unverified_context
  37. response = urllib.request.urlopen(request)
  38. data = response.read().decode('utf-8')
  39.  
  40. if today in data:
  41.  
  42. # 用于匹配内容的正则表达式部分
  43. str_re = "<.*" + today + ".*"
  44. res = re.findall(str_re, data)
  45.  
  46. for line in res:
  47.  
  48. sec_sub_list = [] # 收集单独的漏洞信息
  49.  
  50. # 收集漏洞标题
  51. title_craw = re.findall("/vulndb/\d+.*</a>", line) # 获取标题
  52. title = title_craw[0][15:-4]
  53. sec_sub_list.append(title)
  54.  
  55. # 收集漏洞url
  56. url_craw = re.findall("/vulndb/\d+", line) # 获取链接
  57. sub_url = str_domain + url_craw[0]
  58. sec_sub_list.append(sub_url)
  59.  
  60. # 收集漏洞受影响的版本
  61. vul_request = urllib.request.Request(sub_url)
  62. vul_response = urllib.request.urlopen(vul_request)
  63. vul_data = vul_response.read().decode('utf-8')
  64.  
  65. affected_version = re.findall("<blockquote>.*</blockquote>", vul_data, re.S)
  66. affected_version = str(affected_version[0][12:-13])
  67. aff_ver = affected_version.replace("<br />","")
  68. sec_sub_list.append(aff_ver)
  69.  
  70. # 将所有收集的子列表保存至汇总列表sec_all_list中
  71. sec_all_list.append(sec_sub_list)
  72.  
  73. # ---------------------------------------------
  74. # 【2】信息筛选
  75. # ---------------------------------------------
  76.  
  77. # 筛选后的内容最终会保存至msg变量中
  78. msg = ""
  79.  
  80. # 调用get_sec_info函数,将目标系统或应用名称作为参数传入,即可获取相关爬虫告警信息
  81. def get_sec_info(vul):
  82. if vul in line[0]:
  83. sec_info = "\n漏洞名称:" + line[0] + "\n漏洞链接:" + line[1] + "\n受影响的版本:\n" + line[2]+"\n"
  84. global msg
  85. msg += sec_info
  86.  
  87. for line in sec_all_list:
  88.  
  89. get_sec_info("Apache")
  90. get_sec_info("Cisco")
  91. get_sec_info("EMC")
  92. get_sec_info("Samba")
  93.  
  94. # 为放置数据丢失,同时将筛选后的爬虫信息写入文本f中,f指向secInfo-lvmeng.txt文档。
  95. f = open("secInfo-lvmeng.txt", 'w', encoding='utf-8')
  96. f.writelines(msg)
  97.  
  98. # ---------------------------------------------
  99. # 【3】信息发送
  100. # ---------------------------------------------
  101.  
  102. chst = email.charset.Charset(input_charset = 'utf-8')
  103. header = ("From: %s\nTo: %s\nSubject: %s\n\n" %
  104. ("from_mail@163.com",
  105. "to_mail@163.com",
  106. chst.header_encode("[爬虫安全通告-绿盟]")))
  107.  
  108. # 借用163smtp服务器发送邮件,将上面读到的报警信息作为邮件正文发送。
  109.  
  110. email_con = header.encode('utf-8') + msg.encode('utf-8')
  111. smtp = smtplib.SMTP("smtp.163.com")
  112. smtp.login("from_mail@163.com","from_mail_pass")
  113. smtp.sendmail('from_mail@163.com','to_mail',email_con)
  114. print('mail send success!')
  115. smtp.quit()

crawler_exa3的更多相关文章

随机推荐

  1. Spring:获取容器中的Bean

    某些情况下我们要获取 IOC 容器中指定注解.类型.名字的 Bean 要获取 IOC 容器中指定条件的 Bean 可以通过 ApplicationContext 相应的方法 @Autowired pr ...

  2. 因数表进阶:1--x的因数和

    紧接着上一个文章,进阶一个因数表,来自牛客网一道比赛题: 打从1到n所有因数的和 代码如下: #include<cstdio> #define ll long long using nam ...

  3. BZOJ.5339.[TJOI2018]教科书般的亵渎(拉格朗日插值) & 拉格朗日插值学习笔记

    BZOJ 洛谷 题意的一点说明: \(k\)次方这个\(k\)是固定的,也就是最初需要多少张亵渎,每次不会改变: 因某个怪物死亡引发的亵渎不会计分. 不难发现当前所需的张数是空格数+1,即\(m+1\ ...

  4. 英语口语练习系列-C24-杂技-问候语-乡愁

    1. 词汇-杂技 acrobatics noun [ U ] UK /ˌæk.rəˈbæt.ɪks/ US /ˌæk.rəˈbæt̬.ɪks/ the skills of an acrobat 杂技 ...

  5. [JOISC2014]たのしい家庭菜園

    [JOISC2014]たのしい家庭菜園 题目大意: 给定一个长度为\(n(n\le3\times10^5)\)的序列\(A(A_i\le10^9)\).只能交换相邻两个数,问最少需要几步可以将它变成一 ...

  6. React入门——制作一个TodoList App

    源码 import React, { Component, Fragment } from "react"; class TodoList extends Component { ...

  7. [CTSC2017]吉夫特

    Description: 给定一个序列\(a_1,a_2,a_3...a_n\) 求有多少个不上升子序列: \(a_{b1},a_{b_2}...\) 满足 \(C_{a_{b1}}^{a_{b2}} ...

  8. ZOJ3967 : Card Game

    比赛的时候因为卡内存,在抠内存的时候改错了,导致赛内没有AC,赛后发现数组开的很小都可以AC. 分析题意我们发现,这题需要求出所有存在的直线形成的上凸壳,那么查询$[L,R]$时在凸壳上二分导数,找到 ...

  9. Sunday串匹配算法 C语言实现

    unsigned char * sunday( void * a_buf1, unsigned int len1, void * a_buf2, unsigned int len2 ){ unsign ...

  10. Flask对象配置

    Flask的配置就是在 app.config 中添加一个键值对,但是你存进去的键必须是config中应该存在的,如果不再存在的话,它会默认无用,就这么放着 config中有用的key { 'DEBUG ...