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

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO