golang学习笔记——爬虫colly入门

2023-12-09 07:28

本文主要是介绍golang学习笔记——爬虫colly入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 爬虫
  • 第一个爬虫
  • colly爬虫框架
    • colly爬虫示例-爬取图片
    • colly采集器配置
    • Callbacks
      • Add callbacks to a Collector
      • Call order of callbacks
        • 1. OnRequest
        • 2. OnError
        • 3. OnResponse
        • 4. OnHTML
        • 5. OnXML
        • 6. OnScraped
    • OnHTML方法
  • 参考资料

爬虫

很多语言都可以写爬虫,包括python,java、c++、Pythhon等。而Go本身是开源的,很多大佬为Python的功能扩展写了很多成熟的工具,也就是网络上常说的xx库,我们可以利用这些工具快速实现我们的需求,比较好入门。

另外,需要强调的是,网络上并不是什么东西都可以爬,针对这个问题,我国有着一套完备的法律。爬了不该爬的内容,比如大量个人信息,那可以快速实现“从入门到入狱”。

第一个爬虫

我们仅用go标准库来试试看。
先用新建项目目录

# 创建项目目录
mkdir firstProject
# 进入目录
cd firstProject
# 初始化项目
go mod init gitcode.com/m
# 创建main文件
touch main.go

粘贴下面代码

package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("https://www.baidu.com")if err != nil {fmt.Println("请求失败:", err)}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {fmt.Println("读取响应失败:", err)}fmt.Println(string(body))
}

在cmder窗口运行

$ go build
$ .\m.exe

或者go build && m

在这里插入图片描述
成功返回网页。仅用标准库有很大的局限性.

colly爬虫框架

colly 是 Go 实现的比较有名的一款爬虫框架,而且 Go 在高并发和分布式场景的优势也正是爬虫技术所需要的。它的主要特点是轻量、快速,设计非常优雅,并且分布式的支持也非常简单,易于扩展。

colly爬虫示例-爬取图片

先在cmder窗口执行go get github.com/gocolly/colly 安装colly模块。安装后,go.mod多了一些依赖项模块。

在这里插入图片描述
代码

package mainimport ("fmt""github.com/gocolly/colly""io""math/rand""net/http""os""strconv"
)func main() {//创建采集器对象c := colly.NewCollector()// 在访问页面之前执行的回调函数c.OnRequest(func(r *colly.Request) {fmt.Println("Visiting", r.URL.String())})// 在访问页面之后执行的回调函数c.OnResponse(func(r *colly.Response) {fmt.Println("Visited", r.Request.URL.String())})// 在访问页面时发生错误时执行的回调函数c.OnError(func(r *colly.Response, err error) {fmt.Println("Error:", err)})// 在访问页面时发现图片时执行的回调函数c.OnHTML(".bizhi_tjs img", func(e *colly.HTMLElement) {url := e.Attr("src")if url != "" {fmt.Println("Found image:", url)resp, err := http.Get(url)if err != nil {fmt.Println("Error:", err)return}defer resp.Body.Close()randnum := rand.Intn(90) + 10strRandnum := strconv.Itoa(randnum)filename := "E:\\Download\\img\\" + strRandnum + ".jpg"file, err := os.Create(filename)if err != nil {fmt.Println("Error:", err)return}defer file.Close()io.Copy(file, resp.Body)fmt.Println("Image saved to", file.Name())}})// 发起访问  输入你要访问的网址c.Visit("https://www.bizhizu.cn/bizhi/10231.html")
}

运行go build && m
在这里插入图片描述

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`声明
)

配置可以写在里面,也可以写在外面。

Callbacks

You can attach different type of callback functions to a Collector to control a collecting job or retrieve information. Check out the related section in the package documentation.

您可以将不同类型的回调函数附加到“收集器”,以控制收集作业或检索信息。查看软件包文档中的相关部分。

Add callbacks to a Collector

c.OnRequest(func(r *colly.Request) {fmt.Println("Visiting", r.URL)
})c.OnError(func(_ *colly.Response, err error) {log.Println("Something went wrong:", err)
})c.OnResponse(func(r *colly.Response) {fmt.Println("Visited", r.Request.URL)
})c.OnHTML("a[href]", func(e *colly.HTMLElement) {e.Request.Visit(e.Attr("href"))
})c.OnHTML("tr td:nth-of-type(1)", func(e *colly.HTMLElement) {fmt.Println("First column of a table row:", e.Text)
})c.OnXML("//h1", func(e *colly.XMLElement) {fmt.Println(e.Text)
})c.OnScraped(func(r *colly.Response) {fmt.Println("Finished", r.Request.URL)
})

Call order of callbacks

1. OnRequest

Called before a request

在请求之前调用

2. OnError

Called if error occured during the request

如果请求过程中发生错误,则调用

3. OnResponse

Called after response received

收到响应后调用

4. OnHTML

Called right after OnResponse if the received content is HTML

如果接收到的内容是HTML,则在“OnResponse”之后立即调用

5. OnXML

Called right after OnHTML if the received content is HTML or XML

如果接收到的内容是HTML或XML,则在“OnHTML”之后立即调用

6. OnScraped

Called after OnXML callbacks

OnXML回调后调用

OnHTML方法

OnHTML方法的第一个参数是选择器,goquery选择器语法类似jquery,可以认为它是jquery的go版本实现。这里简单介绍常用的选择器,具体可以参考jquery选择器使用。

  • ID选择器: #id-name 根据元素id属性进行选择
  • 类选择器:.class-name 根据class名称选择
  • 标签选择器:div 根据标签名字选择
  • 子元素选择器:parent>child 筛选parent这个父元素下,符合child这个条件的最直接的子元素,不会匹配孙子元素
  • 子孙选择器:parent son 空格隔开代表可以匹配非直接子元素也就包括子孙元素了
  • prev+next相邻选择器:选择相邻的元素

参考资料

Colly 官方文档学习从入门到入土
Go常用包(二十六):知名爬虫框架Colly
Go每日一库之170:user-agent
Go 爬虫三种框架的基本使用介绍
Python爬虫系列(一)——手把手教你写Python爬虫
https://blog.csdn.net/cun_king/article/details/120936013
Uber Go 语言编码规范

这篇关于golang学习笔记——爬虫colly入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow