写爬虫,Python 是目前的第一选择,但总觉得 Python 太慢了,而且缺乏静态类型。能不能换 Go 语言来试试呢?Colly,这个既优雅又快速的 Go 语言爬虫框架,是你的不二选择。

爬虫框架

简介

Colly,是 gocolly 组织在 Github 上开源的 Go 语言爬虫框架,代码仓库在 https://github.com/gocolly/colly,目前版本为 2.1.0。Colly 具有简洁的 API 设计;性能优越,单核上能达超越每秒一千请求;具备同步、异步和并行模式;支持缓存,能管理请求延迟和最大并发数;自动的 Cookie 和 Session 处理;自动的非 Unicode 响应编码处理;支持分布式爬取等等。

Colly框架

安装

使用 go get 直接安装:

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

示例

我们首先来看一个简单的例子:

package mainimport (    "fmt"    "github.com/gocolly/colly/v2")func main() {    // 初始化默认的收集器    c := colly.NewCollector(        // 设置只访问设定的域名        colly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"),    )    // 对于每一个包含href属性的a元素,执行回调    c.OnHTML("a[href]", func(e *colly.HTMLElement) {        link := e.Attr("href")        // 输出链接        fmt.Printf("Link found: %q -> %s", 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 主要使用收集器 Collector 作为主界面进行爬取,首先进行了 Collector 的实例化,并进行了相关配置,限制了爬取过程的域名,防止爬取到其他网站。

然后,使用回调函数的挂载实现爬取过程中的处理。使用 OnHTML 实现对于特定 HTML 元素的处理,获取页面上所有链接,并进行递归访问;使用 OnRequest 实现对于每一个请求的处理,进行请求信息的输出。

最后,使用收集器的 Visit 接口开始第一个页面爬取,启动了爬虫。

我们可以对访问的 URL 进行更为复杂的筛选,使用 Colly 的 URLFilters:

c := colly.NewCollector(// Visit only root url and urls which start with "e" or "h" on httpbin.orgcolly.URLFilters(regexp.MustCompile("http://httpbin.org/(|e.+)$"),regexp.MustCompile("http://httpbin.org/h.+"),),)

此外,Colly 对于 HTTP 代理有很好的支持,可以支持代理列表的自动轮转选择:

rp, err := proxy.RoundRobinProxySwitcher("socks5://127.0.0.1:1337", "socks5://127.0.0.1:1338")c.SetProxyFunc(rp)

RoundRobinProxySwitcher 实现了对于两个 SOCKS 代理的轮流使用。

另外,可以使用 Redis 作为存储实现一个请求队列以控制并发:

package mainimport (    "log"    "github.com/gocolly/colly"    "github.com/gocolly/colly/queue"    "github.com/gocolly/redisstorage")func main() {    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 := &redisstorage.Storage{        Address:  "127.0.0.1:6379",        Password: "",        DB:       0,        Prefix:   "httpbin_test",    }    // 添加储存到收集器    err := c.SetStorage(storage)    if err != nil {        panic(err)    }    // 清空存储    if err := storage.Clear(); err != nil {        log.Fatal(err)    }    defer storage.Client.Close()    // 创建一个新的请求队列    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)}

代码使用了 redisstorage 创建了一个 Redis 后端的存储,然后创建了一个具有2个消费者线程的队列。把所有初始的 URL 添加到队列中,并开始消费,消费者从队列中取出 URL 开始执行爬取工作。

爬虫框架

总结

Colly 作为一个爬虫框架,接口设计简洁优雅,功能丰富,可以在多种数据收集场景中发挥作用,且无论是开发效率还是运行效率都非常高,实用价值高。

Colly 开源贡献众多,社区活跃,目前已被许多开发者在实践中使用。Colly 文档完善,例子丰富,包括了爬取 Coursera、Instagram、Reddit 等网站的示例,方便学习者参考使用。

框架 go_Colly - 优雅极速的Go语言爬虫框架相关推荐

  1. Go语言爬虫框架之Colly和Goquery

    文章目录 写在前面 Go语言爬虫框架之Colly和Goquery 网络爬虫 爬虫的简单算法 Colly 开始 OnHTML OnRequest / OnResponse HTMLElement Bri ...

  2. python可视化爬虫框架_8个最高效的Python爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中..用这个框架可以轻松爬下来如亚马逊商品信息之类的 ...

  3. 数据挖掘 python框架_8个最高效的Python爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中..用这个框架可以轻松爬下来如亚马逊商品信息之类的 ...

  4. python的scrapy框架的安装_Python3环境安装Scrapy爬虫框架过程及常见错误

    Windows •安装lxml 最好的安装方式是通过wheel文件来安装,http://www.lfd.uci.edu/~gohlke/pythonlibs/,从该网站找到lxml的相关文件.假如是P ...

  5. web前端学习(四):基于koa的EggJs框架,优雅而又完美的Nodejs框架

    **前言: ** Egg.js为企业级开发应用,而产生的一门Node.js框架 它使用模块化渐进式开发,内置多进程管理(Node是单进程,无法使用多核CPU的能力),具有高度可扩展的插件机制. 基于K ...

  6. 欧洲语言框架A1到C2,覆盖欧洲语言参照框架下A1和A2的水平。德语A1,A2水平是什么意思?...

    德语A1,A2水平是歌德证书的等级.与DSH考试级别没有关系,两者的难度不相同. DSH考试全称是 "德国高校外国申请者入学德语考试"由德国各高校单独组织, 但基本模式是统一的, ...

  7. JAVA 爬虫框架webmagic 初步使用Demo

    一想到做爬虫大家第一个想到的语言一定是python,毕竟python比方便,而且最近也非常的火爆,但是python有一个全局锁的概念新能有瓶颈,所以用java还是比较牛逼的, webmagic 官网 ...

  8. python爬虫常用流程_爬虫采集基本流程,python爬虫框架排行榜

    爬虫其实是通过伪装数据,借用代理IP工具,并模仿用户行为实现采集信息,这爬虫采集基本流程是怎样的呢?爬虫的框架影响采集的效果,在编写爬虫之前,选择怎么样的爬虫框架好? 今天就跟智连代理小编去看看pyt ...

  9. java爬虫框架—WebMagic

    什么是网络爬虫 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满 ...

最新文章

  1. 机器学习可解释性工具箱XAI
  2. ssh的详细链接过程
  3. 如何选择RabbitMQ和Kafka
  4. oracle数据库速度测试,【原创】验证在Oracle数据库中操纵数据的各种方法的速度...
  5. 腾讯云 mysql 密码_腾讯云mysql重新设置密码解决办法
  6. c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值
  7. 数据预处理—4.为什么要趋近于正态分布?详解
  8. python设置tk退出_Tkinter退出按钮
  9. html写法影响加载,html加载顺序以及影响页面二次渲染额的因素
  10. PS、AI、Sketch已经老了?这个新生代工具,大家都在偷学!
  11. 网页木马是什么原理?
  12. 在设计四人抢答器中灯全亮_四人智力竞赛抢答器最终版(资料4)
  13. 层次分析法java_AHP层次分析法java实现
  14. 计算机后端维护,机房智能交通后台系统运行维护内容.doc
  15. ElmentUI数据表格 序号
  16. 硅谷高效工作法 -知乎大学
  17. 多端开发之uniapp开发app
  18. [CISCN2019 华东南赛区]Web11
  19. 观呼吸缓解夏日烦躁情绪
  20. 迪士尼超级计算机多少钱,上海迪士尼乐园公布票务调整方案,明年1月9日起实行新票价...

热门文章

  1. Pytest Hooks方法之pytest_collection_modifyitems改变测试用例执行顺序
  2. 【JMeter】Threads(users)3种类型
  3. (转)Java atomic原子类的使用方法和原理(一)
  4. sqlserver如何读写操作windows系统的文件
  5. java8--IO(java疯狂讲义3复习笔记)
  6. JQuery 操作 radio 被坑一例
  7. 【转载】网易将军令工作原理
  8. sfs2x 连接 mongodb
  9. tool vmmap 配置符号文件 symbolic file
  10. 关于c#中全局类变量的建立