非零基础自学Golang 第17章 HTTP编程(上) 17.3 爬虫框架gocolly 17.3.1 gocolly简介

news2024/11/16 15:58:40

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第17章 HTTP编程(上)
        • 17.3 爬虫框架gocolly
          • 17.3.1 gocolly简介

第17章 HTTP编程(上)

17.3 爬虫框架gocolly

我们在之前学习了如何使用标准库实现HTTP爬虫【其实也不算,就实现了简单的请求,但是爬虫不就是这样嘛,拿到数据下去再进行解析】,在实际项目中,我们往往会使用一些第三方的爬虫框架来编写爬虫程序,这是因为框架是基于标准库的封装,本身会提供非常丰富且功能强大的API调用,我们只需编写简短的代码就能实现一个高性能爬虫,这里推荐使用colly爬虫框架。

colly是用Go语言实现的网络爬虫框架。colly快速优雅,在单核上每秒可以发起1K以上请求;以回调函数的形式提供了一组接口,可以实现任意类型的爬虫。

17.3.1 gocolly简介

colly的代码托管在GitHub上,官方网站为http://go-colly.org/。

在这里插入图片描述

colly使用起来简洁高效,有着如下特性:

  • 非常清晰的API。
  • 快速(单核上>1K请求/秒)。
  • 管理请求延迟和每个域的最大并发数。
  • 自动Cookie和会话处理。
  • 同步/异步/并行抓取。
  • 高速缓存。
  • 自动处理非Unicode的编码。
  • Robots.txt支持。
  • 分布式抓取。
  • 通过环境变量配置。
  • 可扩展。

下载安装colly框架只需使用如下命令:

go get -u github.com/gocolly/colly

在这里插入图片描述

colly的主要实体是一个Collector对象。Collector在收集器作业运行时管理网络通信并负责执行附加的回调。

要使用colly,必须先初始化Collector。

c := colly.NewCollector()

一旦得到一个colly对象,就可以向colly附加各种不同类型的回调函数(回调函数在colly中广泛使用)来控制收集作业或获取信息,回调函数如下:

// 请求发送前所运行的函数
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)
})

// 接收到HTML网页后所运行的函数
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)
})

// 接收到XML格式的响应内容后所运行的函数
c.OnXML("//h1", func(e *colly.XMLElement) {
 	fmt.Println(e.Text)
})

// 请求完成后所运行的函数
c.OnScraped(func(r *colly.Response) {
 	fmt.Println("Finished", r.Request.URL)
})

colly的回调函数非常清晰,比如OnRequest表示在请求之前所需要做的事情,OnResponse表示在获取到响应后所做的事情。我们来看一个最简单的例子:

[ 动手写 17.3.1 ]

package main

import (
   "fmt"
   "github.com/gocolly/colly"
)

func main() {

   c := colly.NewCollector()

   // 查找和访问所有的链接
   c.OnHTML("a[href]", func(e *colly.HTMLElement) {

      e.Request.Visit(e.Attr("href"))
   })

   c.OnRequest(func(r *colly.Request) {
      fmt.Println("Visiting", r.URL)
   })

   c.Visit("http://go-colly.org/")

}

动手写17.3.1使用NewCollector创建了一个Collector对象,每当colly获取到HTML网页时,就会查找网页中的所有链接,并添加到访问队列中。

OnRequest在发起请求前就会打印输出访问的URL。c.Visit表示初始访问链接为http://go-colly.org/,这段程序的作用是访问全站链接。

程序运行的结果如下:

在这里插入图片描述

NewCollector在初始化时,可以传入colly.UserAgent来设置请求的UA,绕过网站的反爬策略。

OnRequest一般会在请求前设置一些模拟真实浏览器的Header头,举个例子:

[ 动手写 17.3.2]

package main

import (
   "fmt"
   "github.com/gocolly/colly"
)

func main() {

   // NewCollector(options ...func(*Collector)) *Collector
   // 声明初始化NewCollector对象时可以指定Agent,连接递归深度,URL过滤以及domain限制等

   c := colly.NewCollector(
      colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121Safari/537.36"))

   // 发出请求时 附的回调
   c.OnRequest(func(r *colly.Request) {

      // Request 头部设定
      r.Headers.Set("Connection", "keep-alive")
      r.Headers.Set("Accept", "*/*")
      r.Headers.Set("Origin", "")
      r.Headers.Set("Accept-Encoding", "gzip, deflate")
      r.Headers.Set("Accept-Language", "zh-CN, zh;q=0.9")
      //r.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
      fmt.Println("Visiting", r.URL)

   })

   // 打印状态响应码
   c.OnResponse(func(r *colly.Response) {
      fmt.Println("response received ", r.StatusCode)

   })

   // 对响应的HTML 元素处理
   c.OnHTML("title", func(e *colly.HTMLElement) {
      fmt.Println("title:", e.Text)
   })

   c.Visit("https://www.baidu.com")
}

动手写17.3.2设置了大量请求头信息,User-Agent也可以在请求头中设置,运行结果如下:

在这里插入图片描述

没毛病。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

别乱用了,用新的。Go SliceHeader 和 StringHeader 将会被废弃!

大家好,我是煎鱼。Go 语言中有个很经典的 (Slice|String)Header,经常出现在大家视野中,为此我写了《Go SliceHeader 和 StringHeader,你知道吗?》给大家介绍,避免被面试官卷到。以重点来讲,Slic…

Alibaba送给开发人员的“礼物”:Java架构成长笔记,深入内核,拒绝蒙圈

提起阿里,行外人联想到的关键词无非是“交易”、“淘宝”、“支付宝”,但对于程序员来说,阿里庞大的技术体系才是最吸引人的。实际上阿里作为国内一线互联网公司的头把交椅,内部的技术体系和发展都是备受关注的,对于程…

【javaScript总结归纳】字符串常用方法总结

前言 在js中我们对字符串进行一部分截取,可以使用slice()函数截取,也可以直接用substring()函数来截取,但是截取也有可能出bug const str小𠮷和小𧨁今天吃了50块钱的KFC console.log(str.slice(0,5)); 可以在控制台看…

评估EtherCAT从站节点解决方案

本系列博客文章的第1部分介绍了用于C2000™微控制器的EtherCAT从站堆栈解决方案的市场机遇,以及从站堆栈开发快速入门的三个阶段指南。第2部分详细说明了TIC2000 MCU EtherCAT实施的特点和优势。第3部分分别介绍了使用EtherCAT从站和C2000 Delfino MCU controlCARD套…

Linux【windows使用xshell连接本地虚拟机】【Mac使用terminal连接本地虚拟机】

文章目录对于本地虚拟机的配置使用Mac的terminal的ssh连接本地虚拟机windows使用xshell连接本地虚拟机对于本地虚拟机的配置 IP地址和子网掩码。 在虚拟机中使用ping命令判断虚拟机到宿主机是否是连通的。(不通的话,关闭Windows防火墙,再试一…

python+pyhyper实现识别图片中的车牌号

背景 最近领导给布置了一个基于图片识别车牌号的工具开发任务,然后就去研究实现逻辑,自己根据opencv写了一个小demo,发现不仅速度慢而且成功率极低。然后,就找到了Hyperlpr开源项目。 环境搭建 排雷1:有教程说在git…

动态内存管理易错点+分析例题

复习一下: 常见的错误: 1.可能返回的是空指针 2.对动态开辟的内存越界访问 3.非动态开辟内存却用free释放 4.使用free释放动态开辟内存的一部分 5.free多次释放 如果加了pNULL的话 free(p)相当于啥也不干 程序起码不会崩掉 6.动…

RabbitMQ、RocketMQ、Kafka延迟队列实现

延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单。 那么&#xf…

Proteus8仿真:51单片机IrLink红外发送加接受模块的使用

51单片机IrLink红外的使用元器件原理图部分代码单片机1发送main.c单片机2接受main.c工程文件元器件 元器件名称51单片机AT89C51红外收发IRLINK按键BUTTON发光二极管LED-RED时钟激励源DCLOCK与门74LS08示波器 原理图部分 关于IRLINK的使用: 在Proteus上就是一个红外…

数据中台选型前必读(七):解读数据服务的四大关键技术

在前面的文章中,我们介绍了“数据服务”对于“数据中台”的重要性,并讲解了数据服务解决的问题及其核心功能,在这个系列的最终篇我们展开聊聊数据服务的四大关键技术,然后总结一下数据服务架构的三大关键点,希望对大家…

JSP ssh培训管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 培训管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

校园打架行为识别检测 yolov7

校园打架行为识别检测系统基于python基于yolov7深度学习框架边缘分析技术,自动对校园、广场等区域进行实时监测,当监测到有人打架斗殴时,系统立即抓拍存档语音提醒,并将打架行为回传给学校后台,提醒及时处理打架情况。…

Word控件Spire.Doc 【超链接】教程(7):在 C#、VB.NET 中的 Word 中创建图像超链接

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

你一定要会的JavaFile

File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径这个路径可以是存在的,也允许是不存在的File的构造 方法名称说明public File(String pathname)根据文件路径创建文件对象public File(String parent,String child)根据父路径名…

第4章 角色Api控件器的实现与调试

1 自定义管道中间件 1.1 WebApi.Middleware.CorsMiddleware namespace WebApi.Middleware { /// <summary> /// 【跨域访问中间件--类】 /// <remarks> /// 摘要&#xff1a; /// 该管道中间件类主要为了解决在由vue/uni-app前端项目(Cors)访问当前后端项…

你的期待薪资是多少?为什么?

很多人去面试的时候&#xff0c;就像打游戏&#xff0c;过五关斩六将&#xff0c;终于到最后一关了&#xff0c;但是谈薪资的难度堪比打游戏中搞定终级 boss 的难度&#xff0c;真的是太「南」了&#xff0c;好多人都是因为这个问题让自己五味杂陈呀。报高了怕好 offer 失之交臂…

【Call for papers】SIGIR-2023(CCF-A/内容检索/2023年1月31日截稿)

The 46th International ACM SIGIR Conference on Research and Development in Information Retrieval will be held from 23-27 July, 2023 in Taipei. 文章目录1.会议信息2.时间节点3.论文主题1.会议信息 会议介绍&#xff1a; SIGIR是展示新研究成果和展示信息检索新系统和…

Postgresql INDEX HOT 原理与更好的 “玩转” INDEX

随着问问题的同学越来越多&#xff0c;公众号内部私信回答问题已经很困难了&#xff0c;所以建立了一个群&#xff0c;关于各种数据库的问题都可以&#xff0c;目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS&#xff0c;SQL SERVER 等&#xff0c;期待你的加入&#…

[洛谷]P1996 约瑟夫问题

[洛谷]P1996 约瑟夫问题一、问题描述题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示二、思路分析1、算法标签&#xff1a;2、算法分析&#xff1a;三、代码实现1、环形链表2、队列一、问题描述 [洛谷]P1996 约瑟夫问题 题目描述 nnn 个人围成一圈&#xff0c;从…

3.Spark 操作

基于centos7 ,hadoop2.7.3, spark-2.4.4-bin-hadoop2.7.tgz 目录: 一.spark shell二. 读取hdfs文件三.Idea中编写wordcount一.spark shell 在spark shell中编写wordcount程序读取本地文件 1、准备数据源(创建目录,创建文件) 2.代码: --注意修改文件地址-- sc.textF…