go语言批量检测代理ip是否可用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32502511/article/details/90044202

在做爬虫的时候,经常会用到代理ip,然而代理ip也会经常会去检测是否有效,所以假设我在redis中有如下几个ip:

下面需要做的是使用go去读取出来,然后依次去请求如下地址:

http://icanhazip.com

如果有成功返回ip则表示此代理ip有效,相关的参考代码如下:

package main
import (
   "encoding/json"
   "fmt"
   "github.com/garyburd/redigo/redis"
   "io/ioutil"
   "log"
   "net/http"
   "net/url"
   "runtime"
   "time"
)

/*
验证代理ip是否可用
通过传入一个代理ip,然后使用它去访问一个url看看是否访问成功,以此为依据进行判断当前代理ip是否有效。
参数:proxy_addr 要验证的ip
返回:ip 验证通过的ip、status 状态(200表示成功)
*/
func ProxyThorn(proxy_addr string) (ip string,status int) {
   //访问查看ip的一个网址
   httpUrl := "http://icanhazip.com"
   proxy, err := url.Parse(proxy_addr)

   netTransport := &http.Transport{
      Proxy:http.ProxyURL(proxy),
      MaxIdleConnsPerHost: 10,
      ResponseHeaderTimeout: time.Second * time.Duration(5),
   }
   httpClient := &http.Client{
      Timeout: time.Second * 10,
      Transport: netTransport,
   }
   res, err := httpClient.Get(httpUrl)
   if err != nil {
      //fmt.Println("错误信息:",err)
      return
   }
   defer res.Body.Close()
   if res.StatusCode != http.StatusOK {
      log.Println(err)
      return
   }
   c, _ := ioutil.ReadAll(res.Body)
   return string(c),res.StatusCode
}
/*
批量从redis中读取代理ip
*/
func get_to_redis_ips(redis_host string,set_name string) (list [] map[string]string)  {
   //连接redis
   conn,err := redis.Dial("tcp",redis_host)
   if err != nil {
      fmt.Println("connect redis error :",err)
      return
   }
   defer conn.Close()

   //获取test_set集合中的所有数据,并循环遍历打印
   list_set, err := redis.Values(conn.Do("SMEMBERS", set_name))
   if err != nil {
      fmt.Println("获取test_set集合中的值失败:", err)
   }
   //定义返回的列表数据类型
   var ly_list [] map[string]string
   for _, v := range list_set {
      if str, ok := v.([]uint8); ok {
         //json str 转map
         var ip_data=make(map[string]string)
         if err := json.Unmarshal([]byte(string(str)), &ip_data); err == nil {
            //依次将转换好的数据最加到列表中
            ly_list=append(ly_list,ip_data)
         }
      }
   }
   return ly_list
}
/*
ip验证
*/
func verification(ip_info map[string]string) {
   var ip,status = ProxyThorn(ip_info["ip"])
   //判断是否有返回ip,并且请求状态为200
   if status==200 && ip!=""{
      fmt.Println(ip_info["ip"]+" 请求 http://icanhazip.com 返回ip:【"+ip+"】-【检测结果:可用】")
   }else {
      fmt.Println(ip_info["ip"]+" 请求 http://icanhazip.com 返回ip:【"+ip+"】-【检测结果:不可用】")
   }

}

func main() {

   runtime.GOMAXPROCS(runtime.NumCPU())
   for i,ip_info:= range get_to_redis_ips("192.168.11.11:6379","test_set2") {
      i=i
      go verification(ip_info)
   }

   for runtime.NumGoroutine() > 4 {

   }

}

运行效果图:

猜你喜欢

转载自blog.csdn.net/qq_32502511/article/details/90044202