用 SetProxyFunc 在 Colly 中实现轮询代理选择
使用 SetProxyFunc 进行轮询选择,并留意 keep-alive、transport 替换以及克隆 backend 带来的影响。
collector := colly.NewCollector()
switcher, err := proxy.RoundRobinProxySwitcher(
"http://proxy-a.example:8080",
"http://proxy-b.example:8080",
)
if err != nil {
return err
}
collector.SetProxyFunc(switcher)
err = collector.Visit("https://www.example.com/")在应用的函数中使用 github.com/gocolly/colly/v2 及其 proxy 包,并保留常规的错误处理。请在请求或异步访问开始之前配置选择器。HTTP 代理列表为切换器的 endpoint 输入提供公开候选。
SetProxy 选择固定的 endpoint;SetProxyFunc 让 HTTP transport 按每个请求进行选择。这样可避免在每个 OnRequest 回调内部替换共享配置。
在此实现中,SetProxyFunc 还会把 DisableKeepAlives 设为 true。它会更新已有的 *http.Transport,但会用新的 HTTP transport 替换其他类型的 transport。请有意保留任何自定义 RoundTripper 行为,而不要假定它仍然有效。
Collector.Clone 共享 HTTP backend,因此修改克隆的代理可能改变该共享 backend。在并发工作之前请确定归属。轮询选择轮换的是所提供的 endpoint,而不是经过验证的公开出口身份或独立检查的可用性。