golang快速入门--爬虫--基于colly框架的爬虫案例
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框架的爬虫案例相关推荐
- 【Golang 快速入门】高级语法:反射 + 并发
Golang 快速入门 Golang 进阶 反射 变量内置 Pair 结构 reflect 结构体标签 并发知识 基础知识 早期调度器的处理 GMP 模型 调度器的设计策略 并发编程 goroutin ...
- 【Golang 快速入门】项目实战:即时通信系统
Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容
python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...
- golang快速入门[8.3]-深入理解IEEE754浮点数
前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...
- 19. python爬虫——基于scrapy框架爬取网易新闻内容
python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...
- 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容
python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...
- java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】
第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...
- 爬虫开发入门:使用 Pyspider 框架开发爬虫
使用 pyspider 作为爬虫入门框架要比直接用 Scrapy 容易太多,如果你需要快速爬取一个网站,pyspider 爬虫框架是最佳选择之一 pyspider 框架具有以下优点 有 Web 界面用 ...
最新文章
- “程序员数学不行,干啥都不行!”高级开发:90%都是瞎努力!
- mysql 数据库异常大_Mysql连接数据库异常汇总【必收藏】
- php 字符串替换 正则表达式,PHP中一些可以替代正则表达式函数的字符串操作函数...
- C#获取文件的MD5码
- 8-5 Navicat工具与pymysql模块
- java的网络工具netty简介
- 华为云RTC服务架构及应用实践
- BZOJ3173 [TJOI2013]最长上升子序列
- mysql同步到另一台服务器_mysql两台服务器主从同步
- css改变指针形状,css 指针样式
- DB2单表排序查询报错分析及解决办法
- probie 菜鸟翻译工具开源了
- 如何去除360浏览器“网页走丢了”页面广告
- wait方法为什么要放在循环里
- Full RangeLimited Range
- python使用金山词霸的翻译功能
- 删除Windows中设备与驱动器下的多余图标
- Day03 开始学Response
- Maxima绘图基础
- 【2021年蓝桥省赛真题】赛前最后冲刺,省一我来啦
热门文章
- 计量广义差分操作过程_计量经济学总结
- 腾讯云tcp架构考试涉及到哪些知识点?腾讯云是什么?
- Quaternion kinematics for the error-state Kalman filter论文阅读
- 业务逻辑:完成客户下单后前台系统的数据处理并调用后台系统服务处理业务 webservice接口调用 有用...
- winds主机部署zabbix_agent
- POV-RAY基础教程 - 相机(6)
- 如何进行产品设计,更能激发用户行为
- 【Java】动态模拟时钟
- calender加3天_JAVA日期或者时间加减法,加上几天或者减去
- 四种期权损益结构图,助您轻松理解期权损益