colly 分布式抓取 ##5

分布式抓取

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

猜你喜欢

转载自www.cnblogs.com/liujie-php/p/11571048.html
今日推荐