内容简介:今天为大家介绍的是一款首先,你可以使用一下命令安装其次,构建
今天为大家介绍的是一款 go
语言爬虫框架 -- colly
。
开始
首先,你可以使用一下命令安装 colly
。
go get -u github.com/gocolly/colly/...
其次,构建 Collector
,添加事件,然后访问:
package main import ( "fmt" "github.com/gocolly/colly" ) func main() { // 初始化 colly c := colly.NewCollector( // 只采集规定的域名下的内容 colly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"), ) // 任何具有 href 属性的标签都会触发回调函数 // 第一个参数其实就是 jquery 风格的选择器 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)) }) // 在请求发起之前输出 url c.OnRequest(func(r *colly.Request) { fmt.Println("Visiting", r.URL.String()) }) // 从以下地址开始抓起 c.Visit("https://hackerspaces.org/") }
运行以上代码,会从最开始的地址抓起,一直把规定的两个域名下的页面递归采集完。看,是不是很简单很方便!
登录鉴权
某些网站的某些页面可能需要登录状态才能访问。 Colly
提供 Post
方法用于登录请求( colly
本身会维护 cookie
)。
// authenticate err := c.Post("http://example.com/login", map[string]string{"username": "admin", "password": "admin"}) if err != nil { log.Fatal(err) }
很多网站可能会有验证码、 csrf_token
之类的仿网络攻击策略。对于 csrf_token
,一般都会在页面的某个位置,比如表单,或者 mate
标签里,这些都是很容易获取到的。对于验证码,可以尝试在控制台输入结果或者采用图片识别的方式。
速率控制
很多内容网站会有防采集策略,所以过快的请求速率很可能导致被封 ip
。这里可以使用 LimitRule
限制采集速度。
// 对于任何域名,同时只有两个并发请求在请求该域名 c.Limit(&colly.LimitRule{DomainGlob: "*", Parallelism: 2})
上面是一个简单的例子。除了可以限制域名并发量外,还可以限制间隔时间等。我们看一下 LimitRule
的结构:
type LimitRule struct { // 匹配域名的正则表达式 DomainRegexp string // glob 匹配模式 DomainGlob string // 在发起一个新请求时的等待时间 Delay time.Duration // 在发起一个新请求时的随机等待时间 RandomDelay time.Duration // 匹配到的域名的并发请求数 Parallelism int waitChan chan bool compiledRegexp *regexp.Regexp compiledGlob glob.Glob }
队列与 redis
存储支持
某些情况下,我们的爬虫可能会主动或被动地挂掉,所以一个合理的进度保存有助于我们排除已经爬过的内容。这时候我们就需要用到队列以及存储支持。
Colly 本身有文件存储模式,默认是 未开启状态。推荐使用 redis 进行存储。
urls := []string{ "http://httpbin.org/", "http://httpbin.org/ip", "http://httpbin.org/cookies/set?a=b&c=d", "http://httpbin.org/cookies", } c := colly.NewCollector() // 创建 redis storage storage := &redisstorage.Storage{ Address: "127.0.0.1:6379", Password: "", DB: 0, Prefix: "httpbin_test", } // 把 storage 设置到 collector 上 err := c.SetStorage(storage) if err != nil { panic(err) } // 删除之前的数据(如果需要) if err := storage.Clear(); err != nil { log.Fatal(err) } // 结束后关闭 redis 连接 defer storage.Client.Close() // 使用 redis 作为存储后端,创建请求队列 // 消费者数量设定为 2 q, _ := queue.New(2, storage) c.OnResponse(func(r *colly.Response) { log.Println("Cookies:", c.Cookies(r.Request.URL.String())) }) // 把 url 加入到队列 for _, u := range urls { q.AddURL(u) } // 开始采集 q.Run(c)
使用队列时,在解析到页面的链接后,可以继续把链接的 url
添加到队列中。
内容解析
内容抓取到了,如何解析并获取我们想要的内容呢?
以 html
为例( colly
也有 xml
等内容解析):
// refentry 内容 c.OnHTML(".refentry", func(element *colly.HTMLElement) { // ... }) OnHtml 第一个参数是 jquery风格的选择器,第二个参数是 callback,callback 会传入 HTMLElement 对象。HTMLElement 结构体: type HTMLElement struct { // 标签的名称 Name string Text string attributes []html.Attribute // 当前的 request Request *Request // 当前的 response Response *Response // 当前节点的 DOM 元素 DOM *goquery.Selection // 在该 callback 回调中,此 element 的索引 Index int }
其中,可以通过 DOM
字段操作(增删节点)、遍历、获取节点内容。
DOM
字段是 Selection
类型,该类型提供了大量的方法。如果你用过 jQuery
,你一定会觉得熟悉。
举个栗子,我们想要删除 h1.refname
标签,并返回父元素的 html
内容:
c.OnHTML(".refentry", func(element *colly.HTMLElement) { titleDom := element.DOM.Find("h1.refname") title := titleDom.Text() titleDom.Remove() content, _ := element.DOM.Html() // ... })
其他
除此之外, Colly
还具有其他强大的功能,比如最大递归深度、 url
过滤、 url revisit
(默认一个 url 只访问一次)以及编码检测等。这些都可以在官网文档或者 colly
代码里找到影子。
另附上 colly
文档地址: http://go-colly.org/docs/intr...
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 超级易懂爬虫系列之爬虫框架scrapy
- python网络爬虫(14)使用Scrapy搭建爬虫框架
- 一个咸鱼的python爬虫之路(五):scrapy 爬虫框架
- 11、web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
- Scrapy框架-----爬虫
- 网络爬虫框架开发笔记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。