首页 > 其他分享 >Go语言爬虫框架colly简析

Go语言爬虫框架colly简析

时间:2023-11-12 10:05:43浏览次数:36  
标签:OnHTML 简析 hackerspaces Link found Go org colly

Go语言爬虫框架colly简析_go

一、简介

随着互联网的快速发展,数据已经成为了一种非常重要的资源,各类用户都需要通过爬虫来获取所需的数据。在众多的编程语言中,Go语言以其高效、简洁、并发等特性,成为越来越优选的编程语言,并且在爬虫领域也有着广泛应用。

在爬虫框架领域,各流行编程语言都有自己热门框架,如Python中的selenium、Scrapy、PySpider等,Java中的Nutch、Crawler4j、WebMagic、WebCollector等。colly 是一款基于 Go 语言开发的网络爬虫框架,由于其出色的性能表现和易用性,colly 爬虫已经成为了很多开发者首选的爬虫框架之一。

Go语言爬虫框架colly简析_go_02

归纳起来,colly 爬虫具有如下特征:


  • 简洁API
  • 快速(单核请求速率>1k/秒)
  • 管理请求延迟和每个域的最大并发性
  • 自动cookie和会话处理
  • 同步/异步/分布式并行抓取
  • 缓存
  • 非unicode响应的自动编码
  • Robots.txt网站地图支持
  • 谷歌应用引擎支持
  • 易于扩展和定制

二、colly爬虫生命周期与基本举例

(一)生命周期

使用colly的第一步:下载colly包

go get -u github.com/gocolly/colly/v2

第二步,在代码中导入包:

import "github.com/gocolly/colly/v2"

 colly的主体是Collector对象,它管理网络通信和负责在作业运行时执行附加的回调函数。使用colly需要的第一步是必须先初始化Collector:

c := colly.NewCollector()

然后,可以向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.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.OnScraped(func(r *colly.Response) {
    fmt.Println("Finished", r.URL)
})

回调函数(可以理解为colly的生命周期函数)的调用顺序如下:

1. OnRequest

在发起请求前被调用

2. OnError

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

3. OnResponse

收到回复后被调用

4. OnHTML

在OnResponse之后被调用,如果收到的内容是HTML

5. OnScraped

在OnHTML之后被调用。 

归纳一下,colly 支持的生命周期事件函数(及类型),如下:

生命周期函数(事件)

作用

NewCollector

创建收集器对象

Visit

开始访问

OnRequest

请求执行之前调用,一般用来设置请求头等

OnResponse

响应返回之后调用

OnHTML

监听执行 selector,匹配指定元素后回调

OnXML

监听执行 selector。和OnHTML类似,用于匹配xpath解析

OnHTMLDetach

取消监听,参数为 selector 字符串

OnXMLDetach

取消监听,参数为 selector 字符串

OnScraped

完成抓取后执行,即在所有OnHTML之后执行,可以用来做一些回收操作

OnError

请求发生错误回调,比如404错误

最后一步,c.Visit() 正式启动网页访问。

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

(二)基础示例

官方提供的简单示例代码: 

package main

import (
    "fmt" 

    "github.com/gocolly/colly/v2"
)

func main() {

    // Instantiate default collector
    c := colly.NewCollector()

    // Visit only domains: hackerspaces.org, wiki.hackerspaces.org
    c.AllowedDomains = []string{"hackerspaces.org", "wiki.hackerspaces.org"}

    // On every a element which has href attribute call callback
    c.OnHTML("a[href]", func(e *colly.HTMLElement) {

        link := e.Attr("href")

        // Print link
        fmt.Printf("Link found: %q -> %s\n", e.Text, link)

        // Visit link found on page
        // Only those links are visited which are in AllowedDomains
        c.Visit(e.Request.AbsoluteURL(link))
    })

    // Before making a request print "Visiting ..."
    c.OnRequest(func(r *colly.Request) {
        fmt.Println("Visiting", r.URL.String())
    })

    // Start scraping on https://hackerspaces.org
    c.Visit("https://hackerspaces.org/")
}

该实例程序仅访问hackerspaces.org域内的链接,OnHTML回掉函数的选择器为a[href],选择页面内具有href属性的a类型元素,找到链接后继续抓取。 运行的部分结果如下:

PS E:\mygo\src\github.com\gocolly\colly\_examples\basic> .\basic.exe

Visiting https://hackerspaces.org/

Link found: "navigation" -> #column-one

Link found: "search" -> #searchInput

Link found: "" -> /File:Cbase07.jpg

Visiting https://hackerspaces.org/File:Cbase07.jpg

Link found: "navigation" -> #column-one

Link found: "search" -> #searchInput

Link found: "File" -> #file

Link found: "File history" -> #filehistory

Link found: "File usage" -> #filelinks

Link found: "" -> /images/e/ec/Cbase07.jpg

Visiting https://hackerspaces.org/images/e/ec/Cbase07.jpg

Link found: "800 × 600 pixels" -> /images/thumb/e/ec/Cbase07.jpg/800px-Cbase07.jpg

Visiting https://hackerspaces.org/images/thumb/e/ec/Cbase07.jpg/800px-Cbase07.jpg



引用

标签:OnHTML,简析,hackerspaces,Link,found,Go,org,colly
From: https://blog.51cto.com/zhuxianzhong/8324791

相关文章

  • 【6.0】Go语言基础之循环语句
    【一】判断语句if~elsepackagemainimport"fmt"//if~else的使用//[1]语法//语法if条件{条件符合,执行代码}//语法elseif条件{条件符合,执行代码}//语法else{条件符合,执行代码}//[2]执行代码的左侧{必须跟关键字在同一行funcmain(){ score:......
  • 【5.0】Go语言基础之包的使用
    【一】包的作用为了便于组织代码,同一种类型的代码,写在同一个包下,便于管理【二】定义包的步骤【1】新建一个文件夹【2】内部有很多go文件【3】go文件的第一行声明包名在每个go文件的第一行,都要声明包名,并且包名必须一致packageuser【4】在一个文件夹下只能有一个包(......
  • 【8.0】Go语言基础之可变函数参数、map的使用
    【一】可变长参数【1】任意长度的指定类型的参数packagemainimport"fmt"funcmain(){ //可变长参数 //调用函数 foo(1,2,3,4,5,6) //这是接收到的参数a:>>>>[123456] //这是接收到的参数a的类型:>>>>[]int}//可以接收任意长度的int类......
  • 【7.0】Go语言基础之数组、切片
    【一】数组数组是一种类型,可以连续存储数据,但是数据类型的是一致的。类似于Python中的列表,是一种数据结构【1】数组的定义packagemainimport"fmt"funcmain(){ //定义数组 //定义一个长度为3的数组,里面的数据类型为int类型 //定义好数组以后,大小就固......
  • Golang布隆过滤器升级版
    作用:平常使用的布隆过滤器可以用来过滤Redis空数据,避免缓存穿透。升级点:将原本的bool数组位更改为int数组,实现便于删除操作的场景。代码如下:packagemainimport( "fmt")//BloomFilter布隆过滤器typeBloomFilterstruct{ bitArray[]int//升级版结构哈希所落位置+......
  • 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式
    2023-11-11:用go语言,字符串哈希+二分的例题。给定长为n的源串s,以及长度为m的模式串p,要求查找源串中有多少子串与模式串匹配,s'与s匹配,当且仅当s'与s长度相同,且最多有k个位置字符不同。其中1<=n,m<=10^6,0<=k<=5。来自左程云。答案2023-11-11:go代码用灵捷3.5......
  • 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式
    2023-11-11:用go语言,字符串哈希+二分的例题。给定长为n的源串s,以及长度为m的模式串p,要求查找源串中有多少子串与模式串匹配,s'与s匹配,当且仅当s'与s长度相同,且最多有k个位置字符不同。其中1<=n,m<=10^6,0<=k<=5。来自左程云。答案2023-11-11:go代码用......
  • Go实现Zabbix企业微信应用通知告警
    企业微信https://work.weixin.qq.com/企业微信->应用管理->创建应用个人微信也能接收企业微信信息我的企业->微信插件->扫码关注特殊说明之前企业微信只需要调用接口就能实现微信应用通知,最近改版,变得比较复杂1:需要配置可信IP才能发2:配置可信IP前需要先设置可信域名......
  • Fight Hard for Ecological Protection and Governance of the Yellow River to Addre
    1.Effectivemeasureaimedataddressingthewatercontamination:Wewill fight hard for ecological protection and governance of the Yellow River. We will fully implement the requirements of determining the city, the land, the people,......
  • 想入坑golang web,向大佬们请教些问题?
    当你准备入坑Go语言的Web开发时,以下是一些常见的问题,你可以向大佬们请教:如何设置和启动一个GoWeb服务器?Go语言有哪些常用的Web开发框架?它们之间有什么区别和优劣势?Go语言中的路由是如何实现的?如何处理不同的HTTP请求方法和URL参数?Go语言如何处理请求和响应,以及如何......