基于golang爬虫框架gathertool快速编写并发抓取国内ip信息

@TOC

gathertool

直接上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(&gt.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)//请求失败归还到队列
}
在这里插入图片描述
在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容