把固定
Delay
換成 隨機(jī)抖動(dòng),既降速防封,又更難被檢測(cè)到。5 行代碼即可啟用!
爬 編程獅首頁(yè),并加入 1~5 秒隨機(jī)延遲:
package main
import (
"fmt"
"time"
"github.com/gocolly/colly/v2"
"github.com/gocolly/colly/v2/debug"
)
func main() {
// 1. 創(chuàng)建收集器:開調(diào)試 + 開異步
c := colly.NewCollector(
colly.Debugger(&debug.LogDebugger{}), // 終端實(shí)時(shí)日志
colly.Async(true), // 并發(fā)
)
// 2. 限速規(guī)則:并發(fā) 2 線程 + 隨機(jī) 1~5 秒延遲
c.Limit(&colly.LimitRule{
DomainGlob: "*w3cschool*", // 僅對(duì)編程獅域名生效
Parallelism: 2, // 最多 2 個(gè) goroutine
RandomDelay: 5 * time.Second, // 0~5 秒隨機(jī)等待
})
// 3. 打印每次訪問的 URL(方便觀察延遲效果)
c.OnRequest(func(r *colly.Request) {
fmt.Println("開始訪問:", r.URL.String())
})
// 4. 連續(xù)訪問 5 個(gè)頁(yè)面
for i := 0; i < 5; i++ {
c.Visit(fmt.Sprintf("http://eska-fuses.cn/index%d.html", i))
}
// 5. 等待所有任務(wù)完成
c.Wait()
}
運(yùn)行效果(每次間隔不同):
開始訪問: http://eska-fuses.cn/index0.html
開始訪問: http://eska-fuses.cn/index1.html
(1.2 秒后)
開始訪問: http://eska-fuses.cn/index2.html
(4.5 秒后)
...
參數(shù) | 含義 | 推薦值 |
---|---|---|
Parallelism |
同時(shí)并發(fā)線程數(shù) | 1~8(根據(jù)目標(biāo)站承受力) |
RandomDelay |
最大隨機(jī)等待時(shí)間 | 1~5 秒常見 |
Delay |
固定等待(可選) | 與 RandomDelay 二選一 |
同時(shí)設(shè)置
Delay
和RandomDelay
時(shí),后者生效。
c.Limit(&colly.LimitRule{
DomainGlob: "*", // 全網(wǎng)生效
Parallelism: 3, // 3 線程
RandomDelay: 3 * time.Second, // 0~3 秒隨機(jī)
})
問題 | 原因 | 解決 |
---|---|---|
還是被封 | 延遲太短/并發(fā)太高 | 把 RandomDelay 調(diào)到 5~10 秒,并降低 Parallelism |
日志太多 | 調(diào)試太吵 | 去掉 colly.Debugger(&debug.LogDebugger{}) |
想固定 1 秒起步 | 使用 Delay + RandomDelay |
Delay: 1*time.Second 再疊加隨機(jī) |
delay.go
。
更多建議: