如果任务非常复杂或具有不同类型的子任务,建议对一个抓取作业使用多个收集器。一个很好的例子是coursera的课程scraper,其中使用了两个收集器——一个解析列表视图并处理分页,另一个收集课程细节。

Colly有一些内置方法来支持多个收集器的使用。

提示

使用collector.ID在调试中区分不同的收集器

克隆采集器

如果采集器具有类似的配置,则可以使用收集器的Clone()方法。Clone()复制具有相同配置但没有附加回调的采集器。

  1. c := colly.NewCollector(
  2. colly.UserAgent("myUserAgent"),
  3. colly.AllowedDomains("foo.com", "bar.com"),
  4. )
  5. // Custom User-Agent and allowed domains are cloned to c2
  6. c2 := c.Clone()

在采集器之间传递自定义数据

使用采集器的Request()函数能够与其他收集器共享上下文。

共享上下文的例子:

  1. c.OnResponse(func(r *colly.Response) {
  2. r.Ctx.Put(r.Headers.Get("Custom-Header"))
  3. c2.Request("GET", "https://foo.com/", nil, r.Ctx, nil)
  4. })