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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多