Go并发爬虫核心是可控并发:用带缓冲channel限流(5~20)、http.Client设超时与User-Agent、goquery结构化解析、sync.Map去重、WaitGroup协调完成。
用 Go 实现并发爬虫,核心是利用 goroutine 并发发起 HTTP 请求,配合 channel 控制任务分发与结果收集,再用结构化方式(如 goquery 或标准库 net/html)解析 HTML。关键不在“多”,而在“可控”——避免请求泛滥、重复抓取、阻塞等待和内存泄漏。
无限制启协程会快速触发连接超时、429 或 IP 封禁。推荐用带缓冲的 channel 作为信号量,限制同时活跃的 goroutine 数量:
semaphore := make(chan struct{}, N)
semaphore ,结束时
别直接用 http.Get,要设置超时、User-Agent、重试逻辑:
http.Client 自定义 Timeout(如 10 秒)和 Transport(可复用连接)User-Agent
resp.Body.Close(),防止文件描述符耗尽推荐使用 github.com/PuerkitoBio/goquery(基于 CSS 选择器,简洁高效):
立即学习“go语言免费学习笔记(深入)”;
goquery.NewDocumentFromReader(resp.Body) 加载文档doc.Find("h1.title").Text() 或 doc.Find("a[href]").Each(...) 提取内容if len(title) > 0 { ... },避免 panicnet/html 手动遍历节点树
结果汇总用 channel + map 实现简单但有效的任务调度:
chan string)中取任务sync.Map 或互斥锁保护全局 visited 集合,防止重复抓取results chan Result,主 goroutine 收集并写入文件或数据库sync.WaitGroup 等待所有抓取完成,再关闭 results channel不复杂但容易忽略。重点不是开多少协程,而是让每个环节可中断、可监控、可降级。