根据抓取任务的需求,可以以不同的方式实现分布式抓取。大多数时候,扩展网络通信层就足够了,这可以很容易地使用代理和Colly的代理切换器来实现。
代理转换器
当HTTP请求分布在多个代理之间时,使用代理切换器抓取仍然是集中的。Colly通过它的SetProxyFunc()成员支持代理切换。任何自定义函数都可以传递给带有签名func(http.Request) (url.URL, error)。
提示
SSH服务器可以用作带有-D标志的socks5代理。
Colly有一个内置的代理切换器,它在每个请求上旋转代理列表。
使用
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)
}
// ...
}
实现自定义代理切换:
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)
分布式抓取
要管理独立的和分布式的scraper,您能做的最好的事情是将scraper包装在服务器中。服务器可以是任何类型的服务,如HTTP、TCP服务器或谷歌应用程序引擎。使用自定义存储实现集中持久的cookie和访问url处理。
提示
Colly内置谷歌应用程序引擎支持。如果你在App Engine标准环境中使用Colly,别忘了调用collection . appengine (*http.Request)。
在这里可以找到一个示例实现。
分布式存储
默认情况下,访问过的URL和cookie数据存储在内存中。
这对于短期抓取作业很方便,但当处理大规模或长时间运行的爬行作业时,它可能是一个严重的限制。
Colly有能力用任何实现colly/storage.Storage interface的存储后端替换默认的内存存储。检查现有的存储。