博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写爬虫还在用 python?快来试试 go 语言的爬虫框架吧
阅读量:6613 次
发布时间:2019-06-24

本文共 3561 字,大约阅读时间需要 11 分钟。

今天为大家介绍的是一款 go 语言爬虫框架 -- colly

开始

首先,你可以使用一下命令安装 colly

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

其次,构建 Collector,添加事件,然后访问:

package mainimport (    "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)。

// authenticateerr := 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 storagestorage := &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 作为存储后端,创建请求队列// 消费者数量设定为 2q, _ := 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 文档地址:


bVbjLVY?w=800&h=300

转载地址:http://iraso.baihongyu.com/

你可能感兴趣的文章
微信企业版曝光 移动办公协同市场怎么走?
查看>>
C#日期格式化
查看>>
被企业微信吓到了吗?离做到极致还早
查看>>
机器学习如何威胁企业安全
查看>>
以测试用例为核心的软件测试
查看>>
浙江湖州出台光伏补贴新政 5年建设10万户家庭屋顶光伏
查看>>
五种机房动力环境监控系统的优缺点
查看>>
大数据企业要发展不能仅仅靠秀“肌肉”
查看>>
聊聊Oracle外键约束的几个操作选项
查看>>
人脸支付有漏洞?支付宝:不是所有用户都能用
查看>>
《请君入瓮——APT攻防指南之兵不厌诈》—第8章8.节工具及战术
查看>>
21 世纪的孩子们请注意!编程已成必备技能
查看>>
《AutoCAD 2016中文版从入门到精通》——1.3 图形的缩放和平移
查看>>
MapReduce多个job同时使用的方式(从网上找到的案例,原始博文:http://www.cnblogs.com/yjmyzz/p/4540469.html)...
查看>>
《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.4节在Photoshop中还原操作...
查看>>
Tracking.js —— 实现网页上的人脸识别
查看>>
15 个 Android 通用流行框架大全
查看>>
《嵌入式 Linux应用程序开发标准教程(第2版)》——2.2 Linux启动过程详解
查看>>
《深入理解Android:卷III A》一一3.2音量管理
查看>>
test
查看>>