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

mange · 2021-04-28 21:25:06 · 1867 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-04-28 21:25:06 的文章,其中的信息可能已经有所发展或是发生改变。

@TOC

gathertool

直接上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(&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: 5time.Second, } time.Sleep(1*time.Second) }

// 获取详情信息失败执行 func GetIPFailed(c *gt.Context){ queue.Add(c.Task)//请求失败归还到队列 } ```

在这里插入图片描述

在这里插入图片描述


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1867 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传