基于golang爬蟲框架gathertool快速撰寫并發抓取國內ip資訊
gathertool
- 框架地址: https://github.com/mangenotwork/gathertool
- 框架下載: go get github.com/mangenotwork/gathertool
- 介紹: 輕量級爬蟲,介面測驗,壓力測驗框架, 提高開發對應場景的golang程式,
- 框架檔案: https://github.com/mangenotwork/gathertool/blob/main/README.md
直接上code
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,
Context: 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.Context, 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://www.uj5u.com/qukuanlian/280539.html
標籤:區塊鏈
