@[TOC](基于golang爬虫框架gathertool快速编写并发抓取国内ip信息)
> gathertool
- 框架地址: https://github.com/mangenotwork/gathertool
- 框架下载: go get github.com/mangenotwork/gathertool
- 介绍: 轻量级爬虫,接口测试,压力测试框架, 提高开发对应场景的golang程序。
- 框架文档: https://380949.baklib-free.com/
> 直接上code
```golang
package main
import (
"log"
"net/http"
"time"
"github.com/PuerkitoBio/goquery"
gt "github.com/mangenotwork/gathertool"
)
var queue = gt.NewQueue() //全局声明抓取任务队列
func main(){
// 1.在页面 http://ip.bczs.net/country/CN 获取所以ip
c, err := gt.Get("http://ip.bczs.net/country/CN",gt.SucceedFunc(IPListSucceed))
if err != nil{
log.Println(err)
return
}
c.Do() //执行请求
// 2. 并发抓取详情数据
gt.StartJobGet(100,queue,
gt.SucceedFunc(GetIPSucceed),//请求成功后执行的方法
gt.RetryFunc(GetIPRetry),//遇到 502,403 等状态码重试前执行的方法,一般为添加休眠时间或更换代理
gt.FailedFunc(GetIPFailed),//请求失败后执行的方法
)
}
// 请求成功执行
func IPListSucceed(cxt *gt.Context){
html := string(cxt.RespBody)
dom,err := gt.NewGoquery(html)
if err != nil{
log.Println(err)
return
}
result := dom.Find("div[id=result] tbody")
result.Find("tr").Each(func(i int, tr *goquery.Selection){
td := tr.Find("td")
startIp := td.Eq(0).Text()// IP起始
endIP := td.Eq(1).Text()// 结束ip
number := td.Eq(2).Text()// ip数量
// 创建队列 抓取详情信息
queue.Add(>.Task{
Url: "http://ip.bczs.net/"+startIp,
Data: map[string]interface{}{
"start_ip":startIp,
"end_ip":endIP,
"number":number,
},
})
})
}
// 获取详情信息成功的处理
func GetIPSucceed(c *gt.Context){
html := string(c.RespBody)
dom,err := gt.NewGoquery(html)
if err != nil{
log.Println(err)
return
}
result,err := dom.Find("div[id=result] .well").Html()
if err != nil{
log.Println(err)
}
log.Println(c.Task.Data, result)
}
// 获取详情信息重试的处理
func GetIPRetry(c *gt.Context){
//更换代理
c.Client = &http.Client{
//Transport: &http.Transport{
// Proxy: http.ProxyURL(uri),
//},
Timeout: 5*time.Second,
}
time.Sleep(1*time.Second)
}
// 获取详情信息失败执行
func GetIPFailed(c *gt.Context){
queue.Add(c.Task)//请求失败归还到队列
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426200445987.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hbl9nZQ==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426200457302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hbl9nZQ==,size_16,color_FFFFFF,t_70#pic_center)
有疑问加站长微信联系(非本文作者))