根据抓取任务的需求,可以以不同的方式实现分布式抓取。大多数时候,扩展网络通信层就足够了,这可以很容易地使用代理和Colly的代理切换器来实现。

代理转换器

当HTTP请求分布在多个代理之间时,使用代理切换器抓取仍然是集中的。Colly通过它的SetProxyFunc()成员支持代理切换。任何自定义函数都可以传递给带有签名func(http.Request) (url.URL, error)。

提示

SSH服务器可以用作带有-D标志的socks5代理。

Colly有一个内置的代理切换器,它在每个请求上旋转代理列表。

使用

  1. package main
  2. import (
  3. "github.com/gocolly/colly"
  4. "github.com/gocolly/colly/proxy"
  5. )
  6. func main() {
  7. c := colly.NewCollector()
  8. if p, err := proxy.RoundRobinProxySwitcher(
  9. "socks5://127.0.0.1:1337",
  10. "socks5://127.0.0.1:1338",
  11. "http://127.0.0.1:8080",
  12. ); err == nil {
  13. c.SetProxyFunc(p)
  14. }
  15. // ...
  16. }

实现自定义代理切换:

  1. var proxies []*url.URL = []*url.URL{
  2. &url.URL{Host: "127.0.0.1:8080"},
  3. &url.URL{Host: "127.0.0.1:8081"},
  4. }
  5. func randomProxySwitcher(_ *http.Request) (*url.URL, error) {
  6. return proxies[random.Intn(len(proxies))], nil
  7. }
  8. // ...
  9. c.SetProxyFunc(randomProxySwitcher)

分布式抓取

要管理独立的和分布式的scraper,您能做的最好的事情是将scraper包装在服务器中。服务器可以是任何类型的服务,如HTTP、TCP服务器或谷歌应用程序引擎。使用自定义存储实现集中持久的cookie和访问url处理。

提示

Colly内置谷歌应用程序引擎支持。如果你在App Engine标准环境中使用Colly,别忘了调用collection . appengine (*http.Request)。

这里可以找到一个示例实现。

分布式存储

默认情况下,访问过的URL和cookie数据存储在内存中。
这对于短期抓取作业很方便,但当处理大规模或长时间运行的爬行作业时,它可能是一个严重的限制。

Colly有能力用任何实现colly/storage.Storage interface的存储后端替换默认的内存存储。检查现有的存储