Go 优雅的爬虫框架 - Colly

2024-06-01 06:20
文章标签 go 优雅 框架 爬虫 colly

本文主要是介绍Go 优雅的爬虫框架 - Colly,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Colly 是一款用 Go 语言编写的优雅网络爬虫框架,速度快、灵活且易于使用

关键特性包括:

  • 线程安全。
  • 用户友好的 API。
  • 支持 XHR(Ajax)和 WebSocket。
  • 缓存和持久化。
  • 支持速度限制和分布式爬取。
  • 强大的可扩展性。

colly采集器配置

  • AllowedDomains: 设置收集器使用的域白名单,设置后不在白名单内链接,报错:Forbidden domain。
  • AllowURLRevisit: 设置收集器允许对同一 URL 进行多次下载。
  • Async: 设置收集器为异步请求,需很Wait()配合使用。
  • Debugger: 开启Debug,开启后会打印请求日志。
  • MaxDepth: 设置爬取页面的深度。
  • UserAgent: 设置收集器使用的用户代理。
  • MaxBodySize : 以字节为单位设置检索到的响应正文的限制。
  • IgnoreRobotsTxt: 忽略目标机器中的robots.txt声明。 

创建采集器:配置可以写在里面,也可以写在外面。

collector := colly.NewCollector(colly.AllowedDomains("www.baidu.com",".baidu.com"),//白名单域名colly.AllowURLRevisit(),//允许对同一 URL 进行多次下载colly.Async(true),//设置为异步请求colly.Debugger(&debug.LogDebugger{}),// 开启debugcolly.MaxDepth(2),//爬取页面深度,最多为两层colly.MaxBodySize(1024 * 1024),//响应正文最大字节数colly.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "),colly.IgnoreRobotsTxt(),//忽略目标机器中的`robots.txt`声明
)

1、执行流程

 2、回调函数

colly附加各种不同类型的回调函数,来控制收集作业或获取信息

3、安装

go get -u github.com/gocolly/colly

4、案例

案例一:爬取网络页面标题 

package mainimport ("fmt""github.com/gocolly/colly"
)func main() {// 创建Collector实例c := colly.NewCollector()// 设置请求处理逻辑c.OnHTML("head > title", func(e *colly.HTMLElement) {fmt.Println("网页标题:", e.Text)})// 设置错误处理逻辑c.OnError(func(r *colly.Response, err error) {fmt.Println("请求错误:", err)})// 开始爬取c.Visit("http://www.baidu.com")
}

案例二:爬取指定元素内容 

package mainimport ("fmt""github.com/gocolly/colly"
)func main() {// 创建Collector实例c := colly.NewCollector()// 设置请求处理逻辑,第一个参数是查询选择器,类似CSS选择器一样的语法c.OnHTML("body > div#wrapper > div#head > div#s-top-left > a", func(e *colly.HTMLElement) {// 打印出每个新闻标题链接的文本和它的 href 属性fmt.Println("栏目:", e.Text)fmt.Println("链接地址:", e.Attr("href"))})// 设置错误处理逻辑c.OnError(func(r *colly.Response, err error) {fmt.Println("请求错误:", err)})// 开始爬取c.Visit("http://www.baidu.com")
}

案例三:爬取图片 

package mainimport ("fmt""github.com/gocolly/colly""github.com/google/uuid""io""net/http""os""path/filepath""strings"
)func init() {dirName := "img" // 要创建的文件夹名称// 使用filepath.Join可以更好地处理路径分隔符,使其跨平台dirPath := filepath.Join(".", dirName)// 判断目录是否存在if _, err := os.Stat(dirPath); os.IsNotExist(err) {// 如果不存在,则创建err = os.Mkdir(dirPath, 0755) // 0755 是权限位,表示所有者有读、写、执行权限,组用户和其他用户有读和执行权限if err != nil {fmt.Printf("创建目录失败: %v\n", err)return}fmt.Printf("目录 '%s' 创建成功。\n", dirPath)} else if err != nil {// 其他错误处理fmt.Printf("检查目录状态时发生错误: %v\n", err)return} else {// 目录已存在fmt.Printf("目录 '%s' 已存在,无需创建。\n", dirPath)}
}func main() {//实例化默认收集器c := colly.NewCollector()// 在访问页面之前执行的回调函数c.OnRequest(func(r *colly.Request) {fmt.Println("OnRequest函数是在发起请求前被调用:", r.URL.String())})// 在访问页面之后执行的回调函数c.OnResponse(func(r *colly.Response) {fmt.Println("OnRespo

这篇关于Go 优雅的爬虫框架 - Colly的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020220

相关文章

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个