colly爬虫框架

  • colly是用go实现的网络爬虫框架
  • 这个框架与python的scrapy框架很像
  • 数据清洗时,可以像jquery中一样用选择器来选择web元素
  • 同时,清洗数据也可以使用xpath风格来定位元素

安装依赖

[ ~ ]# go get -u github.com/gocolly/colly/

colly中的Collector对象

collector := colly.NewCollector() // 实例化一个采集对象

colly中的回调函数

OnRequest

  • 在发起请求前被调用

OnError

  • 请求过程中如果发生错误被调用

OnResponse

  • 收到回复后被调用

OnHTML

  • 收到内容按html的jquery进行数据清洗

OnXML

  • 收到内容按XML的xpath进行数据清洗

OnScraped

  • 在OnHTML之后被调用

Visit(Post等Requests方法)

  • 作为爬虫实例对象collector的启动入口

Visit工作原理

  • 获取配置,例如限制等
  • 发起requests前先执行相应的handler,例如加载代理等
  • 发起requests请求,也就是Visit中的fetch过程
  • 发起requests前先执行相应的handler,例如OnHtml等
  • 整个过程就是顺序流,也就是该框架封装了一些流水线,并暴露回调函数给开发者来重定义

异步实例

  • spider-colly-test/t2
package t2import ("fmt""github.com/gocolly/colly""github.com/gocolly/colly/extensions""github.com/gocolly/colly/proxy""log""net/http"
)// Spider 定义结构体
type Spider struct {Collector *colly.Collector
}// Init 初始化配置
func (s Spider) Init() {s.Collector.Async = trues.Collector.Limit(&colly.LimitRule{Parallelism: 1, // 整个参数为并行度参数,但是并未理解其用法含义,不知道是会阻塞哪里})extensions.RandomUserAgent(s.Collector) // 设置随机UserAgent,以达到真实模拟浏览器extensions.Referer(s.Collector)//s.SetProxy()     // 加载代理s.SetTransport() // 配置Transports.OnResponse()   // 加载自定义响应回调函数s.OnError()      // 加载自定义错误回调函数
}// SetTransport Colly使用HTTP保持活动来提高抓取速度。它需要打开文件描述符,因此长时间运行的作业很容易达到max-fd限制
func (s Spider) SetTransport() {s.Collector.WithTransport(&http.Transport{DisableKeepAlives: true,})
}// SetProxy 设置代理,请重定义即可
func (s Spider) SetProxy() {if _proxy, err := proxy.RoundRobinProxySwitcher("socks5://127.0.0.1:1337","socks5://127.0.0.1:1338","http://127.0.0.1:8080",); err == nil {s.Collector.SetProxyFunc(_proxy)} else {fmt.Println(err)}}// Visit 封装Collector.Visit,并输出日志
func (s Spider) Visit(url string) {//time.Sleep(time.Duration(1 * time.Second))log.Println("准备访问地址:", url)s.Collector.Visit(url)
}// OnResponse 封装Collector.OnResponse,并输出日志,主要是自定义一些操作
func (s Spider) OnResponse() {s.Collector.OnResponse(func(response *colly.Response) {//time.Sleep(2 * time.Second)log.Println("获得响应", response.StatusCode, response.Request.URL)})
}// OnError 封装Collector.OnError,并输出日志,主要是自定义一些操作
func (s Spider) OnError() {s.Collector.OnError(func(response *colly.Response, err error) {log.Println("错误响应",response.StatusCode,response.Request.URL,response.Request.Headers,response.Headers,err,)})
}// Wait 封装Collector.Wait,阻塞等待所有请求以及处理跑完
func (s Spider) Wait() {s.Collector.Wait()
}func Test() {// 实例化crawler := Spider{Collector: colly.NewCollector(),}// 初始化配置crawler.Init()for i := 0; i < 10; i++ {// 开始异步爬取crawler.Visit(fmt.Sprintf("http://www.baidu.com/s?wd=%d", i))}// 等待所有的爬取结束crawler.Wait()fmt.Println("完成")
}
  • main.go
package mainimport ("fmt""spider-colly-test/t2""time"
)func main() {start := time.Now()t2.Test() // 调取测试爬虫end := time.Now()fmt.Println(end.Sub(start)) // 看看总共耗时}

golang快速入门--爬虫--基于colly框架的爬虫案例相关推荐

  1. 【Golang 快速入门】高级语法:反射 + 并发

    Golang 快速入门 Golang 进阶 反射 变量内置 Pair 结构 reflect 结构体标签 并发知识 基础知识 早期调度器的处理 GMP 模型 调度器的设计策略 并发编程 goroutin ...

  2. 【Golang 快速入门】项目实战:即时通信系统

    Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...

  3. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  4. scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...

  5. golang快速入门[8.3]-深入理解IEEE754浮点数

    前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...

  6. 19. python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...

  7. 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

    python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...

  8. java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】

    第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...

  9. 爬虫开发入门:使用 Pyspider 框架开发爬虫

    使用 pyspider 作为爬虫入门框架要比直接用 Scrapy 容易太多,如果你需要快速爬取一个网站,pyspider 爬虫框架是最佳选择之一 pyspider 框架具有以下优点 有 Web 界面用 ...

最新文章

  1. “程序员数学不行,干啥都不行!”高级开发:90%都是瞎努力!
  2. mysql 数据库异常大_Mysql连接数据库异常汇总【必收藏】
  3. php 字符串替换 正则表达式,PHP中一些可以替代正则表达式函数的字符串操作函数...
  4. C#获取文件的MD5码
  5. 8-5 Navicat工具与pymysql模块
  6. java的网络工具netty简介
  7. 华为云RTC服务架构及应用实践
  8. BZOJ3173 [TJOI2013]最长上升子序列
  9. mysql同步到另一台服务器_mysql两台服务器主从同步
  10. css改变指针形状,css 指针样式
  11. DB2单表排序查询报错分析及解决办法
  12. probie 菜鸟翻译工具开源了
  13. 如何去除360浏览器“网页走丢了”页面广告
  14. wait方法为什么要放在循环里
  15. Full RangeLimited Range
  16. python使用金山词霸的翻译功能
  17. 删除Windows中设备与驱动器下的多余图标
  18. Day03 开始学Response
  19. Maxima绘图基础
  20. 【2021年蓝桥省赛真题】赛前最后冲刺,省一我来啦

热门文章

  1. 计量广义差分操作过程_计量经济学总结
  2. 腾讯云tcp架构考试涉及到哪些知识点?腾讯云是什么?
  3. Quaternion kinematics for the error-state Kalman filter论文阅读
  4. 业务逻辑:完成客户下单后前台系统的数据处理并调用后台系统服务处理业务 webservice接口调用 有用...
  5. winds主机部署zabbix_agent
  6. POV-RAY基础教程 - 相机(6)
  7. 如何进行产品设计,更能激发用户行为
  8. 【Java】动态模拟时钟
  9. calender加3天_JAVA日期或者时间加减法,加上几天或者减去
  10. 四种期权损益结构图,助您轻松理解期权损益