TL;DR
Colly接受通过SetProxyFunc的标准代理功能。使用其proxy.RoundRobinProxySwitcher进行简单的端点轮换,设置保守的并行性和延迟,并在没有凭证的情况下记录结果。保持一个粘性端点用于有状态会话;仅轮换独立的、经过授权的请求。
在Colly中配置代理
Colly的官方代理切换示例使用RoundRobinProxySwitcher,支持HTTP、HTTPS和SOCKS5代理URL。
go get github.com/gocolly/colly/v2
package main import ( "fmt" "log" "github.com/gocolly/colly/v2" "github.com/gocolly/colly/v2/proxy" ) func main() { switcher, err := proxy.RoundRobinProxySwitcher( "http://USER:PASS@gate-1.example:8000", "http://USER:PASS@gate-2.example:8000", ) if err != nil { log.Fatal(err) } c := colly.NewCollector( colly.AllowedDomains("example.com"), colly.Async(true), ) c.SetProxyFunc(switcher) c.OnResponse(func(r *colly.Response) { fmt.Printf("status=%d bytes=%d url=%s\n", r.StatusCode, len(r.Body), r.Request.URL) }) c.OnError(func(r *colly.Response, err error) { fmt.Printf("status=%d error=%v url=%s\n", r.StatusCode, err, r.Request.URL) }) c.Visit("https://example.com/authorized-page") c.Wait() }
将示例网关替换为您的授权Nstdata住宅代理端点。将凭证存储在源文件之外。
心理模型: Colly控制爬虫行为;代理更改网络来源。二者不互相替代授权或速率控制。
添加有界并行性和延迟
在提高吞吐量之前应用限制:
err := c.Limit(&colly.LimitRule{ DomainGlob: "*example.com*", Parallelism: 4, Delay: 750 * time.Millisecond, RandomDelay: 500 * time.Millisecond, }) if err != nil { log.Fatal(err) }
为此代码片段导入time。根据网站允许的请求预算设置值,而不是根据您的机器可以发送的最大值。
选择轮换或粘性会话
轮流轮换适用于需要位置分布的独立公共页面。登录流程、购物车和多步骤导航通常需要相同的退出和Cookie罐。对于这些情况,专门为会话分配一个收集器或代理端点,而不是中途轮换。
如果响应返回429,请遵守Retry-After并减少流量。将401、403或挑战页面视为验证权限和集成的原因——而不是加强旁路策略的提示。
生产检查清单
- 允许列表目标域和URL模式。
- 配置连接和响应超时。
- 限制队列大小、深度、页面、重试和响应字节。
- 记录代理标签、状态、延迟、重试计数和解析结果。
- 从日志中删除用户名和密码。
- 在访问之前去重规范URL。
- 当错误率或阻塞率超过阈值时自动停止。
最终裁决
对于Colly代理集成,首先使用RoundRobinProxySwitcher,然后添加域限制、速度、超时和可观察的失败处理。当您的授权工作负载需要住宅路由或集中代理管理时,使用Nstdata;当干净的页面输出比控制每个请求更重要时,使用Nstdata Crawl。
体验Nstdata — 今天开始您的免费试用
常见问题
Colly会自动轮换代理吗?
在您提供代理函数之前不会。捆绑的代理包提供了一个轮询切换器。
Colly可以使用SOCKS5吗?
是的。官方切换器文档列出了SOCKS5代理URL。
为什么轮换会破坏爬取?
有状态网站可能会将cookie或会话绑定到一个网络身份。对于完整流程,使用一个粘性端点。




