Colly 随机延迟:让爬虫像真人一样“礼貌”访问
2025-07-14 15:29 更新
把固定
Delay
换成 随机抖动,既降速防封,又更难被检测到。5 行代码即可启用!
一、示例:
爬 编程狮首页,并加入 1~5 秒随机延迟:
package main
import (
"fmt"
"time"
"github.com/gocolly/colly/v2"
"github.com/gocolly/colly/v2/debug"
)
func main() {
// 1. 创建收集器:开调试 + 开异步
c := colly.NewCollector(
colly.Debugger(&debug.LogDebugger{}), // 终端实时日志
colly.Async(true), // 并发
)
// 2. 限速规则:并发 2 线程 + 随机 1~5 秒延迟
c.Limit(&colly.LimitRule{
DomainGlob: "*w3cschool*", // 仅对编程狮域名生效
Parallelism: 2, // 最多 2 个 goroutine
RandomDelay: 5 * time.Second, // 0~5 秒随机等待
})
// 3. 打印每次访问的 URL(方便观察延迟效果)
c.OnRequest(func(r *colly.Request) {
fmt.Println("开始访问:", r.URL.String())
})
// 4. 连续访问 5 个页面
for i := 0; i < 5; i++ {
c.Visit(fmt.Sprintf("https://www.w3cschool.cn/index%d.html", i))
}
// 5. 等待所有任务完成
c.Wait()
}
运行效果(每次间隔不同):
开始访问: https://www.w3cschool.cn/index0.html
开始访问: https://www.w3cschool.cn/index1.html
(1.2 秒后)
开始访问: https://www.w3cschool.cn/index2.html
(4.5 秒后)
...
二、3 个核心参数速记
参数 | 含义 | 推荐值 |
---|---|---|
Parallelism |
同时并发线程数 | 1~8(根据目标站承受力) |
RandomDelay |
最大随机等待时间 | 1~5 秒常见 |
Delay |
固定等待(可选) | 与 RandomDelay 二选一 |
同时设置
Delay
和RandomDelay
时,后者生效。
三、实战模板:直接套用
c.Limit(&colly.LimitRule{
DomainGlob: "*", // 全网生效
Parallelism: 3, // 3 线程
RandomDelay: 3 * time.Second, // 0~3 秒随机
})
四、常见问题速答
问题 | 原因 | 解决 |
---|---|---|
还是被封 | 延迟太短/并发太高 | 把 RandomDelay 调到 5~10 秒,并降低 Parallelism |
日志太多 | 调试太吵 | 去掉 colly.Debugger(&debug.LogDebugger{}) |
想固定 1 秒起步 | 使用 Delay + RandomDelay |
Delay: 1*time.Second 再叠加随机 |
五、1 分钟动手实验
- 打开 终端 → 新建
delay.go
。 - 复制上方“中文注释”代码 → 运行。
- 观察终端:每条日志间隔随机,爬虫像真人点击一样“礼貌”。
以上内容是否对您有帮助:
更多建议: