分布式抓取内容
根据抓取任务的要求,分布式抓取可以通过不同的方式实现。大多数时候,扩展网络通信层就足够了,这可以使用代理和 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 接口的存储后端替换默认的内存存储。检查现有存储。