前言
任何刚接触爬虫编程的朋友可能都熟悉或者或多或少了解过基于 Python 异步框架 Twisted 的爬虫框架 Scrapy。Scrapy 发展了将近 7 年,是爬虫框架中的开山鼻祖,自然而然成为最受欢迎的也是应用最广的爬虫框架。对于 Scrapy 来说,其天然的优势是支持并发,而且集成了 HTTP 请求、下载、解析、调度等爬虫程序中常见的功能模块,让爬虫工程师只专注于页面解析和制定抓取规则,在当时极大的简化了爬虫开发流程,提高了开发效率。
但是,Scrapy 并不是完美的,它仍然有不少缺点。其中,它的模版定制化成为了制约 Scrapy 爬虫项目的双刃剑:一方面,Scrapy 抽象出了各种必要的模块,包括爬虫(Spider)、抓取结果(Item)、中间件(Middleware)、管道(Pipeline)、设置(Setting)等,让用户可以直接上手按照一定规则编写自己想要开发的爬虫程序;另一方面,这些高度抽象的模块让整个爬虫项目显得比较臃肿,每个爬虫项目都需要按照相应的模版生成好几个文件,导致配置、爬虫等管理起来相对比较混乱。而且,Scrapy 在一些特殊场景例如分布式抓取时显得心有余而力不足,因此很多高级爬虫工程师甚至需要更改 Scrapy 源码来满足业务要求。
为了解决这些问题,基于静态语言 Golang 的爬虫框架 Colly 在 2017 年末诞生了。虽然它的名气和受欢迎程度还不及 Scrapy,但在试用之后我发现它有一个最特别的优势:简单(Easiness)。根据 Colly 官网上的特性介绍,它有清爽的 API(Clean API),快速(Fast),天然支持分布式(Distributed),同步/异步/并行抓取(Sync/async/parallel scraping),丰富的扩展(Extensions),以及更多特性。作者在简单的看了 Colly 的文档之后,尝试用 Colly 编写一些相对简单的爬虫程序,发现编写完毕后,每个网站的代码只包含一个文件。简而言之,它相当轻量级,不需要特别多的冗余代码就可以实现自己想要的逻辑。
下图是 Colly 和 Scrapy 在 Github 的 Star 数对比。可以看到 Colly 发展较晚,star 数不到 Scrapy 的三分之一,但还在高速增长当中。本文将着重介绍这个年轻而强大的爬虫框架: Colly。
静态语言 Golang
Colly 是基于静态语言 Golang 开发的。众所周知,Golang 也是一个比较年轻的语言,仅有 13 年历史(相较而言,Python 有将近 30 年历史)。Golang 天然支持并发(Concurrency),要起一个协程(Coroutine),只需要在调用函数前加一个 go 关键词即可,非常简单。当然,Golang 还有其他很棒的特性,例如通道(chan)。不过对于爬虫来说支持并发是非常重要的,因为一个高效的爬虫需要尽可能多的占用网络带宽资源,Golang 的并发特性给编写爬虫框架来说带来了优势。反观 Python,如果要实现