Skip to content

分布式抓取内容

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


1.代理切换器

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

TIP

SSH 服务器可以通过 -D 标志用作socks5 代理。

Colly 有一个内置的代理切换器,可以根据每个请求轮换代理列表。

用法

go
package main

import (
	"github.com/gocolly/colly"
	"github.com/gocolly/colly/proxy"
)

func main() {
	c := colly.NewCollector()

	if p, err := proxy.RoundRobinProxySwitcher(
		"socks5://127.0.0.1:1337",
		"socks5://127.0.0.1:1338",
		"http://127.0.0.1:8080",
	); err == nil {
		c.SetProxyFunc(p)
	}
	// ...
}

实现自定义代理切换器:

go
var proxies []*url.URL = []*url.URL{
	&url.URL{Host: "127.0.0.1:8080"},
	&url.URL{Host: "127.0.0.1:8081"},
}

func randomProxySwitcher(_ *http.Request) (*url.URL, error) {
	return proxies[random.Intn(len(proxies))], nil
}

// ...
c.SetProxyFunc(randomProxySwitcher)

2.分布式爬取器

要管理独立的分布式抓取工具,最好的方法是将抓取工具包装在服务器中。服务器可以是任何类型的服务,例如 HTTP、TCP 服务器或 Google App Engine。使用自定义存储来实现集中且持久的 cookie 和访问过的 url 处理。

INFO

Colly 具有内置的 Google App Engine 支持。如果您在 App Engine 标准环境中使用 Colly,请不要忘记调用 Collector.Appengine(*http.Request)。

案例实现

分布式存储

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

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