colly是用golang实现的一款常用的爬虫框架。它的主要特点是轻量、快速,设计非常优雅,并且分布式的支持也非常简单,易于扩展。
如何安装colly?
colly安装的唯一先决条件:已安装go的编程环境(毕竟是面向go语言的爬虫框架)
然后仅需使用一行go get命令即可完成安装:
# 省略号是你想要安装的版本
# 如:github.com/gocolly/colly/v2
go get -u github.com/gocolly/colly/...
快速上手
安装完成之后,笔者借官方的demo来体验colly的基础使用方法。附官方文档的链接:官方文档
1. 导入colly模块
import "github.com/gocolly/colly/v2"
2.使用默认的配置创建收集器
c := colly.NewCollector()
NewCollector()方法内可以添加参数以更改收集器的配置。作为初学者,这里暂时不作讨论。
3.事件监听
事件监听,就是通过callbacks处理相关的事件。
将回调函数添加到收集器的事件监听函数中以控制收集的任务或搜索特点的信息。例如使用c.OnHTML,收集器就会遍历所有的html标签。
// 遍历所有的a标签,如果有href属性就回调
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
fmt.Printf("Link found: %q -> %s\n", e.Text, link)
c.Visit(e.Request.AbsoluteURL(link))
})
// 在请求之前打印“Visiting xxx”
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
这里列举一下相关的事件类型:
- OnRequest 在请求之前调用
- OnError 如果在请求期间发生错误,则调用
- OnResponseHeaders 在接收到响应头之后调用
- OnResponse 在收到回复后调用
- OnHTML 如果接收到的内容是 HTML,则在 OnResponse 之后立即调用
- OnXML 如果接收到的内容是 HTML 或 XML,则在 OnHTML 之后调用
- OnScraped 在 OnXML 回调之后调用
4.指定收集器启动时应访问的URL
c.Visit("https://hackerspaces.org/")
完整的代码
package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
// Instantiate default collector
c := colly.NewCollector(
// Visit only domains: hackerspaces.org, wiki.hackerspaces.org
colly.AllowedDomains("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/")
}
执行程序可以清晰地看到,在对指定URL访问前先打印了“Visiting xxx”,然后爬取网页中a标签的href属性,并打印到控制台,如截图所示,https://wiki.hackerspaces.org网页中有一个a标签内容为navigation,其href属性为#column-one。
结语
可以看到colly的爬虫框架非常简洁,结合go的并发特征,会给爬虫带来很高的效率。美中不足的是目前文档不是很多,需要持续地消化。