爬虫技术实战

0x00 前言


项目开源地址: https://github.com/manning23/MSpider

上篇文章《爬虫技术浅析》介绍了爬虫的基本技术,分享了一个动态爬虫demo。这篇文章主要讲解爬虫技术的实战效果。 本次介绍的结果如下:

  • 1.爬虫的URL聚焦与过滤

  • 2.URL相似度算法抛砖引玉

  • 3.爬行策略详解

  • 4.Mspider工具使用说明及效果展示

  • 5.Mspider的头脑风暴

0x01 爬虫的URL聚焦与过滤


为什么爬虫需要URL聚焦与过滤?因为我们需要控制预期结果!

举个例子,如果爬行的目的是爬取乌云已知漏洞列表,那么一般类型的爬虫是无法满足的,一般爬虫会进行如下形式的爬取。爬取的URL是杂乱的。

enter image description here

聚焦爬虫爬取的URL是符合预期的。如下图展示。

enter image description here

可以看出来,聚焦爬虫和非聚焦爬虫都是从www.wooyun.org开始爬取,聚焦爬虫可以按照一定策略尽量控制URL爬取策略,而非聚焦爬虫却完成不了这种特定需求。

在爬虫过滤模块中,我们需要理解什么是过滤,什么是聚焦。简单的说,如果过滤关键字在url中,则返回False,否则返回True。如果聚焦关键字在url中,则返回True,否则返回False。具体可以查看Mspider中的urlfilter.py文件。

0x02 URL相似度算法抛砖引玉


URL相似度算法在爬虫里不言而喻,这个算法直接决定着爬虫的爬行效率,我将讲解一下我的算法,算是抛砖引玉。

enter image description here

这个算法主要是依靠对URL的拆解与对拆解对象的HASH,这个算法适用类似的需求常见。这个算法是将一个URL拆解为三个维度,第一个维度是netloc,第二个维度是path的各项长度,第三个维度是query对象的参数排序后列表。通过一个数据结构对以上三个维度组合,构建一个可hash的对象。

enter image description here

利用集合数据结构进行去重,这个能大幅减小普通URL相似度算法对于hash后结果冲突的问题。实际效果如下图。

enter image description here

当爬取了875个链接时,实际相似页面已达到了269849个,因此对于爬虫效率来讲,是个很好的提升。

这个算法只是实际经验值,实践后得到良好的实际效果,希望大家也能思考更为优秀的相似度算法。

0x03 爬行策略详解


一般爬行策略为广度优先、深度优先。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。

下面图中的数字显示了深度优先搜索顶点被访问的顺序。  

enter image description here

下面图中的数字显示了广度优先搜索顶点被访问的顺序。

enter image description here

Mspider中实现爬行策略,这三种搜索方式都是通过对URL队列的排序方式进行调整,通过队列中URL结点的深度参数进行调整,来达到需求目的,爬行策略根据不同需求设置,能更快的发现可疑URL链接。

enter image description here

上图当爬行了810个链接时,实际爬行的深度已达到了15层。在实际测试过程中,深度优先爬行能更好的发现可疑链接。

0x04 Mspider工具使用说明及效果展示


Mspider是本人开发的一个以CLI方式运行的爬虫工具。此爬虫实现了如下功能。希望大家多多star和fork。也欢迎大家随时给我邮箱发送邮件提bug。

enter image description here

CLI下展示如下:

enter image description here

此爬虫还可以通过文件的config.py进行更详细的配置,比如爬行间隔,忽略标签列表,动静分配比例,user-agent字典等。

enter image description here

提供几个测试场景:

爬行乌云白帽子列表

命令:

[cce]#!bash
python run.py -u “http://www.wooyun.org” -k “wooyun.org” –focus “whitehats” –similarity 1 –storage 3
[/cce]

效果:

enter image description here

深度优先爬行edu站点,进行url相似度过滤,爬行个数为500个

命令:

[cce]#!bash
python -u run.py “http://www.njtu.edu.cn/” -k “edu.cn” –policy 1 –storage 0 –count 500
[/cce]

效果:

enter image description here

爬行联想域名内连接,域名过滤bbs关键字,动态爬行网页,随机优先策略

命令:

[cce]#!bash
python run.py -u “lenovo” -k “lenovo” –ignore “bbs” –model 1 –policy 2
[/cce]

效果:

enter image description here

0x05 Mspider的头脑风暴


通过改写Mspider的一些功能,比如页面分析模块,URL过滤模块,数据储存模块,可以获得更深入更有意思的信息。

举个例子,想要获取乌云中sql注入类型漏洞的SQL注入payload。在聚焦爬虫中,通过对改写数据储存模块,让数据库记录获取的dom树,并储存,接着对dom树进行数据挖掘,便可简单实现。

0x06 参考文章


基于URL规则的聚焦爬虫及其应用

图的深度优先和广度优先搜索

Comment

评论:我觉得对于开发者来说,能脚本化编写爬虫是一件挺开心的事情( ̄▽ ̄)”。所以我们团队开发了一个专门让开发者用简单的几行 javascript 就能在云上编写和运行复杂爬虫的系统,叫神箭手云爬虫开发平台: http://www.shenjianshou.cn 。欢迎同行们来试用拍砖,尽情给俺们提意见。有想法的可以加群讨论: 342953471

评论:为什么github下载的和文章里说的差异这么大呀?是修改过的?入库这些功能都舍弃了?
PS:看了下crawl.py的代码,form里的post行的link是不爬取的?

评论:坐等楼主下一篇文章 ^_^

评论:要是能支持AJAX爬行就好了

评论:菜鸟一枚,请教一下,爬行过程中哪个模块或是哪个函数是控制url去重的?

评论:接受!我记下来!

评论:SIMILARITY与STORAGE_MODEL之间是不是做约束比较好,
要不SIMILARITY=0 && STORAGE_MODEL=0或者
SIMILARITY=1 && STORAGE_MODEL=1
都不会存储

评论:说的太绝对了吧?你仔细看代码了吗?

评论:你的那个去相似度..跟我用都差不多.
其实很鸡肋的
现在很多站点都是伪静态.各种二级目录.通过过滤完全无法处理.
我也在思考这一块。
想过用HTML里的一些 元素做判断、
额不说了- -LOL了

评论:python 2.7 运行报错。。

评论:学习学习

评论:python版本是多少?

评论:挺屌,可扩展做的好的话能做很多事^_^

评论:考虑了这个问题,一懒就没移植…其实爬了很多网站,基本都是200w内重复数量,set不用考虑冲突的问题

评论:用set去重不如用bloom filter

评论:66666666

发表评论

电子邮件地址不会被公开。 必填项已用*标注