分布式抓取
根据抓取任务的需求,可以以不同的方式实现分布式抓取。大多数情况下,扩展网络通信层就足够了,使用代理和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,不要忘记调用Collector.Appengine(*http.Request)。
这里可以找到一个示例实现。
分布式存储
默认情况下,已访问的URL和cookie数据存储在内存中。这是方便的短期抓取工作,但它可能是一个严重的限制,当处理大规模或长期运行的爬行作业。
Colly能够用实现Colly /storage的任何存储后端替换默认的内存存储。存储接口。查看现有的存储。