如何使用Golang编写爬虫程序_基础版Colly框架采集网页标题

大枫同学_8708

大枫同学_8708

2026-02-14

419人浏览

原创

Colly 的 OnHTML 拿不到标题,主因是网页无静态 标签(如 SPA 页面)、响应未加载完即解析、未处理 JS 渲染内容、编码未设 UTF-8 或选择器未覆盖 og:title 等元标签。

如何使用golang编写爬虫程序_基础版colly框架采集网页标题

为什么 Colly 的 OnHTML 拿不到标题?

常见现象是写了 OnHTML("title", ...) 却始终没触发回调,或者返回空字符串。根本原因不是选择器写错了,而是网页可能没用 标签(比如 SPA 页面靠 JS 渲染),或者响应体根本没加载完就被解析了。

  • 先确认目标页是否真有静态 :用浏览器“查看页面源代码”(不是开发者工具的 Elements 面板),搜
  • Colly 默认不执行 JS,所以 React/Vue 项目里 document.title 动态设置的内容完全不可见
  • 如果页面用了 ,得单独写 OnHTML("meta[property='og:title']", ...)
  • 注意 HTML 解析依赖字符编码,中文标题乱码常因响应头没声明 charset=utf-8,可在 c.OnResponse 里手动调用 resp.Body.SetCharset("utf-8")

如何用 colly.NewCollector 控制并发和重试

默认配置下,Colly 会并发请求、自动重试失败链接,但没设限——爬几个页面就可能被封 IP 或触发反爬。

  • 限制并发数:传入 colly.Async(true) + colly.MaxDepth(2) + colly.MaxBodySize(1024 * 1024) 防止下载大文件
  • 重试逻辑要自己加:Colly 不内置 HTTP 状态码重试,需在 OnError 里判断 err.Error() 是否含 "timeout" 或 "connection refused",再调用 c.Visit(req.URL.String())
  • 加随机延迟:在 OnRequest 回调里用 time.Sleep(time.Second * time.Duration(rand.Intn(2)+1)),避免请求频率过高
  • 别忽略 User-Agent:不设 c.UserAgent = "Mozilla/5.0 ...",很多站直接返回 403

c.OnHTML 提取文本时,为什么 e.Text 是空的?

这是新手最常卡住的地方:e.Text 只返回元素**直接子节点的文本内容**,不递归抓取所有后代文本,也不处理换行缩进。

Golang Uber Dig
Golang Uber Dig

使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等

下载
  • 例如

    Hello World

    中,e.Text 返回 " World"(只取 span 后面的纯文本)
  • 要拿完整文本,改用 e.DOM.Text()(需 import "github.com/PuerkitoBio/goquery"),它等价于 jQuery 的 .text()
  • 如果目标是 Go 语言入门 - 教程网,直接 e.Text 就够用;但如果是嵌套结构或带注释的标题,必须切到 DOM 层
  • 注意空格和换行:e.Text 会保留原始空白,建议结尾加 strings.TrimSpace()

采集结果怎么安全存成 JSON 而不丢数据?

直接 json.Marshal 结构体容易 panic,尤其字段含 nil 指针、未导出字段或非 JSON 可序列化类型(比如 *goquery.Selection)。

  • 定义结果结构体时,所有字段必须首字母大写(导出),且加 json:"title" tag 显式控制 key 名
  • 不要把 *colly.Response 或 *goquery.Selection 存进结构体——它们不是纯数据,提取后立刻转成 string 或 int
  • 写文件前检查 os.IsNotExist(err),避免路径不存在导致静默失败;用 os.WriteFile(filename, data, 0644) 替代 os.Create + Write 组合
  • 如果并发采集多个页面,别用全局 map 存结果——竞态风险高,改用 sync.Map 或 channel 收集后再统一序列化

真正麻烦的从来不是写几行 OnHTML,而是搞清目标页面的真实结构、HTTP 响应的编码细节、以及 Go 里值和指针在序列化时的隐式行为。

golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

golang 爬虫

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

519

5

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

616

5

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

1196

5

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.05

791

5

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.05.21

1766

6

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

5014

18

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2025.06.10

2314

13

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

2025.06.17

4186

17

golang数组大全
golang数组大全

本专题整合了golang数组相关问题解决方法,想了解更多相关内容,请阅读下面的文章。

2025.06.20

5266

22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程