codecamp

Colly 爬取深度限制:精准控制爬虫范围

爬虫任务太大怕失控?用 CollyMaxDepth 限制爬取深度,就像给爬虫装上“紧箍咒”,轻松精准控制范围。

一、示例:

package main


import (
    "fmt"


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


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


    // 每次发现 <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.Visit("https://www.w3cschool.cn/")
}

运行结果(只爬取两层):

发现链接: https://www.w3cschool.cn/go
发现链接: https://www.w3cschool.cn/python
...

二、深度限制的 3 个关键点

关键点 说明 示例代码
设置深度 通过 colly.MaxDepth(n) 设置最大爬取深度 colly.MaxDepth(2)
深度含义 0 表示只爬首页,1 表示爬首页 + 一层链接,依此类推 colly.MaxDepth(0) 只爬首页
动态调整 可以在运行时动态调整深度 c.MaxDepth = 3

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

假设你想爬取编程狮首页及其两层链接,完整代码如下:

package main


import (
    "fmt"


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


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


    // 每次发现 <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.Visit("https://www.w3cschool.cn/")
}

四、常见问题速查

现象 原因 解决方法
爬取深度不够 MaxDepth 设置太小 增大 MaxDepth 值
爬取深度太深 MaxDepth 设置太大 减小 MaxDepth 值
无法访问某些链接 链接不在 AllowedDomains 中 检查 AllowedDomains 是否包含目标域名

五、1 分钟实验

  1. 打开 Go 环境 → 新建 main.go
  2. 复制上方代码 → 运行。
  3. 观察终端:只爬取两层链接,不会无限深入。

标题:Colly 爬取深度限制:精准控制爬虫范围(小白适配版)| 编程狮教程
描述
关键词:Colly 爬取深度、MaxDepth、爬虫范围控制、编程狮

Colly 登录爬取:轻松搞定需要登录的网站
Colly 多部分表单上传:轻松实现文件上传
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }