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