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 = "\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()
crawler_exa3的更多相关文章
随机推荐
- elf逆向入门
一: 在linux下进行调试时容易出现权限不够的情况:此时解决办法就是chmod 777+文件名提升权限,以实验吧debug为例,给出了简单的32elf文件,我在查看一些资料以后发现,我需要在main ...
- SpringMVC(二五) JSTL View
项目中使用JSTL,SpringMVC会把视图由InternalView转换为JstlView. 若使用Jstl的fmt标签,需要在SpringMVC的配置文件中配置国际化资源文件. 实现过程: 1. ...
- C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)
Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库(下载地址http://json.codeplex.com/). 下面是Json序列化和反序列化的简单封装: /// & ...
- 哈希表(散列表),Hash表漫谈
1.序 该篇分别讲了散列表的引出.散列函数的设计.处理冲突的方法.并给出一段简单的示例代码. 2.散列表的引出 给定一个关键字集合U={0,1......m-1},总共有不大于m个元素.如果m不是很大 ...
- Markdown指南
Markdown 指南 前几天学习了markdown,然后一直在用,很喜欢这种格式即内容的写作形式.在简书写了几篇,对固定链接的格式很不满意,于是寻找能够支持markdown.固定链接显格式.支持自定 ...
- CodeForce VKcup B
题目描述:给了n个单词和m,还有一堆YES和NO表示在序列1-m,2-(m+1),3-(m+2)......中是否存在重复的单词,没重复的是YES,有重复的是NO 题目链接:点我 如果是NO的话,就使 ...
- redis(六)
安装包 到中文官网查找客户端代码 联网安装 sudo pip install redis 使用源码安装 unzip redis-py-master.zip cd redis-py-master sud ...
- 如何绘制UML图?
首先推荐在线绘制UML的网址:https://www.processon.com/,很好用. 在软件开发过程中,开发人员往往需要通过绘制类图来理清业务的实现思路,从而方便代码实现,也便于后期的代码维护 ...
- python动态构建类(类似声明)
对于类实例的动态构建,那是非常的简单.可要在代码中动态的构建类,然后该类还能够被使用,那得多么的强大呀. 在Python中,内建的__builtin__提供了一个type的方法,用该方法可以动态的构建 ...
- JSAP101
JSAP101 1.DOM 1)文档对象模型 文档:把一个Html文件看成一个文档,所以把这个文档看成一个对象.XML文件也可以看成一个文件.XML侧重于存储数据,html主要以展示为主.一个页面就是 ...