Golang net/http 爬虫[1] 上周从零学习go语言写动态爬虫了golanggo语言写动态爬虫,语法简单关键字少 , 写个爬虫熟悉一下语法结构 。
首先选用了原生go语言写动态爬虫的net/http包,基本上涵盖了所有的get/post请求,各种参数都可以设置,网上google到html页面解析goquery神器 , 很轻松就可以解决页面解析问题 。
首先就写了个爬取汇率的爬虫 。然后重写之前php的一个请求类,请求类的逻辑有点混乱不清晰,往往把两个不同的功能合并到一起写 , 粒度大,后来发现了一个好用的框架——colly,之后再试试好不好用
Windows 10 Golang
依赖包go语言写动态爬虫:goquery
较常用的方法有Find和Each
爬取中国银行的汇率牌价表,golang依赖net/http包和goquery包
唯一的难点是对于goquery方法的使用,需要阅读官方文档:
使用原生的net/http包基本上可以解决大多数的网页请求 , 使用goquery可以解决页面解析问题
可以利用golang的协程特性进行异步多协程爬取
增加安全性可以通过几个方面进行改进:
【go语言写动态爬虫 go语言动态库】 1.首先可以限制爬虫的爬取速度
2.每次对网页的请求都随机选用一个客户端
3.选用IP代理池,防止IP误封(及限制ip访问次数)
构造请求代理ip网站的链接→获取网页内容→ 提取网页中IP地址和端口号→验证IP的有效性并存储
轻量级反爬虫方案
浅谈JSP
golang带json的Http请求
Get/Post
HTTP请求中的Form Data和Request Payload的区别
HTTP Json请求
net/http:
golang HTTP操作
python建立爬虫代理ip池
爬虫黑科技之让你的爬虫程序更像人类用户的行为
特点:事件监听,通过callback执行事件处理
基于colly开发的web管理界面
Go 语言极速入门13 - 实战项目之并发版爬虫爬取器 fetcher 和解析器 parser 与之前相同go语言写动态爬虫,模型类也不变 。
注意:
见本小节文末分析 。
Q1. 为什么在 scheduler 中每一个将 Request 添加到 chan 的任务都开启一个 Goroutine 来执行go语言写动态爬虫?
A:在Go 语言学习9 - Channel一节描述过,对于无缓冲的 channel , 如果两个 goroutine 没有同时准备好,通道会导致先执行发送或接收操作的 goroutine 阻塞等待 ,假设使用s.workerChan - request而不是go func() { s.workerChan - request }() ,假设开启了 10 个 Worker Goroutine,这 10 个 goroutine 阻塞在r := -in阻塞等待获取 Request 上,假设 seeds 大于 10,例如 11,那么当 Engine 的这个循环执行到底 11 个的时候,将陷入等待
,因为所有的10个 Worker goroutine 此时都可能也处于等待中,即 in chan 没有接收方准备好接收数据,所以 engine 作为发送方也要阻塞等待go语言写动态爬虫;那么为什么10个 Worker goroutine 都会处于等待中呢?
因为10个 Worker Goroutine 都处理完了请求,并阻塞在out - result ,由于 Engine 阻塞在 “将第11个 Request 发送到 in” 上,所以其无法进行后续的死循环去开启result := -out,到此为止,相互等待死锁形成?。。ngine 等待 Worker 准备好r := -in,而10个 Worker 等待 Engine 的result := -out。
当使用go func() { s.workerChan - request }()之后 , Engine Goroutine 将不再阻塞 , 死锁等待被打破?。。?
Q2. scheduler 方法为何使用指针接收者而不是值接收者?
A:在Go 语言学习5 - 面向接口中go语言写动态爬虫我们详细的介绍了什么时候使用指针接收者,什么时候使用值接收者 , 其中最重要的两条就是 “ 1. 如果要改变接收者内部的属性值,必须使用指针接收者,因为值接收者是对接收者副本的操作;2. 如果 struct 内一个方法是指针接收者,那么其全部方法都是用指针接收者 ”,在 scheduler 中,我们要将外界的 in chan 赋值给 scheduler 的 workChann,所以需要改变 workChann 的值,需要使用指针接收者 。
推荐阅读
- 公众号作者与粉丝,公众号作者与粉丝的区别
- 如何苹果登录安卓微信聊天,如何苹果登录安卓微信聊天记录
- asp.net睡眠,aspnet timer
- linux命令截取日志 linux 截取
- redis事务和lua脚本区别,redis事务处理
- oracle存储过程导出,oracle存储过程导出sql
- 微信直播需要什么东西,开通微信直播要钱吗
- 初中学历学go语言 初中学历学go语言好吗
- 手机什么电视最好用,手机手电视哪个软件好