国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Colly 并行爬?。憾嗑€(xiàn)程爬蟲(chóng)加速實(shí)戰(zhàn)

2025-07-11 18:32 更新

單線(xiàn)程爬蟲(chóng)太慢?用 CollyAsyncLimit,輕松開(kāi)啟多線(xiàn)程爬蟲(chóng),速度提升 N 倍!

一、示例:

package main


import (
    "fmt"


    "github.com/gocolly/colly/v2"
)


func main() {
    // 創(chuàng)建默認(rèn)收集器,限制最大深度為 2,開(kāi)啟異步
    c := colly.NewCollector(
        colly.MaxDepth(2), // 只爬取首頁(yè) + 一層鏈接
        colly.Async(true), // 開(kāi)啟異步
    )


    // 限制最大并行數(shù)為 4
    c.Limit(&colly.LimitRule{
        DomainGlob:  "*",    // 對(duì)所有域名生效
        Parallelism: 4,      // 最大并行數(shù)
    })


    // 每次發(fā)現(xiàn) <a href="..."> 標(biāo)簽就打印并繼續(xù)訪(fǎng)問(wèn)
    c.OnHTML("a[href]", func(e *colly.HTMLElement) {
        link := e.Attr("href")
        fmt.Println("發(fā)現(xiàn)鏈接:", link)


        // 自動(dòng)補(bǔ)全絕對(duì)路徑后再訪(fǎng)問(wèn)
        absoluteURL := e.Request.AbsoluteURL(link)
        e.Request.Visit(absoluteURL)
    })


    // 在請(qǐng)求前打印日志
    c.OnRequest(func(r *colly.Request) {
        fmt.Println("正在訪(fǎng)問(wèn):", r.URL.String())
    })


    // 從編程獅首頁(yè)開(kāi)始
    c.Visit("http://eska-fuses.cn/")


    // 等待所有線(xiàn)程完成
    c.Wait()
}

運(yùn)行結(jié)果(多線(xiàn)程并發(fā)訪(fǎng)問(wèn)):

正在訪(fǎng)問(wèn): http://eska-fuses.cn/
發(fā)現(xiàn)鏈接: http://eska-fuses.cn/go
正在訪(fǎng)問(wèn): http://eska-fuses.cn/go
發(fā)現(xiàn)鏈接: http://eska-fuses.cn/python
正在訪(fǎng)問(wèn): http://eska-fuses.cn/python
...

二、并行爬取的 3 個(gè)關(guān)鍵點(diǎn)

關(guān)鍵點(diǎn) 說(shuō)明 示例代碼
開(kāi)啟異步 使用 colly.Async(true) 開(kāi)啟異步模式 colly.Async(true)
限制并行數(shù) 使用 Limit 方法限制最大并行數(shù) c.Limit(&colly.LimitRule{Parallelism: 4})
等待線(xiàn)程完成 使用 Wait 方法等待所有線(xiàn)程完成 c.Wait()

三、完整實(shí)戰(zhàn):爬取編程獅首頁(yè)及兩層鏈接

假設(shè)你想爬取編程獅首頁(yè)及其兩層鏈接,并限制最大并行數(shù)為 4,完整代碼如下:

package main


import (
    "fmt"


    "github.com/gocolly/colly/v2"
)


func main() {
    // 創(chuàng)建默認(rèn)收集器,限制最大深度為 2,開(kāi)啟異步
    c := colly.NewCollector(
        colly.MaxDepth(2), // 只爬取首頁(yè) + 一層鏈接
        colly.Async(true), // 開(kāi)啟異步
    )


    // 限制最大并行數(shù)為 4
    c.Limit(&colly.LimitRule{
        DomainGlob:  "*",    // 對(duì)所有域名生效
        Parallelism: 4,      // 最大并行數(shù)
    })


    // 每次發(fā)現(xiàn) <a href="..."> 標(biāo)簽就打印并繼續(xù)訪(fǎng)問(wèn)
    c.OnHTML("a[href]", func(e *colly.HTMLElement) {
        link := e.Attr("href")
        fmt.Println("發(fā)現(xiàn)鏈接:", link)


        // 自動(dòng)補(bǔ)全絕對(duì)路徑后再訪(fǎng)問(wèn)
        absoluteURL := e.Request.AbsoluteURL(link)
        e.Request.Visit(absoluteURL)
    })


    // 在請(qǐng)求前打印日志
    c.OnRequest(func(r *colly.Request) {
        fmt.Println("正在訪(fǎng)問(wèn):", r.URL.String())
    })


    // 從編程獅首頁(yè)開(kāi)始
    c.Visit("http://eska-fuses.cn/")


    // 等待所有線(xiàn)程完成
    c.Wait()
}

四、常見(jiàn)問(wèn)題速查

現(xiàn)象 原因 解決方法
爬取速度慢 并行數(shù)設(shè)置太小 增大 Parallelism 值
程序崩潰 并行數(shù)設(shè)置太大 減小 Parallelism 值
鏈接重復(fù)爬取 沒(méi)有正確設(shè)置 AllowedDomains 檢查 AllowedDomains 是否包含目標(biāo)域名

五、1 分鐘實(shí)驗(yàn)

  1. 打開(kāi) Go 環(huán)境 → 新建 main.go
  2. 復(fù)制上方代碼 → 運(yùn)行。
  3. 觀(guān)察終端:多線(xiàn)程并發(fā)訪(fǎng)問(wèn),速度明顯提升。
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)