基于scrapy的分布式暗网资源挖掘系统及方法与流程

文档序号:15982245发布日期:2018-11-17 00:28阅读:413来源:国知局

本发明涉及数据挖掘领域,特别涉及基于scrapy的分布式暗网资源挖掘系统及方法。

背景技术

暗网是指通过特殊软件或使用非标准的通信协议和端口才能访问的网络。tor是目前最主流的暗网匿名通信系统,由于暗网的完全匿名性的特点,孕育了大量的非法交易。因此研究对暗网资源的挖掘有重大意义。传统的搜索引擎和爬虫技术能够爬取的仅仅是互联网上提供的小部分web信息,即明网上的信息。不能实现对暗网资源的挖掘。现有的研究大多又是针对互联网上不能被标准搜素引擎索引的非表面网络内容即深网,并不是现在所谓的暗网;少数虽然针对暗网进行研究及爬取,但在设计上没有考虑爬取的效率,广度,以及灵活性。

scrapy是目前最主流的爬虫框架,它是基于twisted异步网络库实现的,在爬取速度上相对其他爬虫是高效的,且具有可定制性。然而scrapy提供的下载模块是基于http协议实现的,暗网使用的是socke协议。另外由于网络爬虫对i/o的要求较高,scrapy将待爬取的urls直接存储在内存中而非硬盘中,这样一来,在爬取大量的暗网时时,当爬取的网页数量达到数万时,需要存储的urls数量可能会超过百万甚至千万,再加上python本身是脚本语言,其对象占用内存往往比c/c++等编译型语言要大得多,而且python垃圾收集器的释放内存算法并不会在对象不再被引用时立即释放内存。因此,很可能会导致单机内存枯竭。单机使用scrapy爬取,内存将会是瓶颈。



技术实现要素:

本发明要解决的技术问题是:提供一种基于scrapy的分布式暗网资源挖掘系统及方法,用以提升暗网资源挖掘的效率、广度以及灵活性。

为解决上述问题,本发明采用的技术方案是:

基于scrapy的分布式暗网资源挖掘系统,包括中心节点控制模块和从节点爬取模块,所述中心节点控制模块包括爬虫种子任务队列、任务预处理模块、暗网任务队列和明网任务队列,所述从节点爬取模块包括暗网爬取模块、明网爬取模块和爬虫管理器;

所述爬虫种子任务队列用于存储用户提供的待爬取种子任务,以及从节点爬取模块提取的新的待爬取的种子任务;所述任务预处理模块用于对爬虫种子任务队列中的任务进行匹配以及去重过滤,并将属于暗网的任务存入暗网任务队列,属于明网的任务存入明网任务队列;

所述暗网爬取模块中的暗网爬虫用于从暗网任务队列中读取暗网爬取任务,基于暗网爬取任务下载对应的暗网网页,并从暗网网页中提取新的暗网域名,将提取到的新的暗网域名存入爬虫种子任务队列;所述明网爬取模块中的明网爬虫用于从明网任务队列中读取明网爬取任务,基于明网爬取任务下载对应的明网网页,并从明网网页中提取新的明网域名和暗网域名,将提取到的新的明网域名和暗网域名存入爬虫种子任务队列;所述爬虫管理器用于根据中心节点控制模块发送的请求信息,对爬虫进程进行管理。

进一步的,本发明还包括redis数据库,所述redis数据库用于存储暗网任务队列和明网任务队列。

进一步的,本发明还包括kafka消息系统,所述kafka消息系统用于存储爬虫种子任务队列。

进一步的,本发明还包括mongodb数据库,所述mongodb数据库用于存储暗网爬取模块所下载的暗网网页以及明网爬取模块所下载的明网网页。

进一步的,中心节点控制模块发送的请求信息包括爬虫启动请求信息和爬虫结束请求信息,爬虫管理器基于爬虫启动请求信息创建爬虫进程,基于爬虫结束请求信息结束爬虫进程。

进一步的,本发明暗网爬取模块通过tor代理的方式下载暗网网页,暗网爬取模块实现tor代理的方法是:新建proxychains的配置文件,通过proxychains启动scrapy,从而强制该暗网爬虫走tor代理。

进一步的,本发明所述任务预处理模块包括暗网插件和明网插件;所述暗网插件用于暗网待爬取任务匹配,并实现暗网待爬取任务的判重,将未被爬取过的任务存入redis数据库中用于存储暗网任务的key中;所述明网插件用于明网待爬取任务匹配,并实现明网待爬取任务的判重,将未被爬取过的任务存入redis数据库中用于存储明网任务的key中。

进一步的,本发明暗网插件通过以下正则表达式实现暗网待爬取任务匹配:

"^https?://(([a-z0-9_-]{1,64}\.){0,4}[a-z09=]{16}\.onion)(:|/|$);

明网插件通过以下正则表达式实现暗网待爬取任务匹配:

((http|https)://)(([a-za-z0-9\._-]+\.(com|cn)))(/[a-za-z0-9\&%_\./-~-]*)?。

基于上述系统,本发明还提供一种基于scrapy的分布式暗网资源挖掘方法,包括如下步骤:

s1、将一些可能存在少量暗网域名的明网url,以及人为获取的一些暗网域名存入中心控制节点模块的爬虫种子任务队列;

s2、将爬虫种子任务队列里的任务经由任务预处理模块的插件进行匹配和判重处理,将得到的暗网任务和明网任务分别存入暗网任务队列和明网任务队列;

s3、暗网爬虫从暗网任务队列中读取暗网爬取任务,基于暗网爬取任务下载对应的暗网网页,并从暗网网页中提取新的暗网url,将提取到的新的暗网url存入爬虫种子任务队列;明网爬虫从明网任务队列中读取明网爬取任务,基于明网爬取任务下载对应的明网网页,并从明网网页中提取新的明网url和暗网url,将提取到的新的明网url和暗网url存入爬虫种子任务队列;

s4、重复执行步骤s2-s3直到将所有的暗网url和暗网网页获取完毕。

进一步的,步骤s1中所述的明网的url指的是社交网站或者灰色的公众论坛或者匿名发布内容的网站。

进一步的,步骤s1中的爬虫种子任务队列存储于kafka消息系统中,步骤s2中的暗网任务队列和明网任务队列存储于redis数据库中。

本发明的有益效果是:由于隐匿服务域名地址的公开范围很小,收集起来有一定难度,本发明通过将暗网爬虫和明网爬虫二者融合且又独立,通过广度且又深层的爬取明网,获取更多的暗网域名,暗网在人为提供和通过明网爬取得暗网域名的基础上再从暗网页面和明网网页中爬取更多的暗网域名。当不需要通过明网进行获取暗网域名时,可以通过中心控制节点模块向从节点爬取模块发送http请求终止明网的爬取,同时不影响暗网。当发现暗网待爬取任务较多,可以通过中心控制节点模块向从节点爬取模块发送http请求启动新的暗网爬虫,提高暗网爬取的速度,具有较高的灵活性;由于爬虫对i/o和带宽的要求高,单机爬取大量的暗网和明网必会造成内存的枯竭,爬取速度变慢,因此本发明选取内存型数据库redis来存储暗网任务队列和明网任务队列,同时将其部署在中心节点上,让多台多爬虫进程实现分布式的爬取,提高了爬取速度;同时为了解决从节点爬虫爬取到新的url链接,与任务预处理模块对任务的处理速度不匹配问题,本发明选取kafka消息中间件来存储爬虫种子任务队列,同时由于kafka具有可持久性,当中心节点宕机的情况下,也不会丢失待爬取任务,保证了系统的可靠性。本发明实现了对暗网域名的大量获取以及对暗网网页页面的存储,为对暗网进行数据分析提供数据支撑。

附图说明

图1是基于scrapy的分布式暗网数据挖掘的架构图;

图2是任务预处理模块的处理流程图;

图3是暗网爬取模块的处理流程图。

具体实施方式

由于隐匿服务域名地址的公开范围很小,收集起来有一定难度,本发明通过将暗网爬虫和明网爬虫二者融合且又独立,通过广度且又深层的爬取明网,获取更多的暗网域名,暗网在人为提供和通过明网爬取得暗网域名的基础上再从暗网页面中爬取更多的暗网域名。当不需要通过明网进行获取暗网域名时,可以通过中心控制节点模块向从节点爬取模块发送http请求终止明网的爬取,同时不影响暗网。当发现暗网待爬取任务较多,可以通过中心控制节点向从节点发送http请求启动新的暗网爬虫,提高暗网爬取的速度。

以下结合实施例对本发明做进一步说明。

实施例提供了一种基于scrapy的分布式暗网资源挖掘系统,如图1所示,包括中心节点控制模块和从节点爬取模块,所述中心节点控制模块包括爬虫种子任务队列、任务预处理模块、暗网任务队列和明网任务队列,所述从节点爬取模块包括暗网爬取模块、明网爬取模块和爬虫管理器。以下分别对各部分的功能模块进行说明。

所述爬虫种子任务队列用于存储用户提供的待爬取种子任务,以及从节点爬取模块提取的新的待爬取的种子任务。实施例选取kafka消息中间件来存储爬虫种子任务队列,同时由于kafka具有可持久性,当中心节点宕机的情况下,也不会丢失待爬取任务,保证了系统的可靠性。

所述任务预处理模块用于对爬虫种子任务队列中的任务进行匹配以及去重过滤,并将属于暗网的任务存入暗网任务队列,属于明网的任务存入明网任务队列。具体来说,所述任务预处理模块包括暗网插件和明网插件;所述暗网插件用于暗网待爬取任务匹配,并实现暗网待爬取任务的判重,将未被爬取过的任务存入redis数据库中用于存储暗网任务的key中;所述明网插件用于明网待爬取任务匹配,并实现明网待爬取任务的判重,将未被爬取过的任务存入redis数据库中用于存储明网任务的key中,任务预处理模块的处理流程如图2所示。由于任务预处理模块为每类任务设置了不同的插件进行处理,因此确保每个任务能迅速找到其对应的插件,程序在每个插件中定义了一个正则表达式用以匹配任务的url,如果匹配成功,则使用该插件处理解析,否则使用其他匹配成功的插件处理解析。由于暗网的任务与明网的任务区别在于:暗网的顶级域名格式是abc.onion,其中abc是由数字和字母组成的16位的字符串。明网的顶级域名是xxx.com|cn。因此实施例中暗网插件对应的正则表达式可以是:^https?://(([a-z0-9_-]{1,64}\.){0,4}[a-z09=]{16}\.onion)(:|/|$)。明网插件对应的正则表达式是:((http|https)://)(([a-za-z0-9\._-]+\.(com|cn)))(/[a-za-z0-9\&%_\./-~-]*)?。所述暗网插件首先判断待爬取任务是否已经被爬取过,若未被爬取则存入暗网任务队列,否则丢弃。从而避免网页的重复采集,造成资源的浪费。需要说明的是,本段中出现的“?”是正则表达式中的一个符号,因此这里的“?”并不代表本段有任何的疑问或者不确定的情况。

所述暗网爬取模块中的暗网爬虫用于从暗网任务队列中读取暗网爬取任务,基于暗网爬取任务下载对应的暗网网页,并从暗网网页中提取新的暗网域名,将提取到的新的暗网域名存入爬虫种子任务队列。暗网爬取模块包括调度器子模块,暗网网页下载子模块,暗网url提取子模块,数据管道子模块。所述调度器子模块负责从中心节点控制模块的暗网队列获取任务,以及向中心节点的爬虫种子任务队列提交新的爬虫任务。所述暗网网页下载子模块通过重写scrapy的下载组件实现可以进入tor网络下载暗网网页页面。所述暗网url提取子模块通过重写scrapy自身的spider组件来实现提取暗网网页的暗网链接。所述数据管道模块负责将提取到的暗网链接存入中心节点的爬虫种子任务队列,将暗网网页页面存入mongodb数据库。图3是暗网爬取模块的爬取流程图,其具体步骤如下:

a、调度器模块从redis中用于存储暗网任务的key中取出待爬取暗网任务,经由引擎交给暗网网页下载模块。

b、暗网网页下载模块通过访问tor网络,将暗网网页下载,经由引擎交给暗网url提取模块。

其中暗网网页下载模块,不同于原有的scrapy框架的下载器。本发明实现方法是:新建proxychains的配置文件,通过proxychains启动scrapy,强制该暗网爬虫走tor代理。

c、暗网url提取模块从暗网网页中提取出新的暗网url,经由引擎交给数据管道模块。

d、数据管道模块将暗网url存入kafka消息队列,将暗网网页存入mongodb数据库。

所述明网爬取模块中的明网爬虫用于从明网任务队列中读取明网爬取任务,基于明网爬取任务下载对应的明网网页,并从明网网页中提取新的明网域名和暗网域名,将提取到的新的明网域名和暗网域名存入爬虫种子任务队列。

由于主从节点无法直接通信,导致中心节点无法时刻监控各个从节点爬虫运行状态信息,以及控制从节点爬虫的启动与终止。本发明使用twistedapplication框架实现一个基于http的爬虫管理器部署在各从节点上,各从节点通过调用twisted框架内部的timerservice接口,在从节点运行期间反复查询待启动爬虫信息队列,运行中的爬虫进程信息队列,将爬虫节点当前进程的状态存入redis。中心节点通过访问redis,实现对各从节点的监控,并通过http请求来远程控制各个从节点中的爬虫。

所述爬虫管理器用于根据中心节点控制模块发送的请求信息,对爬虫进程进行管理。爬虫管理器内部维护着三个队列:待启动爬虫信息队列,运行中的爬虫进程信息队列,已经结束的爬虫进程信息队列。爬虫管理器通过接受中心节点的http的启动请求,爬虫启动请求信息包括启动爬虫类型(暗网爬虫、明网爬虫)以及标识即将启动该爬虫进程的任务号。将接受到的请求信息存入队列待启动爬虫信息队列,依次从队列中取出信息并创建爬虫进程。收到取消爬虫进程的请求后,先从参数中解析出要取消的爬虫项目名及爬虫任务号,如果该爬虫启动任务存在于待启动爬虫信息队列中,则直接从数据库中删除该爬虫启动任务;如果在待启动爬虫信息队列中不能查询到该爬虫启动任务,则遍历正在运行的爬虫队列找到与爬虫启动任务相同任务号的爬虫进程,并调用twisted内部的signalprocess接口向该进程发送结束的信号停止该进程。

对于创建和结束爬虫进程,实施例使用的方法是:通过调用twisted框架内部提供的spawnprocess接口创建相应的进程,其中该接口的第一个参数为processprotocol对象,负责监听所有与爬虫进程相关的事件(如爬虫进程结束,爬虫进程创建成功等等),当监听到爬虫进程创建成功时,将该爬虫进程信息加入正在运行的爬虫进程信息队列。当监听到爬虫进程结束时,将该爬虫进程信息从正在运行的爬虫进程信息队列中删除,并将该爬虫进程信息存入已经结束的爬虫进程信息队列。

基于以上的系统,实施例还提供了一种基于scrapy的分布式暗网资源挖掘方法,包括如下步骤:

s1、将一些可能存在少量暗网域名的明网url,以及人为获取的一些暗网域名存入中心控制节点模块的爬虫种子任务队列。其中,所述明网的url指的是一些社交网站,灰色的公众论坛,匿名发布内容的网站,这些站点极有可能存在用户发布的部分tor暗网域名。所述爬虫种子任务队列作为进入该系统的入口,采用kafka消息系统存储,由于kafka具有可持久化性以及存储量大的特点,保证了爬虫种子任务不会丢失。同时做为消息中间件,解决消费者与生产者处理速度不匹配的问题。

s2、将爬虫种子任务队列里的任务经由任务预处理模块的插件进行匹配和判重处理,将得到的暗网任务和明网任务分别存入暗网任务队列和明网任务队列。其中,所述暗网任务队列和明网任务队列,使用内存型数据库redis数据库存储,替代了scrapy框架原有在本地内存上创建任务队列存储。实现多个不同机器上的scrapy都可以从同一个数据库获取任务进行分布式爬取。

s3、暗网爬虫从暗网任务队列中读取暗网爬取任务,基于暗网爬取任务下载对应的暗网网页,并从暗网网页中提取新的暗网url,将提取到的新的暗网url存入爬虫种子任务队列;明网爬虫从明网任务队列中读取明网爬取任务,基于明网爬取任务下载对应的明网网页,并从明网网页中提取新的明网url和暗网url,将提取到的新的明网url和暗网url存入爬虫种子任务队列。

s4、重复执行步骤s2-s3直到将所有的暗网url和暗网网页获取完毕,从而实现对暗网url的大量获取以及对暗网网页页面的存储。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1