colly
colly是一个个go语言实现的轻量快速的爬虫框架,提供了简单直观的编程接口。
架构
colly中通过注册回调函数实现控制爬取一个页面时所有流程。
用一些回调事件抽象出了一个请求的生命周期
- 构建请求
- 发送请求
- 获取文档或数据
- 解析文档或清洗数据
- 数据处理或持久化
支持的回调事件主要有:
- OnRequest 请求执行之前调用
- OnResponse 响应返回之后调用
- OnHTML 监听执行 selector
- OnXML 监听执行 selector
- OnHTMLDetach,取消监听,参数为 selector 字符串
- OnXMLDetach,取消监听,参数为 selector 字符串
- OnScraped,完成抓取后执行,完成所有工作后执行
- OnError,错误回调
实例
package main
import (
"fmt"
"github.com/gocolly/colly/v2"
)
func main() {
// Instantiate default collector
c := colly.NewCollector(
// url过滤条件
colly.URLFilters(
regexp.MustCompile("http://httpbin\\.org/(|e.+)$"),
regexp.MustCompile("http://httpbin\\.org/h.+"),
),
// 只爬取指定域名下的url
colly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"),
)
// 在页面中捕捉到<a href="foo">时 处理这个href 可以根据一定的过滤条件判断是否继续抓取这个url 在创建Collector时指定
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))
})
//
c.SetCookies(URL string,siteCokkie)
// 请求每个url前回调 可以提前写入cookie等信息
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnResponse(func(r *colly.Request) {
// 可以在这里进行数据持久化
})
// 爬虫的起点
c.Visit("https://hackerspaces.org/")
}