如果任务非常复杂或具有不同类型的子任务,建议对一个抓取作业使用多个收集器。一个很好的例子是coursera的课程scraper,其中使用了两个收集器——一个解析列表视图并处理分页,另一个收集课程细节。
Colly有一些内置方法来支持多个收集器的使用。
提示
使用collector.ID在调试中区分不同的收集器
克隆采集器
如果采集器具有类似的配置,则可以使用收集器的Clone()方法。Clone()复制具有相同配置但没有附加回调的采集器。
c := colly.NewCollector(
colly.UserAgent("myUserAgent"),
colly.AllowedDomains("foo.com", "bar.com"),
)
// Custom User-Agent and allowed domains are cloned to c2
c2 := c.Clone()
在采集器之间传递自定义数据
使用采集器的Request()函数能够与其他收集器共享上下文。
共享上下文的例子:
c.OnResponse(func(r *colly.Response) {
r.Ctx.Put(r.Headers.Get("Custom-Header"))
c2.Request("GET", "https://foo.com/", nil, r.Ctx, nil)
})