版权声明:本文为博主原创文章,未经博主允许不得转载。 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 {
}
}
运行效果图: