Colly 并行爬取:多线程爬虫加速实战

2025-07-11 18:32 更新

单线程爬虫太慢?用 CollyAsyncLimit,轻松开启多线程爬虫,速度提升 N 倍!

一、示例:

package main


import (
    "fmt"


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


func main() {
    // 创建默认收集器,限制最大深度为 2,开启异步
    c := colly.NewCollector(
        colly.MaxDepth(2), // 只爬取首页 + 一层链接
        colly.Async(true), // 开启异步
    )


    // 限制最大并行数为 4
    c.Limit(&colly.LimitRule{
        DomainGlob:  "*",    // 对所有域名生效
        Parallelism: 4,      // 最大并行数
    })


    // 每次发现 <a href="..."> 标签就打印并继续访问
    c.OnHTML("a[href]", func(e *colly.HTMLElement) {
        link := e.Attr("href")
        fmt.Println("发现链接:", link)


        // 自动补全绝对路径后再访问
        absoluteURL := e.Request.AbsoluteURL(link)
        e.Request.Visit(absoluteURL)
    })


    // 在请求前打印日志
    c.OnRequest(func(r *colly.Request) {
        fmt.Println("正在访问:", r.URL.String())
    })


    // 从编程狮首页开始
    c.Visit("https://www.w3cschool.cn/")


    // 等待所有线程完成
    c.Wait()
}

运行结果(多线程并发访问):

正在访问: https://www.w3cschool.cn/
发现链接: https://www.w3cschool.cn/go
正在访问: https://www.w3cschool.cn/go
发现链接: https://www.w3cschool.cn/python
正在访问: https://www.w3cschool.cn/python
...

二、并行爬取的 3 个关键点

关键点 说明 示例代码
开启异步 使用 colly.Async(true) 开启异步模式 colly.Async(true)
限制并行数 使用 Limit 方法限制最大并行数 c.Limit(&colly.LimitRule{Parallelism: 4})
等待线程完成 使用 Wait 方法等待所有线程完成 c.Wait()

三、完整实战:爬取编程狮首页及两层链接

假设你想爬取编程狮首页及其两层链接,并限制最大并行数为 4,完整代码如下:

package main


import (
    "fmt"


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


func main() {
    // 创建默认收集器,限制最大深度为 2,开启异步
    c := colly.NewCollector(
        colly.MaxDepth(2), // 只爬取首页 + 一层链接
        colly.Async(true), // 开启异步
    )


    // 限制最大并行数为 4
    c.Limit(&colly.LimitRule{
        DomainGlob:  "*",    // 对所有域名生效
        Parallelism: 4,      // 最大并行数
    })


    // 每次发现 <a href="..."> 标签就打印并继续访问
    c.OnHTML("a[href]", func(e *colly.HTMLElement) {
        link := e.Attr("href")
        fmt.Println("发现链接:", link)


        // 自动补全绝对路径后再访问
        absoluteURL := e.Request.AbsoluteURL(link)
        e.Request.Visit(absoluteURL)
    })


    // 在请求前打印日志
    c.OnRequest(func(r *colly.Request) {
        fmt.Println("正在访问:", r.URL.String())
    })


    // 从编程狮首页开始
    c.Visit("https://www.w3cschool.cn/")


    // 等待所有线程完成
    c.Wait()
}

四、常见问题速查

现象 原因 解决方法
爬取速度慢 并行数设置太小 增大 Parallelism 值
程序崩溃 并行数设置太大 减小 Parallelism 值
链接重复爬取 没有正确设置 AllowedDomains 检查 AllowedDomains 是否包含目标域名

五、1 分钟实验

  1. 打开 Go 环境 → 新建 main.go
  2. 复制上方代码 → 运行。
  3. 观察终端:多线程并发访问,速度明显提升。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号