『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息

每个漏洞条目包含:

乌云ID,漏洞标题,漏洞所属厂商,白帽子,漏洞类型,厂商或平台给的Rank值

主要是做数据分析使用:
可以分析某厂商的各类型漏洞的统计;
或者对白帽子的能力进行分析.....

数据更新时间:2016/5/27
漏洞条目:104796条

数据截图如下:

数据网盘链接:

链接:http://pan.baidu.com/s/1bpDNKOv 密码:6y57

爬虫脚本:

# coding:utf-8
# author: anka9080
# version: 1.0  py3

import sys,re,time,socket
from requests import get
from queue import Queue, Empty
from threading import Thread

# 全局变量
COUNT = 1
START_URL = ‘http://wooyun.org/bugs‘
ID_DETAILS = []
ALL_ID = []
Failed_ID = []
PROXIES = []

HEADERS = {
	"Accept": "text/html,application/xhtml+xml,application/xml,application/json;q=0.9,image/webp,*/*;q=0.8",
	"Accept-Encoding": "gzip, deflate, sdch",
	"Accept-Language": "zh-CN,zh;q=0.8",
	"Cache-Control": "max-age=0",
	"Connection": "keep-alive",
	"DNT": "1",
	"Host": "wooyun.org",
	"Upgrade-Insecure-Requests": "1",
	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2716.0 Safari/537.36"
}

class WooYunSpider(Thread):
	"""docstring for WooYunSpider"""
	def __init__(self,queue):
		Thread.__init__(self)
		self.pattern1 = re.compile(r‘title>(.*?)\| WooYun.*?keywords" content="(.*?),(.*?),(.*?),wooyun‘,re.S)  # 匹配模式在 compile 的时候指定
		self.pattern2 = re.compile(r"漏洞Rank:(\d{1,3})")
		self.queue = queue
		self.start() # 执行 run()

	def run(self):
		"每次读取 queue 的一条"
		global COUNT,RES_LOG,ERR_LOG
		while(1):
			try:
				id = self.queue.get(block = False)
				r = get(‘http://wooyun.org/bugs/‘ + id,headers = HEADERS)
				html = r.text
			except Empty:
				break
			except Exception as e:
				msg = ‘[ - Socket_Excpt ] 链接被拒绝,再次添加到队列:‘ + id
				print(msg)
				ERR_LOG.write(msg+‘\n‘)
				self.queue.put(id)  # 访问失败则把这个 URL从新加入队列
			else:
				title,comp,author,bug_type,rank = self.get_detail(html,id)
				detail = id+‘----‘+title+‘----‘+comp+‘----‘+author+‘----‘+bug_type+‘----‘+rank
				try: # 写入文件可能会诱发 gbk 编码异常,这里保存 id 到 failed
					RES_LOG.write(detail + ‘\n‘)
				except Exception as e:
					Failed_ID.append(id)
					msg = ‘[ - Encode_Excpt ] 字符编码异常:‘ + id
					print(msg)
					ERR_LOG.write(msg+‘\n‘)
				ID_DETAILS.append(detail)
			# time.sleep(1)

			print(‘[ - info ] id: {}  count: {}  time: {:.2f}s‘.format(id,COUNT,time.time() - start))
			COUNT += 1

	# 由 缺陷编号 获得对应的 厂商 和 漏洞类型信息
	def get_detail(self,html,id):
		global ERR_LOG
		try:
			# print(html)
			res = self.pattern1.search(html)
			title = res.group(1).strip()
			comp = res.group(2).strip()
			author = res.group(3).strip()
			bug_type = res.group(4).strip()
		except Exception as e:
			msg = ‘[ - Detail_Excpt ] 未解析出 标题等相关信息:‘ + id
			print(msg)
			ERR_LOG.write(msg+‘\n‘)
			Failed_ID.append(id)
			title,comp,author,bug_type,rank = ‘Null‘,‘Null‘,‘Null‘,‘Null‘,‘Null‘
		else:
			try:
				res2 = self.pattern2.search(html)  # 若厂商暂无回应则 rank 为 Null
				rank = res2.group(1).strip()
			except Exception as e:
				msg = ‘[ - Rank_Excpt ] 未解析出 Rank:‘ + id
				print(msg)
				ERR_LOG.write(msg+‘\n‘)
				rank = ‘Null‘

		finally:
			try:
				print (title,comp,author,bug_type,rank)
			except Exception as e:
				msg = ‘[ - Print_Excpt ] 字符编码异常:‘ + id +‘::‘+ str(e)
				print(msg)
				ERR_LOG.write(msg+‘\n‘)
			return title,comp,author,bug_type,rank

class ThreadPool(object):
	def __init__(self,thread_num,id_file):
		self.queue = Queue() # 需要执行的队列
		self.threads = [] # 多线程列表
		self.add_task(id_file)
		self.init_threads(thread_num)

	def add_task(self,id_file):
		with open(id_file) as input:
			for id in input.readlines():
				self.queue.put(id.strip())			

	def init_threads(self,thread_num):
		for i in range(thread_num):
			print (‘[ - info :] loading threading ---> ‘,i)
			# time.sleep(1)
			self.threads.append(WooYunSpider(self.queue)) # threads 列表装的是 爬虫线程

	def wait(self):
		for t in self.threads:
			if t.isAlive():
				t.join()

def test():
	url = ‘http://wooyun.org/bugs/wooyun-2016-0177647‘
	r = get(url,headers = HEADERS)
	html = r.text
	# print type(html)
	# keywords" content="(.*?),(.*?),(.*?),wooyun  ====> 厂商,白帽子,类型
	pattern1 = re.compile(r‘title>(.*?)\| WooYun‘)
	pattern2 = re.compile(r‘keywords" content="(.*?),(.*?),(.*?),wooyun‘)
	pattern3 = re.compile(r‘漏洞Rank:(\d{1,3})‘)
	for x in range(500):
		res = pattern1.search(html)
		# print (res.group(1))
		res = pattern2.search(html)
		# print (res.group(1),res.group(2),res.group(3))
		res = pattern3.search(html)
		# print (res.group(1))
		x += 1
		print(x)
	# rank = res.group(4).strip()

	# print html

def test2():
	url = ‘http://wooyun.org/bugs/wooyun-2016-0177647‘
	r = get(url,headers = HEADERS)
	html = r.text
	pattern = re.compile(r‘title>(.*?)\| WooYun.*?keywords" content="(.*?),(.*?),(.*?),wooyun.*?漏洞Rank:(\d{1,3})‘,re.S)
	for x in range(500):
		res = pattern.search(html)
		# print (res.group(1),res.group(2),res.group(3),res.group(4),res.group(5))
		x += 1
		print(x)
# 保存结果
def save2file(filename,filename_failed_id):
	with open(filename,‘w‘) as output:
		for item in ID_DETAILS:
			try: # 写入文件可能会诱发 gbk 编码异常,这里忽略
				output.write(item + ‘\n‘)
			except Exception as e:
				pass

	with open(filename_failed_id,‘w‘) as output:
		output.write(‘\n‘.join(Failed_ID))

if __name__ == ‘__main__‘:

	socket.setdefaulttimeout(1)
	start = time.time()

	# test()

	# 日志记录
	ERR_LOG = open(‘err_log.txt‘,‘w‘)
	RES_LOG = open(‘res_log.txt‘,‘w‘)
	id_file = ‘id_0526.txt‘
	# id_file = ‘id_test.txt‘
	tp = ThreadPool(20,id_file)
	tp.wait()

	save2file(‘id_details.txt‘,‘failed_id.txt‘)

	end = time.time()
	print (‘[ - info ] cost time :{:.2f}s‘.format(end - start))

  

时间: 2024-10-11 20:42:26

『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息的相关文章

简易python爬虫 - 爬取站长论坛信息

爬取目标: 收集网站帖子里发帖人用户名,发帖人ID;帖子的ID,发帖内容;网站title 提前需要准备的python库 pip3 install requests //用于获得网站的源码 pip3 install bs4 //解析遍历网站标签 pip3 install urllib //解析网站的url 首先导入包 import requestsfrom bs4 import BeautifulSoupfrom urllib.parse import parse_qs,urlparse impo

python爬虫爬取微博评论案例详解

这篇文章主要介绍了python爬虫爬取微博评论,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 数据格式:{"name":评论人姓名,"comment_time":评论时间,"comment_info":评论内容,"comment_url":评论人的主页} 以上就是我们需要的信息. 具体操作流程: 我们首相将主页获取完成以后,我们就会发现,其中 的内容带有相

『Python』常用函数实践笔记

库安装: 1).pip & conda 2).在win10下手动安装python库的方法: 『python』计算机视觉_OpenCV3库安装 原生: list.append():添加元素到list末尾 list.extend():使用一个list扩展另一个list 字典列表化:字典是有顺序的,而且list字典等于list字典的key dict = {'c':1,'b':2,'a':3} list(dict) # Out[13]: # ['c', 'b', 'a'] list(dict.keys(

『Python』Numpy学习指南第九章_使用Matplotlib绘图

坐标轴调节以及刻度调节参见:『Python』PIL&plt图像处理_矩阵转化&保存图清晰度调整 数据生成: 1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 func = np.poly1d(np.array([1,2,3,4])) 5 func1 = func.deriv(m=1) # 求一阶导数 6 func2 = func.deriv(m=2) # 求二阶导数 7 8 x = np.linspace(-10,10,3

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 结果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.

【Python】爬取IMDBTOP250

在网上看到有人利用python+beautifulsoup爬取豆瓣Top250 试着自己模仿这个做了个爬取IMDB的, 可惜只能爬取到11个. 后来检查了超久, 才发现, soup=BeautifulSoup(contents)这里,内容不完整,只能到11个电影为止. 代码如下: import urllib2 from bs4 import BeautifulSoup mylist=[] def crawl(url): headers={'User-Agent':'Mozilla/5.0(Win

Python爬虫爬取知乎小结

博客首发至Marcovaldo's blog (http://marcovaldong.github.io/) 最近学习了一点网络爬虫,并实现了使用python来爬取知乎的一些功能,这里做一个小的总结.网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本.我们知道机器学习和数据挖掘等都是从大量的数据出发,找到一些有价值有规律的东西,而爬虫则可以帮助我们解决获取数据难的问题,因此网络爬虫是我们应该掌握的一个技巧. python有很多开源工具包供我们使用,我这里使用了requests.Be

python实现爬取千万淘宝商品的方法_python_脚本之家

分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 python实现爬取千万淘宝商品的方法 作者:mingaixin 字体:[增加 减小] 类型:转载 这篇文章主要介绍了python实现爬取千万淘宝商品的方法,涉及Python页面抓取的相关技巧,需要的朋友可以参考下 本文实例讲述了python实现爬取千万淘宝商品的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2

python爬虫爬取美女图片

python 爬虫爬取美女图片 #coding=utf-8 import urllib import re import os import time import threading def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImgUrl(html,src): srcre = re.compile(src) srclist = re.findall(srcre,html)