# 乌云归档：爬虫技术实战

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-04-03T01:21:00Z
Canonical: https://wepostx.com/topics/775

> 乌云历史资料归档
>
> **原始作者：** Manning
> **原始编号：** superkieran-wooyundrops:527
> **原始发布时间：** 2015-04-03 09:21
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 前言

项目开源地址: https://github.com/manning23/MSpider
上篇文章《爬虫技术浅析》介绍了爬虫的基本技术，分享了一个动态爬虫demo。这篇文章主要讲解爬虫技术的实战效果。 本次介绍的结果如下：

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

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

- 3.爬行策略详解

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

- 5.Mspider的头脑风暴

# 0x01 爬虫的URL聚焦与过滤

为什么爬虫需要URL聚焦与过滤？因为我们需要控制预期结果！
举个例子，如果爬行的目的是爬取乌云已知漏洞列表，那么一般类型的爬虫是无法满足的，一般爬虫会进行如下形式的爬取。爬取的URL是杂乱的。

![原文图片](/media/2016/06/ba95eb62c4563853de03625b39608313)

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

![原文图片](/media/2016/06/4bce2a5ebfe89ab9c70e70270c5e1efd)

可以看出来，聚焦爬虫和非聚焦爬虫都是从www.wooyun.org开始爬取，聚焦爬虫可以按照一定策略尽量控制URL爬取策略，而非聚焦爬虫却完成不了这种特定需求。
在爬虫过滤模块中，我们需要理解什么是过滤，什么是聚焦。简单的说，如果过滤关键字在url中，则返回False，否则返回True。如果聚焦关键字在url中，则返回True，否则返回False。具体可以查看Mspider中的urlfilter.py文件。

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

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

![原文图片](/media/2016/06/de397b3f8445acf52f89683f8a19a7af)

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

![原文图片](/media/2016/06/01133a599bd81eec44aebbee47176975)

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

![原文图片](/media/2016/06/1726c6b4b52621e0a30d73d023f8a1ee)

当爬取了875个链接时，实际相似页面已达到了269849个，因此对于爬虫效率来讲，是个很好的提升。
这个算法只是实际经验值，实践后得到良好的实际效果，希望大家也能思考更为优秀的相似度算法。

# 0x03 爬行策略详解

一般爬行策略为广度优先、深度优先。深度优先搜索通过栈来实现，而广度优先搜索通过队列来实现。
下面图中的数字显示了深度优先搜索顶点被访问的顺序。

![原文图片](/media/2016/06/90705501863eedc624573bb6c9bef8d0)

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

![原文图片](/media/2016/06/a00a55203e90ad2f71b00669f0863d9a)

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

![原文图片](/media/2016/06/37da15e3e9c235db83a8861ecdd8e3a6)

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

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

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

![原文图片](/media/2016/06/0bf785d72b7895c54b2bd69bbfce5107)

CLI下展示如下：

![原文图片](/media/2016/06/4ff7c901ea1d9bb3cb19169f3f61e6de)

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

![原文图片](/media/2016/06/b52b4a3d2c103f467d303046ff07c69c)

提供几个测试场景：

## 爬行乌云白帽子列表
命令：

```text
#!bash python run.py -u "http://www.wooyun.org" -k "wooyun.org" --focus "whitehats" --similarity 1 --storage 3
```
效果：

![原文图片](/media/2016/06/8d555714216b239212cfc9952e594aa9)

## 深度优先爬行edu站点，进行url相似度过滤，爬行个数为500个
命令：

```text
#!bash python -u run.py "http://www.njtu.edu.cn/" -k "edu.cn" --policy 1 --storage 0 --count 500
```
效果：

![原文图片](/media/2016/06/290771c4e4f8f7cc028ee20faf869ba5)

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

```text
#!bash python run.py -u "lenovo" -k "lenovo" --ignore "bbs" --model 1 --policy 2
```
效果：

![原文图片](/media/2016/06/331749d1b3496b0d59242a82580124bd)

# 0x05 Mspider的头脑风暴

通过改写Mspider的一些功能，比如页面分析模块，URL过滤模块，数据储存模块，可以获得更深入更有意思的信息。
举个例子，想要获取乌云中sql注入类型漏洞的SQL注入payload。在聚焦爬虫中，通过对改写数据储存模块，让数据库记录获取的dom树，并储存，接着对dom树进行数据挖掘，便可简单实现。

# 0x06 参考文章

[基于URL规则的聚焦爬虫及其应用](http://www.docin.com/p-784393108.html)
[图的深度优先和广度优先搜索](http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591331.html)

## Replies
