Colly 并行爬取:多线程爬虫加速实战
2025-07-11 18:32 更新
单线程爬虫太慢?用 Colly 的
Async
和Limit
,轻松开启多线程爬虫,速度提升 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 分钟实验
- 打开 Go 环境 → 新建
main.go
。 - 复制上方代码 → 运行。
- 观察终端:多线程并发访问,速度明显提升。
以上内容是否对您有帮助:
更多建议: