[译]go爬虫框架colly - 安装使用及配置

954 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情


本文翻译自官方文档:Scraping Framework for Golang (go-colly.org)


Gopher们的快速优雅的爬虫框架


Colly提供用于编写各种爬取器/爬虫的整洁的接口。

使用 Colly,可以很容易地从网站提取结构化数据,这些数据可用于广泛范围的应用,如数据挖掘,数据处理或存档。

特性

  • 整洁的 API
  • 快速 (单核上 >1k 请求/秒)
  • 管理请求延迟和每个域的最大并发量
  • 自动处理 Cookie 和 Session
  • 同步/异步/并行 爬取
  • 分布式爬取
  • 缓存
  • 自动对未编码的响应进行编码
  • 支持 Robots.txt
  • 支持 Google App Engine

Colly 含有爬取需要的所有工具
商用免费
Colly的开发由社区驱动且公开

func main() {
	c := colly.NewCollector()

	// Find and visit all links
	c.OnHTML("a", 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/")
}

说明

简介

Colly 是一个用于构建网络爬虫的go语言框架。使用 Colly ,可以构建各种复杂度的网络爬虫,从简单的爬虫到复杂的处理百万级网页的异步网络爬虫。Colly 提供了网络请求和处理接收内容的 API(例如:和 HTML 文档中的 DOM 树进行交互)。

在下面可以从文档中找到一些常用且有帮助的页面。

也可以在 GoDoc 参考 API 。

如何安装

Colly 只有一个前提条件,就是 go 编程语言。可以使用 go 的安装向导来安装。

安装 Colly

在终端输入以下命令并回车来安装 Colly 。

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

开始

在使用 Colly 之前确保是最新的版本。查看 安装向导 [中文]了解更多细节。

通过一些简单的示例开始。

首先,需要导入 Colly 到代码库中。

import "github.com/gocolly/colly"

Collector

Colly 主要的实体是一个 Collector 对象。当一个 collector 任务运行时,Collector 为绑定回调的运行管理网络通信和响应。要使用 colly ,需要初始化一个 Collector

c := colly.NewCollector()

回调

可以为一个 Collector 绑定不同类型的回调函数,用来控制收集任务或者用来获取信息。在包文档中查看 关联部分

为 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)
})

回调的调用顺序

1. OnRequest

在请求前调用

2. OnError

请求期间发生错误时调用

3. OnResponse

接收到响应后调用

4. OnHTML

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

5. OnXML

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

6. OnScraped

在 OnXML 回调后调用

配置

Colly 是一个高度可定制的爬取框架。它有智能的默认配置并提供了大量选项以更改配置。

Collector 配置

Collector 属性的完整列表可在 这里 找到。 初始化 collector 的推荐方法是使用 colly.NewCollector(options...)

使用默认设定创建 collector :

c1 := colly.NewCollector()

创建其它 collector 并且改变 User-Agent 和 url revisit (网址重新访问)选项:

c2 := colly.NewCollector(
	colly.UserAgent("xy"),
	colly.AllowURLRevisit(),
)

或者

c2 := colly.NewCollector()
c2.UserAgent = "xy"
c2.AllowURLRevisit = true

配置可在爬取任务的任何节点通过覆写 collector 的属性来更改。

一个好的示例是一个 User-Agent 切换器在每次请求时更改 User-Agent :

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func RandomString() string {
	b := make([]byte, rand.Intn(10)+10)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}

c := colly.NewCollector()

c.OnRequest(func(r *colly.Request) {
	r.Headers.Set("User-Agent", RandomString())
})

通过环境变量配置

Collector 的默认配置可通过环境变量更改。这允许我们无需重新编译即可调整 collector 。 环境解析是 collector 初始化的最后一步,所以初始化后的每个配置改动会覆写环境解析的配置。

环境配置变量

  • ALLOWED_DOMAINS (逗号分割的域列表)
  • CACHE_DIR (字符串)
  • DETECT_CHARSET (y/n)
  • DISABLE_COOKIES (y/n)
  • DISALLOWED_DOMAINS (逗号分割的域列表)
  • IGNORE_ROBOTSTXT (y/n)
  • MAX_BODY_SIZE (整数)
  • MAX_DEPTH (整数 - 0 表示无限)
  • PARSE_HTTP_ERROR_RESPONSE (y/n)
  • USER_AGENT (字符串)

HTTP 配置

Colly 使用 go 语言默认的 http client 作为网络层。 HTTP 选项可通过更改默认的 [HTTP roundtripper] (godoc.org/net/http#Ro…) 来调整。

c := colly.NewCollector()
c.WithTransport(&http.Transport{
	Proxy: http.ProxyFromEnvironment,
	DialContext: (&net.Dialer{
		Timeout:   30 * time.Second,
		KeepAlive: 30 * time.Second,
		DualStack: true,
	}).DialContext,
	MaxIdleConns:          100,
	IdleConnTimeout:       90 * time.Second,
	TLSHandshakeTimeout:   10 * time.Second,
	ExpectContinueTimeout: 1 * time.Second,
}