域名数据挖掘方法、装置及Redis服务器与流程

文档序号:24063181发布日期:2021-02-26 11:04阅读:92来源:国知局
域名数据挖掘方法、装置及Redis服务器与流程
域名数据挖掘方法、装置及redis服务器
技术领域
[0001]
本申请涉及网络安全技术领域,尤其涉及域名数据挖掘方法、装置及redis服务器。


背景技术:

[0002]
目前主要通过网络爬虫的方式实现域名数据的挖掘。网络爬虫是指书写爬虫脚本来获取域名数据,基本工作流程包括:首先选取一些url(uniform resource locator,统一资源定位符)作为种子url放入待爬取队列中,然后书写爬虫脚本,针对待爬取队列中的种子url,模拟人工浏览的方式访问网站,将爬取到的网页html(hyper text markup language,超文本标记语言)数据进行存储以及解析,并将解析所得的新链接作为下一层爬取的种子url。
[0003]
为了提高爬取效率,通常在多台主机上执行同一个爬虫程序,以进行域名数据的分布式爬取。在分布式爬取过程中,每台主机在将收集到的域名信息保存至本地存储模块,但是由于每台主机独立执行爬取任务,因此并不知道爬取到的数据是否与其余主机爬取的数据产生重复。为了解决这一问题,目前的处理方案是每台主机先将收集的所有域名数据保存在本地,后续统一采用解析程序对所有主机收集的域名数据进行去重处理。但是在爬取任务十分繁多的情况下,这样的处理方式将导致任务堆积,造成数据冗余。


技术实现要素:

[0004]
为了解决每台主机先将收集的所有域名数据保存在本地,后续统一采用解析程序对所有主机收集的域名数据进行去重处理,将在爬取任务十分繁多的情况下,导致任务堆积,造成数据冗余的问题,本申请通过以下实施例公开了域名数据挖掘方法、装置及redis服务器。
[0005]
本申请第一方面公开了一种域名数据挖掘方法,所述域名数据挖掘方法应用于任一台主机,所述域名数据挖掘方法包括:
[0006]
创建与redis服务器之间的连接,所述redis服务器包括任务分发模块、任务标记模块及域名去重模块;
[0007]
运行多个爬虫线程;
[0008]
控制每个所述爬虫线程依次从所述任务分发模块中获取一个爬取任务并执行,所述爬虫线程用于在每执行完一个爬取任务后,将该爬取任务对应的域名写入所述任务标记模块中,以标记该域名已完成爬取;
[0009]
对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息,所述目标爬虫线程为任一爬虫线程,所述目标爬取任务为所述目标爬虫线程从所述任务分发模块中获取的任一爬取任务;
[0010]
将所述目标域名信息发送至所述域名去重模块,以判断所述目标域名信息是否与已完成爬取的域名发生重复,其中,所述域名去重模块连接至所述任务标记模块,所述域名
去重模块用于判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复;
[0011]
获取所述域名去重模块返回的判断结果;
[0012]
若所述判断结果为所述目标域名信息与所述已完成爬取的域名发生重复,则将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行;
[0013]
若所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复,则将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0014]
可选的,所述创建与redis服务器之间的连接,包括:
[0015]
创建与所述任务分发模块之间的读取连接;
[0016]
创建与所述任务标记模块之间的标记连接;
[0017]
创建与所述域名去重模块之间的去重连接。
[0018]
可选的,在运行多个爬虫线程的同时,所述域名数据挖掘方法还包括:
[0019]
运行保存线程,所述保存线程用于在所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复时,执行将所述目标域名信息保存至本地存储模块的步骤。
[0020]
本申请第二方面公开了一种域名数据挖掘装置,所述域名数据挖掘装置应用于如本申请第一方面所述的域名数据挖掘方法,所述域名数据挖掘装置包括:
[0021]
创建连接模块,用于创建与redis服务器之间的连接,所述redis服务器包括任务分发模块、任务标记模块及域名去重模块;
[0022]
线程运行模块,用于运行多个爬虫线程;
[0023]
爬虫任务执行模块,用于控制每个所述爬虫线程依次从所述任务分发模块中获取一个爬取任务并执行,所述爬虫线程用于在每执行完一个爬取任务后,将该爬取任务对应的域名写入所述任务标记模块中,以标记该域名已完成爬取;
[0024]
数据解析模块,用于对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息,所述目标爬虫线程为任一爬虫线程,所述目标爬取任务为所述目标爬虫线程从所述任务分发模块中获取的任一爬取任务;
[0025]
去重模块,用于将所述目标域名信息发送至所述域名去重模块,以判断所述目标域名信息是否与已完成爬取的域名发生重复,其中,所述域名去重模块连接至所述任务标记模块,所述域名去重模块用于判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复;
[0026]
获取判断结果模块,用于获取所述域名去重模块返回的判断结果;
[0027]
去重模块,用于在所述判断结果为所述目标域名信息与所述已完成爬取的域名发生重复时,将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行;
[0028]
保存模块,用于在所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复时,将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0029]
可选的,所述创建连接模块包括:
[0030]
创建读取连接单元,用于创建与所述任务分发模块之间的读取连接;
[0031]
创建标记连接单元,用于创建与所述任务标记模块之间的标记连接;
[0032]
创建去重连接单元,用于创建与所述域名去重模块之间的去重连接。
[0033]
本申请第三方面公开了一种域名数据挖掘方法,所述域名数据挖掘方法应用于redis服务器,所述redis服务器包括任务分发模块、任务标记模块及域名去重模块,所述域名数据挖掘方法包括:
[0034]
所述任务分发模块、所述任务标记模块及所述域名去重模块分别建立与目标主机之间的连接,所述目标主机为任一台主机;
[0035]
在所述目标主机运行多个爬虫线程后,所述任务分发模块依次向所述目标主机的每个爬虫线程分发爬取任务;
[0036]
在所述爬虫线程每执行完一个爬取任务后,所述任务标记模块对该爬取任务对应的域名进行记载,以标记该域名已完成爬取;
[0037]
在接收到所述目标主机发送的目标域名信息后,所述域名去重模块判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复,并将判断结果返回至所述目标主机,所述目标主机用于在所述判断结果为是时,将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行,在所述判断结果为否时,将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行;所述目标域名信息为所述目标主机对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析所得的域名信息,所述目标爬虫线程为所述目标主机中任一爬虫线程,所述目标爬取任务为所述任务分发模块向所述目标爬虫线程分发的任一爬取任务。
[0038]
可选的,所述任务标记模块包括redis位图,所述redis位图中记载有所有已经完成爬取的域名。
[0039]
可选的,所述在所述爬虫线程每执行完一个爬取任务后,所述任务标记模块对该爬取任务对应的域名进行记载,以标记该域名已完成爬取,包括:
[0040]
获取待标记域名,所述待标记域名为所述爬虫线程在执行完一个爬取任务后,发送过来的域名;
[0041]
获取所述待标记域名的md5值;
[0042]
针对所述待标记域名的md5值,通过预设的多个哈希函数分别执行计算,得到所述待标记域名对应的多个标记位置数值;
[0043]
在所述redis位图中,将所述待标记域名对应的多个位置数值的所在位置索引置1,实现将所述待标记域名记入所述redis位图中的目的。
[0044]
可选的,所述在接收到所述目标主机发送的目标域名信息后,所述域名去重模块判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复,并将判断结果返回至所述目标主机,包括:
[0045]
在接收到所述目标主机发送的目标域名信息后,获取所述目标域名信息的md5值;
[0046]
针对所述目标域名信息的md5值,通过所述多个哈希函数分别执行计算,得到所述目标域名信息对应的多个标记位置数值;
[0047]
判断所述目标域名信息对应的多个标记位置数值在所述redis位图中的位置索引
是否均为1,若是,则获取所述判断结果为所述目标域名信息与所述redis位图中当前记载的其中一个域名发生重复;若否,则获取所述判断结果为所述目标域名信息未与所述redis位图中当前记载的任一域名发生重复;
[0048]
将所述判断结果返回至所述目标主机。
[0049]
本申请第四方面公开了一种redis服务器,所述redis服务器用于执行如本申请第三方面所述的域名数据挖掘方法,所述redis服务器包括:任务分发模块、任务标记模块及域名去重模块。
[0050]
本申请实施例公开了域名数据挖掘方法、装置及redis服务器,该方法应用于任一台主机时包括:创建与redis服务器之间的连接,运行多个爬虫线程,控制每个爬虫线程依次从任务分发模块中获取一个爬取任务并执行;对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息;将目标域名信息发送至域名去重模块,以判断目标域名信息是否与已完成爬取的域名发生重复;若重复,则将目标域名信息舍弃,控制目标爬虫线程继续从任务分发模块中获取下一个爬取任务并执行;若不重复,则将目标域名信息保存至本地存储模块,控制目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。上述方法在保存之前就将重复收集的域名数据删除,有效解决了分布式的爬虫去重问题,避免后续出现任务堆积、数据冗余的情况。
附图说明
[0051]
为了更清楚地说明本申请的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0052]
图1为本申请实施例公开的一种域名数据挖掘方法的场景示意图;
[0053]
图2为本申请实施例公开的一种域名数据挖掘方法的工作流程示意图;
[0054]
图3为本申请实施例公开的一种域名数据挖掘方法中,目标主机与redis服务器之间的连接结构示意图;
[0055]
图4为本申请实施例公开的一种域名数据挖掘方法中,目标主机与redis服务器之间的交互流程示意图。
具体实施方式
[0056]
为了解决每台主机先将收集的所有域名数据保存在本地,后续统一采用解析程序对所有主机收集的域名数据进行去重处理,将在爬取任务十分繁多的情况下,导致任务堆积,造成数据冗余的问题,本申请通过以下实施例公开了域名数据挖掘方法、装置及redis服务器。
[0057]
参见图1所示,本申请实施例公开的域名数据挖掘方法属于多台主机100与redis服务器200之间的两端交互。
[0058]
本申请第一实施例公开了一种域名数据挖掘方法,所述域名数据挖掘方法应用于任一台主机,参见图2所示的工作流程示意图,所述域名数据挖掘方法包括:
[0059]
步骤s101,创建与redis服务器之间的连接,所述redis服务器包括任务分发模块、任务标记模块及域名去重模块。
[0060]
具体的,所述创建与redis服务器之间的连接,包括:
[0061]
创建与所述任务分发模块之间的读取连接。
[0062]
创建与所述任务标记模块之间的标记连接。
[0063]
创建与所述域名去重模块之间的去重连接。
[0064]
步骤s102,运行多个爬虫线程。
[0065]
步骤s103,控制每个所述爬虫线程依次从所述任务分发模块中获取一个爬取任务并执行,所述爬虫线程用于在每执行完一个爬取任务后,将该爬取任务对应的域名写入所述任务标记模块中,以标记该域名已完成爬取。
[0066]
其中,使用redis封装的对象进行爬取任务读取,即对redis封装对象加锁,由于爬虫线程的时间消耗主要在处理网络请求,因此对redis封装对象加锁能够减少多个爬虫线程共同操作redis服务器,避免同时从任务分发模块中获取爬取任务,减小对多个爬虫线程任务获取的影响。
[0067]
实际操作中,如果爬虫线程读取到爬取任务,则执行该爬虫流程,完成域名爬取。如果爬虫线程获取任务为空,那么将等待一段时间之后再次获取,直到获取到任务;如果读取到任务为
“-
1”,代表所有爬虫任务全部结束,此时,控制当前爬虫线程退出流程,当前爬虫线程退出的同时,将再次写入
“-
1”到任务分发模块的任务队列,方便本机其它爬虫线程或者分布式的其它主机中爬虫线程依次退出任务处理流程。
[0068]
步骤s104,对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息,所述目标爬虫线程为任一爬虫线程,所述目标爬取任务为所述目标爬虫线程从所述任务分发模块中获取的任一爬取任务。
[0069]
具体的,目标爬虫线程读取到爬取任务时,首先尝试http协议访问,在网络出错的情况下切换为https协议再次尝试,并返回响应数据,如果响应数据不可处理,将继续读取下一个爬取任务。如果响应数据可处理,则针对该响应数据进行解析,获取对应的目标域名信息。
[0070]
步骤s105,将所述目标域名信息发送至所述域名去重模块,以判断所述目标域名信息是否与已完成爬取的域名发生重复,其中,所述域名去重模块连接至所述任务标记模块,所述域名去重模块用于判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复。
[0071]
本申请实施例中,采用布隆过滤器方法结合redis位图方式,实现域名的分布式去重。在爬虫线程执行完爬取任务时,将该爬取任务对应的域名写入任务标记模块的redis位图中,然后采用域名去重模块中的布隆过滤器判断目标域名信息是否存在redis位图中。其中,布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数,可以用于检索一个元素是否在一个集合中,空间效率和查询时间都比一般的算法要好的多。
[0072]
去重的流程分为两部分,第一部分在于将已完成爬取的域名写入redis位图中,第二部分在于通过布隆过滤器判断目标域名信息是否存在redis位图中。
[0073]
首先针对第一部分进行说明:任务标记模块获取待标记域名,所述待标记域名为所述爬虫线程在执行完一个爬取任务后,发送过来的域名。获取所述待标记域名的md5值。针对所述待标记域名的md5值,通过预设的多个哈希函数分别执行计算,得到所述待标记域名对应的多个标记位置数值。在所述redis位图中,将所述待标记域名对应的多个位置数值
的所在位置索引置1,实现将所述待标记域名记入所述redis位图中的目的。
[0074]
其次针对第二部分进行说明:域名去重模块在接收到所述目标主机发送的目标域名信息后,获取所述目标域名信息的md5值。针对所述目标域名信息的md5值,通过所述多个哈希函数分别执行计算,得到所述目标域名信息对应的多个标记位置数值。判断所述目标域名信息对应的多个标记位置数值在所述redis位图中的位置索引是否均为1,若是,则获取所述判断结果为所述目标域名信息与所述redis位图中当前记载的其中一个域名发生重复。若否,则获取所述判断结果为所述目标域名信息未与所述redis位图中当前记载的任一域名发生重复。
[0075]
作为示例,本申请采用七个不同的哈希函数和redis 512m大小的位图结合,可以在九千万数据上面去重有较好的效果,后续随着数据量增加可以更换逻辑,以适应更多数据去重要求。
[0076]
步骤s106,获取所述域名去重模块返回的判断结果。
[0077]
步骤s107,若所述判断结果为所述目标域名信息与所述已完成爬取的域名发生重复,则将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0078]
步骤s108,若所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复,则将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0079]
进一步的,在运行多个爬虫线程的同时,所述域名数据挖掘方法还包括:
[0080]
运行保存线程,所述保存线程用于在所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复时,执行将所述目标域名信息保存至本地存储模块的步骤。
[0081]
实际应用中,爬虫程序是多线程开发,可以进行三个操作:

新建爬虫线程(根据配置文件指定线程数量);

新建一个保存线程,用于保存结果数据;

在主线程循环监听爬虫线程和保存线程的工作情况,如果爬虫线程全部退出,那么将全局线程工作状态标记已完成,方便保存线程处理完成保存任务之后,退出任务。
[0082]
上述实施例公开了域名数据挖掘方法,该方法应用于任一台主机,包括:创建与redis服务器之间的连接,运行多个爬虫线程,控制每个爬虫线程依次从任务分发模块中获取一个爬取任务并执行;对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息;将目标域名信息发送至域名去重模块,以判断目标域名信息是否与已完成爬取的域名发生重复;若重复,则将目标域名信息舍弃,控制目标爬虫线程继续从任务分发模块中获取下一个爬取任务并执行;若不重复,则将目标域名信息保存至本地存储模块,控制目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。上述方法在获取海量url数据时,将单机单线程爬虫转变为可拓展的分布式爬虫,解决了数据处理不及时的问题。并将结合布隆过滤器来解决分布式爬虫数据去重问题,在保存之前就将重复收集的域名数据删除,有效解决了分布式的爬虫去重问题,避免后续出现任务堆积、数据冗余的情况。而且也降低了对计算机内存的强依赖。通过官方数据,结合redis每个bitmap限制大小是512m,512m可以对9千万数据进行很好的重复判断。
[0083]
redis位图和布隆过滤器实现的去重方法可同时使用在任务分发和域名数据挖掘方面,解决了分布式爬虫上的任务处理完成标记,每台主机仅需要对redis服务器进行较小
的操作,并可完成标记,后续方便统计和过滤已经完成的爬虫任务,解决了分布式爬虫数据去重难的问题,多台主机仅需要将自己收集的数据通过redis位图标记,完成已有数据标记,其它主机读取redis服务器即可知道收集的域名是否重复。
[0084]
下述为装置实施例,与本申请第一实施例公开的方法实施例相对应,对于下述装置实施例未公开的细节,请参照本申请第一实施例。
[0085]
本申请第二实施例公开了一种域名数据挖掘装置,所述域名数据挖掘装置应用于如本申请第一实施例所述的域名数据挖掘方法,所述域名数据挖掘装置包括:
[0086]
创建连接模块,用于创建与redis服务器之间的连接,所述redis服务器包括任务分发模块、任务标记模块及域名去重模块。
[0087]
线程运行模块,用于运行多个爬虫线程。
[0088]
爬虫任务执行模块,用于控制每个所述爬虫线程依次从所述任务分发模块中获取一个爬取任务并执行,所述爬虫线程用于在每执行完一个爬取任务后,将该爬取任务对应的域名写入所述任务标记模块中,以标记该域名已完成爬取。
[0089]
数据解析模块,用于对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息,所述目标爬虫线程为任一爬虫线程,所述目标爬取任务为所述目标爬虫线程从所述任务分发模块中获取的任一爬取任务。
[0090]
去重模块,用于将所述目标域名信息发送至所述域名去重模块,以判断所述目标域名信息是否与已完成爬取的域名发生重复,其中,所述域名去重模块连接至所述任务标记模块,所述域名去重模块用于判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复。
[0091]
获取判断结果模块,用于获取所述域名去重模块返回的判断结果。
[0092]
去重模块,用于在所述判断结果为所述目标域名信息与所述已完成爬取的域名发生重复时,将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0093]
保存模块,用于在所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复时,将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0094]
进一步的,所述创建连接模块包括:
[0095]
创建读取连接单元,用于创建与所述任务分发模块之间的读取连接。
[0096]
创建标记连接单元,用于创建与所述任务标记模块之间的标记连接。
[0097]
创建去重连接单元,用于创建与所述域名去重模块之间的去重连接。
[0098]
本申请第三实施例公开了一种域名数据挖掘方法,所述域名数据挖掘方法应用于redis服务器,所述redis服务器包括任务分发模块、任务标记模块及域名去重模块,所述域名数据挖掘方法包括:
[0099]
所述任务分发模块、所述任务标记模块及所述域名去重模块分别建立与目标主机之间的连接,所述目标主机为任一台主机。
[0100]
在所述目标主机运行多个爬虫线程后,所述任务分发模块依次向所述目标主机的每个爬虫线程分发爬取任务。
[0101]
在所述爬虫线程每执行完一个爬取任务后,所述任务标记模块对该爬取任务对应
的域名进行记载,以标记该域名已完成爬取。
[0102]
在接收到所述目标主机发送的目标域名信息后,所述域名去重模块判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复,并将判断结果返回至所述目标主机,所述目标主机用于在所述判断结果为是时,将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行,在所述判断结果为否时,将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。所述目标域名信息为所述目标主机对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析所得的域名信息,所述目标爬虫线程为所述目标主机中任一爬虫线程,所述目标爬取任务为所述任务分发模块向所述目标爬虫线程分发的任一爬取任务。
[0103]
进一步的,所述任务标记模块包括redis位图,所述redis位图中记载有所有已经完成爬取的域名。
[0104]
进一步的,所述在所述爬虫线程每执行完一个爬取任务后,所述任务标记模块对该爬取任务对应的域名进行记载,以标记该域名已完成爬取,包括:
[0105]
获取待标记域名,所述待标记域名为所述爬虫线程在执行完一个爬取任务后,发送过来的域名。
[0106]
获取所述待标记域名的md5值。
[0107]
针对所述待标记域名的md5值,通过预设的多个哈希函数分别执行计算,得到所述待标记域名对应的多个标记位置数值。
[0108]
在所述redis位图中,将所述待标记域名对应的多个位置数值的所在位置索引置1,实现将所述待标记域名记入所述redis位图中的目的。
[0109]
进一步的,所述在接收到所述目标主机发送的目标域名信息后,所述域名去重模块判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复,并将判断结果返回至所述目标主机,包括:
[0110]
在接收到所述目标主机发送的目标域名信息后,获取所述目标域名信息的md5值。
[0111]
针对所述目标域名信息的md5值,通过所述多个哈希函数分别执行计算,得到所述目标域名信息对应的多个标记位置数值。
[0112]
判断所述目标域名信息对应的多个标记位置数值在所述redis位图中的位置索引是否均为1,若是,则获取所述判断结果为所述目标域名信息与所述redis位图中当前记载的其中一个域名发生重复。若否,则获取所述判断结果为所述目标域名信息未与所述redis位图中当前记载的任一域名发生重复。
[0113]
将所述判断结果返回至所述目标主机。
[0114]
本申请第四实施例公开了一种redis服务器,所述redis服务器用于执行如本申请第三实施例所述的域名数据挖掘方法,参见图3所示,所述redis服务器200包括:任务分发模块2001、任务标记模块2002及域名去重模块2003。
[0115]
其中,任务分发模块2001、任务标记模块2002及域名去重模块2003分别接至目标主机100,域名去重模块2003与任务标记模块2002相连接。
[0116]
图4为本申请实施例公开的域名数据挖掘过程中,目标主机与redis服务器之间的交互流程,其中,目标主机为任一台主机:
[0117]
步骤1001,目标主机分别创建与redis服务器中任务分发模块、任务标记模块及域名去重模块的连接;
[0118]
步骤1002,目标主机运行多个爬虫线程;
[0119]
步骤1003,目标主机控制每个所述爬虫线程依次从所述任务分发模块中获取一个爬取任务;
[0120]
步骤1004,目标主机控制每个爬虫线程执行获取到的爬取任务;
[0121]
步骤1005,目标主机控制爬虫线程在每执行完一个爬取任务后,将该爬取任务对应的域名发送至所述任务标记模块中;
[0122]
步骤1006,任务标记模块将接收到的域名写入redis位图中,完成该域名的标记;
[0123]
步骤1007,目标主机对目标爬虫线程执行完目标爬取任务后所返回的响应数据进行解析,获取对应的目标域名信息;
[0124]
步骤1008,目标主机将所述目标域名信息发送至所述域名去重模块,以判断所述目标域名信息是否与已完成爬取的域名发生重复;
[0125]
步骤1009,域名去重模块根据任务标记模块中的redis位图,判断所述目标域名信息是否与所述任务标记模块中当前记载的其中一个域名发生重复;
[0126]
步骤1010,域名去重模块将判断结果返回至目标主机;若所述判断结果为所述目标域名信息与所述已完成爬取的域名发生重复,目标主机执行步骤1011;若所述判断结果为所述目标域名信息未与所述已完成爬取的域名发生重复,目标主机执行步骤1012;
[0127]
步骤1011,目标主机将所述目标域名信息舍弃,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行;
[0128]
步骤1012,目标主机将所述目标域名信息保存至本地存储模块,控制所述目标爬虫线程继续从所述任务分发模块中获取下一个爬取任务并执行。
[0129]
上述实施例公开的域名数据挖掘方法,可以使得分布式爬虫更为简单,并把各个流程分离出来,简化程序,解决了分布式的爬虫去重问题,降低了域名去重的内存消耗,为更多数据去重提供了基础,分布式可以让任意可连接到分布式网络的主机,随意加入任务,退出任务,单节点出现问题,不影响整个流程。
[0130]
以下结合具体示例,对本申请公开的域名数据挖掘方法进行说明:
[0131]
一、爬虫程序
[0132]
1.开启爬虫程序,在支持python环境的计算机执行“python domain_spider_th.py”,程序运行并开始初始化工作,如下:
[0133]
创建redis任务连接:用于任务读取,指定读队列url_task_queue key存储的内容;其中,url_task_queue用于程序使用读取redis对应的任务,如果这个为空,redis返回空,如果为负一代表没有更多的任务,结束;
[0134]
创建redis位图连接:用于域名去重,包含两个,url_task_finished_map和url_unique_map;其中url_task_finished_map用于程序爬取到html数据,而解析html得到的的域名去重服务,url_unique_map用于程序对任务完成进行标记,功能和url_task_finished_map一样,但是是用于对任务进行去重的;
[0135]
创建多个爬虫线程:根据配置文件配置的线程数量,创建一定数量的爬虫线程用于任务处理;
[0136]
创建一个保存线程和消息队列对象:用于读取和保存解析到的域名,消息队列就是实现的按序存储,按序读取的一种数据结构,任务处理线程多线程同步写入消息队列,然后保存线程依次读取保存;
[0137]
主线程启动任务线程监听:主线程按一定时间循环检查爬虫线程是否存活(当任务处理线程出现错误或读取到退出任务(负一),线程将退出,不在存活),方便整个程序退出。
[0138]
2.爬虫线程在有锁的的情况下访问redis数据库读取任务(url_task_queue)并处理:
[0139]
假设当前爬虫线程读取到任务:www.baidu.com,那么该爬虫线程将对其进行模型浏览器访问网页操作,将会获取到百度的网页html数据,爬虫到此完成,此时将www.baidu.com按照布隆过滤器方法写入redis的url_task_finished_map位图存储起来,然后对其html数据解析操作;
[0140]
假设当前爬虫线程读取为空:那么爬虫线程将进入一定时间睡眠,然后重试;
[0141]
假设当前爬虫线程读取到负一(-1):那么当前爬虫线程将停止,停止同时将写入-1到url_task_queue,这样方便其他线程,甚至是其他机器的线程结束任务,释放计算机资源。
[0142]
3.html解析:使用步骤2中获取的html数据进行,主要是针对海量数据收集所想的方案,网络数据都是存在联系的,比如很多网站都存在友情连接,所以对html标签进行解析操作,如下所示:
[0143]
<html>
[0144]
<a href=”news.baidu.com”>百度新闻</a>
[0145]
</html>
[0146]
对上述的标签进行解析,以取到href里边的news.baidu.com,这就是海量数据收集的方案,以此获取更多的域名数据。
[0147]
程序将收集的域名使用redis连接对url_unique_map进行判断重复操作,如果重复那么将剔除这个域名,然后将去重的域名写入消息队列,方便保存线程保存,此例中将写入news.baidu.com。
[0148]
4.保存线程,主要读取上述写入消息队列的域名信息,然后做本地保存操作,线程循环读取消息队列,进行操作:
[0149]
若读取到空:那么保存线程依然进入一定时间的睡眠,然后重新尝试读取;
[0150]
若读取到news.baidu.com:保存线程将此域名写入本地硬盘指定文件;
[0151]
若读取到负一(-1):代表所有爬虫线程都结束,没有新的域名需要保存了,保存线程退出,然后整个程序退出;
[0152]
保存线程运行过程中一直打开指定文件,降低文件频繁操作操作,保存线程作为所有爬虫线程结束标志,保证了收集的域名完全保存(如果全部线程一起结束,那么消息队列的域名还没有读取完就会丢失)。
[0153]
二、任务分发程序
[0154]
任务分发程序主要就是读取需要爬取的域名,然后判断是否已经爬取过了,写入redis的任务队列url_task_queue:
[0155]
程序启动,读取本地服务器需要爬虫的域名,并同时启动redis连接,假设当前需要写入的任务是:www.baidu.com;
[0156]
程序将使用redis的url_task_finished_map位图判断www.baidu.com是否存在主机标识其处理过了(机制和去重是一样的,即判断www.baidu.com计算的7个数值对应的位图位置值是否都为1,都为1代表处理过了,又一个不为1说明是全新的任务),如果已经处理过了,那么将跳过进行下一个任务写入,反之将写入任务队列url_task_queue,以供任务处理程序中的任务处理线程读取处理,至此就是一个循环;
[0157]
如果程序发现本地没有需要处理的任务了,那么将写入-1到url_task_queue,告知分布式程序结束任务。
[0158]
三、去重程序
[0159]
去重程序包含两个去重地方,其原理一样,此处就说明爬虫任务www.baidu.com处理完成之后如何写入redis进行分布式去重,结合布隆过滤器,降低内存占用。
[0160]
布隆过滤器是公开的一个办法,目的是解决各种海量数据判断的,快捷并且占用内存较少。主要是使用一个长的字节数组(初始化数组内均为0),通过几个不同的哈希(hash)函数将一个数据标记在这个长的数组中,比如使用7个hash函数,将www.baidu.com计算得到7个数值,然后将7个数值对应的数组的索引(位置)置位1,就将数据写入布隆数组了。最终按照相同的办法,计算www.baidu.com的7个hash,然后判断数组这7个位置都为1,说明该数据已经写过了,下面将详细说明:
[0161]
(一)写入redis位图
[0162]
1.首先将www.baidu.com计算md5值:dab19e82e1f9a681ee73346d3e7a575e,md5也是一种hash,目的是为了更好的处理去重。
[0163]
2.由于redis位图大小限制为512,根据官方计算公式,可以对9千万有很好的去重效果,本例中直接使用这种方案,选择7个hash函数来实现,具体实现就是采用7个数值,对上述md5值单字节(d)获取ascii(ascii就是字符在计算机中的表示形式,计算机存储的是二进制数据,如何表示abcd,可以使用二进制比如01100001表示a。)数值(100),数值*ascii值加上下一个字节(a)的ascii值,循环,得到一个数值(就是长数组的索引位置),如下计算结果:
[0164]

:667219847
[0165]

:471206349
[0166]

:784538769
[0167]

:841098607
[0168]

:875258629
[0169]

:1592738343
[0170]

:1959775
[0171]
3.然后通过redis连接将url_task_finished_map上述7个值的数组位置设置为1,至此标记完成。
[0172]
(二)判断重复
[0173]
判断重复和写入redis位图一样,只不过这次不在将位图设置为1了,而是判断计算的7个数组对应的位图位置是否都为1,如果都为1说明存在,如果有一个不为1说明不存
在,以此判断是否重复。因为相同的字符,比如www.baidu.com计算md5每次都一样,按照相同的7个hash计算得出的7个数组也是不会变化的,所以相反就能判断是否已经写过了。
[0174]
本申请实施例公开的域名数据挖掘方法将任务分发程序单独出来,方便任务分发流程修改,对任务处理程序影响较小,分布式任务处理只关心如何爬虫处理保存数据,而不用关注任务分发程序的详细流程,比如任务量多少,写入阈值等。使用redis作为数据的中间件,提供了高可用性的任务分发/中间数据存储,其自动的数据备份和恢复操作,将减少程序维护工作。将redis队列和位图的操作再封装,使得线程处理更为便捷,并整合连接丢失自动检查恢复操作,结合多线程锁机制,在任务为空或网络故障,降低了多线程频繁操作redis。使用一个单独的线程来对本机的数据进行保存操作,任务多线程处理任务并写入队列(线程安全),然后保存线程将打开一个数据文件进行保存操作,降低了多线程同时操作文件出现的风险。
[0175]
以上结合具体实施方式和范例性实例对本申请进行了详细说明,不过这些说明并不能理解为对本申请的限制。本领域技术人员理解,在不偏离本申请精神和范围的情况下,可以对本申请技术方案及其实施方式进行多种等价替换、修饰或改进,这些均落入本申请的范围内。本申请的保护范围以所附权利要求为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1