zhshch2002/goribot: [Crawler/Scraper for Golang]Make a Golang spider in 3 lines是我的一个业余项目,目的是能尽可能简洁的使用Golang开发爬虫应用。

注意:这个项目正处于beta版本,不建议直接使用在重要项目上。Goribot的功能都经过测试,如果有问题欢迎来提issues。

安装

访问网络

不需要冗长的初始化和配置过程,使用goribot的基本功能只需要三步。

goribot执行的基本单位是TaskTask是一个回调函数和请求参数的包装。s.NewTask()创建了一个Task并作为种子地址添加到任务队列里。

Spider有一个ThreadPoolSize参数,大意是Spider会根据创建一个虚拟线程池,也就是维护ThreadPoolSizegoroutine

每个goroutine都会从创建开始依次执行 获取新的Task->发送网络请求并获取Response->顺序执行Task里的回调函数(也就是onRespHandlers)->收集Context中新的TaskItem->结束。

关于Context

由刚才的例子,回调函数收到的数据是ctx *goribot.Context,这是对网络响应数据和一些操作的包装。

在这里蜘蛛会试着把收到的数据转换为字符串也就是Text属性,之后会试着将其解析为HTML或者JSON,如果成功的话就可以通过HtmlJson参数获取到。

像之前使用spider.NewTask()向蜘蛛任务队列添加新任务,在回调函数里应该使用ctx.NewTask()创建新的任务。蜘蛛会在所有回调函数执行结束后将ctx里保存的新任务收集起来添加到队列里。

添加新任务时可以使用spider.NewTaskWithMetactx.NewTaskWithMeta,由此可以设置创建的TaskMeta数据,即一个map[string]interface{}字典。之后在任务执行过程中创建的Context也会携带这个Meta参数,以此作为新老Task之间的数据传递。

ContextMeta参数同时可以用作数个回调函数和钩子函数之间的数据传递。

钩子函数 与 扩展插件

spider提供一系列钩子函数的挂载点,可以在一个任务执行的不同时间进行处理。

Tip:这些钩子函数并非是一个而是一列,可以通过多次调用上述函数来设置多个钩子。钩子函数的执行顺序也会按照其被注册的顺序执行。

插件或者叫扩展指的是在执行s := goribot.NewSpider()时可以传入的一种函数参数。这个函数在创建蜘蛛时被执行,用来配置蜘蛛的参数或者增加钩子函数。例如内建的HostFilter扩展源码如下。

存储

不建议在回调函数内存储数据,所以ctx提供ctx.AddItem函数用于添加一些数据到ctx中保存,执行到最后spider会收集他们并调用OnItem钩子函数。

复杂一些的例子——哔哩哔哩爬虫

这是一个用于爬取哔哩哔哩视频的蜘蛛。

本文原始发布于 使用 Goribot 快速构建 Golang 爬虫 - AthorX - 仰望星空 如若信息变动请以链接内版本为准。

参与投票 0
标签
类别
功能建议
状态
进行中
发布时间
20191014