go语言的http操作的简单介绍

Golang net/http 爬虫[1] 上周从零学习了golang,语法简单关键字少 , 写个爬虫熟悉一下语法结构 。
首先选用了原生的net/http包,基本上涵盖了所有的get/post请求,各种参数都可以设置 , 网上google到html页面解析goquery神器 , 很轻松就可以解决页面解析问题 。
首先就写了个爬取汇率的爬虫 。然后重写之前php的一个请求类 , 请求类的逻辑有点混乱不清晰,往往把两个不同的功能合并到一起写,粒度大,后来发现了一个好用的框架——colly,之后再试试好不好用
Windows 10 Golang
依赖包:goquery
较常用的方法有Find和Each
爬取中国银行的汇率牌价表,golang依赖net/http包和goquery包
唯一的难点是对于goquery方法的使用,需要阅读官方文档:
使用原生的net/http包基本上可以解决大多数的网页请求,使用goquery可以解决页面解析问题
可以利用golang的协程特性进行异步多协程爬取
增加安全性可以通过几个方面进行改进:
1.首先可以限制爬虫的爬取速度
【go语言的http操作的简单介绍】 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管理界面
[golang] fasthttp 使用http代理golang net/http标准库go语言的http操作的client是可以配置各种代理的,http/https/sock5等,不过fasthttp仅支持配置sock5代理,通过定义fasthttp dialfunc实现:
项目中碰到的问题是,ops只提供go语言的http操作了用squid搭建的http代理 , 所以是想重新定义一个http代理的dialfunc , 找了fasthttp github仓库的issue , 作者提供了一个dialFunc
经测试,访问https的站点是OK的,访问http的站点不行,代理连接不上 。先说一下http/https代理的区别,再说原因 。
使用代理访问https网站时,会先发CONNECT请求,让代理与目标站点建立一个http tunnel , 之后在这个tunnel基础上进行传输,对应到上面的dialFunc过程就是:
可以看到http站点是不需要发CONNECT请求的,而是直接将目标站点的url作为path 填写在http请求头中 。
为何上面的dialfunc访问http站点不行呢,查了squid代理的文档,发现squid默认会禁止非https站点通过CONNECT方法建立通道,自己搭了个squid代理去掉配置项,发现上面的dialfunc是可以访问http、https站点的,就是说http,https都先建立通过,再请求 。
看了fasthttp的源码 , 没办法在请求前修改request header中的path为目标站点url , 所以如果需要通过fasthttp使用http代理,那么可以使用上面的dialfunc,同时代理需要允许非443端口的站点可以建立通道 。如果做不到这一点 , 那么还是建议使用标准库net/http的client , 会更方便一点 。
golang net/http包 http请求的字节码读取与解析 。先配置Header最长读取时间、req最长读取时间、req最大读取长度默认6M 。
RFC7230禁止\r\n参数,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符 。但go net/http包放宽go语言的http操作了这个要求 。

推荐阅读