@TOC
gathertool
- 框架地址: https://github.com/mangenotwork/gathertool
- 框架下載: go get github.com/mangenotwork/gathertool
- 介紹: 輕量級爬蟲,接口測試宝当,壓力測試框架, 提高開發(fā)對應(yīng)場景的golang程序蓝纲。
- 框架文檔: https://380949.baklib-free.com/
直接上code
package main
import (
"log"
"net/http"
"time"
"github.com/PuerkitoBio/goquery"
gt "github.com/mangenotwork/gathertool"
)
var queue = gt.NewQueue() //全局聲明抓取任務(wù)隊列
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() //執(zhí)行請求
// 2. 并發(fā)抓取詳情數(shù)據(jù)
gt.StartJobGet(100,queue,
gt.SucceedFunc(GetIPSucceed),//請求成功后執(zhí)行的方法
gt.RetryFunc(GetIPRetry),//遇到 502,403 等狀態(tài)碼重試前執(zhí)行的方法凛忿,一般為添加休眠時間或更換代理
gt.FailedFunc(GetIPFailed),//請求失敗后執(zhí)行的方法
)
}
// 請求成功執(zhí)行
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()// 結(jié)束ip
number := td.Eq(2).Text()// ip數(shù)量
// 創(chuàng)建隊列 抓取詳情信息
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)
}
// 獲取詳情信息失敗執(zhí)行
func GetIPFailed(c *gt.Context){
queue.Add(c.Task)//請求失敗歸還到隊列
}