持续创作,加速成长!这是我参与「掘金日新计划 · 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,
}