万维网网络机器人,又称蜘蛛,爬虫,原理主要是通过构造符合HTTP协议的网络数据包,向指定主机请求资源,获取返回的数据.万维网有大量的公开信息,人力采集数据费时费力,故激发了爬虫的产业化.批量获取公开网络数据并不违反,但由于无差别性,无节制,十分暴力的手段会导致对方服务的不稳定,因此,大部分资源提供商对数据包进行了某些过滤,在此背景下,小批量数据获取成为了难题.综合各种需求,如各种API对接,自动化测试等原理均一样,故开发了此爬虫库.
土拨鼠爬虫库是一个人类友好姿势的代码库,开发采用面向对象的方式,易于理解.通过对Golang原生HTTP库的封装,帮用户处理了一些琐碎逻辑(如收集信息,检测参数),并加入了一些容错机制(如加锁,及时关闭流),保证了爬虫高并发的安全.此库提供了大量优美的API接口,复用率高,十分方便地支持Cookie接力,爬虫代理设置,以及一般的HTTP请求设置如头部设置,超时,暂停设置,数据设置等,支持全部的HTTP方法如POST/PUT/GET/DELETE等,内置爬虫池和浏览器UA池,易于开发多UA多Cookie分布式爬虫.此外,还提供第三方存储库,支持mysql/postgresql/redis/cassandra/hbase等.该库简单实用,短短几行代码即可取代以往杂乱无章的面包条代码片段,已经应用在某些大项目中:如大型亚马逊分布式爬虫(美国/日本/德国/英国),经受住两千代理IP超长时间高并发的考验,单台机器每天获取上百万数据.
该库主要用途:微信开发/API对接/自动化测试/抢票脚本/网站监控/点赞插件/数据爬取
如何使用:
1.获取库.
goget-vgithub.com/hunterhug/marmot/miner2.简单使用.
packagemain//示例import("fmt""github.com/hunterhug/marmot/miner")funcmain(){//1.新建一个矿工worker,_:=miner.New(nil)//2.设置网址worker.SetUrl("https://www.cjhug.me").SetUa(worker.RandomUa()).SetMethod(worker.GET)//3.抓取网址html,err:=worker.Go()iferr!=nil{fmt.Println(err.Error())}//4.打印内容,等同于fmt.Println(worker.ToString())fmt.Println(string(html))}
3.具体使用如下.
使用特别简单,先`New`一个`Worker`,即土拨鼠矿工,然后`SetUrl`,适当加头部,最后`worker.Go()`即可。###第一步矿工有三种类型:1.`worker,err:=miner.NewWorker("https://smart:smart2016@104.128.121.46:808")`//代理IP矿工默认自动化Cookie接力格式:`协议://代理帐号(可选):代理密码(可选)@ip:port`,支持http(s),socks5,别名函数`New()`2.`worker,err:=miner.NewWorker(nil)`//正常矿工默认自动化Cookie接力别名函数`New()`3.`worker,err:=miner.NewAPI()`//API矿工默认Cookie不接力###第二步模拟矿工设置头部:1.`worker.SetUrl("https://www.cjhug.me")`//设置Http请求要抓取的网址,必须2.`worker.SetMethod(miner.GET)`//设置Http请求的方法:`POST/GET/PUT/POSTJSON`等3.`worker.SetWaitTime(2)`//设置Http请求超时时间4.`worker.SetUa(miner.RandomUa())`//设置Http请求浏览器标志,本项目提供445个浏览器标志,可选设置5.`worker.SetRefer("https://www.baidu.com")`//设置Http请求Refer头6.`worker.SetHeaderParm("diyheader","lenggirl")`//设置Http请求自定义头部7.`worker.SetBData([]byte("filedata"))`//Http请求需要上传数据8.`worker.SetFormParm("username","jinhan")`//Http请求需要提交表单9.`worker.SetCookie("xx=dddd")`//Http请求设置cookie,某些网站需要登录后F12复制cookie###第三步矿工启动方式有:1.`body,err:=worker.Go()`//如果设置SetMethod(),采用下方对应的方法,否则Get()2.`body,err:=worker.Get()`//默认3.`body,err:=worker.Post()`//POST表单请求,数据在SetFormParm()4.`body,err:=worker.PostJSON()`//提交JSON请求,数据在SetBData()5.`body,err:=worker.PostXML()`//提交XML请求,数据在SetBData()6.`body,err:=worker.PostFILE()`//提交文件上传请求,数据在SetBData()7.`body,err:=worker.Delete()`8.`body,err:=worker.Put()`9.`body,err:=worker.PutJSON()`10.`body,err:=worker.PutXML()`11.`body,err:=worker.PutFILE()`12.`body,err:=worker.OtherGo("OPTIONS","application/x-www-form-urlencoded")`//其他自定义的HTTP方法###第四步爬取到的数据:1.`fmt.Println(string(html))`//每次抓取后会返回二进制数据2.`fmt.Println(worker.ToString())`//http响应后二进制数据也会保存在矿工对象的Raw字段中,使用ToString可取出来3.`fmt.Println(worker.JsonToString())`//如果获取到的是JSON数据,请采用此方法转义回来,不然会乱码注意:每次抓取网站后,下次请求你可以覆盖原先的头部,但是没覆盖的头部还是上次的,所以清除头部或请求数据,请使用`Clear()`(只清除Post数据)或者`ClearAll()`(还清除http头部)更多细节请到代码仓库...
评论