继上次爬boss直聘数据IP被封,虽然后面发现boss直聘 只要稍微没个请求停一秒钟就可以一直爬下去,但是任然心有不甘。欺负我ip少???
于是这两天抽空写了个IP池加上可以自动切换IP 千千万万个IP 让你封···········哈哈

我这边用的是西刺的代理 还是比较稳的········拿着西刺的免费IP 爬着西刺的免费IP [:P]

实现效果如下

········································································································································

感兴趣的同学可以玩玩:不过需要redis可以先安装一个

package mainimport ("github.com/PuerkitoBio/goquery""log""fmt""github.com/garyburd/redigo/redis""net/url""net/http""encoding/json""os""strconv""math/rand""time""strings")const(PAGE int = 40
)
var (xici string = "http://www.xicidaili.com/wn/"
)func main() {//getIp("local")getIp("http://171.104.132.87:9999")
}func getIp(ip string){var count intfor i := 1; i <= PAGE; i++ {response := getRep(xici + strconv.Itoa(i),ip)if (response.StatusCode == 200) {dom, err := goquery.NewDocumentFromResponse(response)if err != nil {log.Fatalf("失败原因", response.StatusCode)}dom.Find("#ip_list tbody tr").Each(func(i int, context *goquery.Selection) {ipInfo := make(map[string][]string)//地址ip := context.Find("td").Eq(1).Text()//端口port := context.Find("td").Eq(2).Text()//地址address := context.Find("td").Eq(3).Find("a").Text()//匿名anonymous := context.Find("td").Eq(4).Text()//协议protocol := context.Find("td").Eq(5).Text()//存活时间survivalTime := context.Find("td").Eq(8).Text()//验证时间checkTime := context.Find("td").Eq(9).Text()ipInfo[ip] = append(ipInfo[ip], ip, port, address, anonymous, protocol, survivalTime, checkTime)fmt.Println(ipInfo)hBody, _ := json.Marshal(ipInfo[ip])//存入redissaveRedis(ip+":"+port,string(hBody))fmt.Println(ipInfo)count++})}}}/**
* 返回response
*/
func getRep(urls string,ip string) *http.Response {request, _ := http.NewRequest("GET", urls, nil)//随机返回User-Agent 信息request.Header.Set("User-Agent", getAgent())request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")request.Header.Set("Connection", "keep-alive")proxy, err := url.Parse(ip)//设置超时时间timeout := time.Duration(20* time.Second)fmt.Printf("使用代理:%s\n",proxy)client := &http.Client{}if ip != "local"{client = &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxy),},Timeout: timeout,}}response, err := client.Do(request)if err != nil || response.StatusCode != 200{fmt.Printf("line-99:遇到了错误-并切换ip %s\n",err)getIp(returnIp())}return response
}/**
* 随机返回一个User-Agent
*/
func getAgent() string {agent  := [...]string{"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11","Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)","Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)","User-Agent,Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","User-Agent, Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)","User-Agent,Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",}r := rand.New(rand.NewSource(time.Now().UnixNano()))len := len(agent)return agent[r.Intn(len)]
}func saveRedis(ip string,hBody string){c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()//键值对的方式存入hash_, err = c.Do("HSET", "ippool", ip, string(hBody))//将ip:port 存入set  方便返回随机的ip_,err  = c.Do("SADD","ippoolkey",ip)if err != nil {log.Fatalf("err:%s", err)os.Exit(1)}
}
/**
* 随机返回一个IP
*/
func returnIp() string{c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)os.Exit(0)}defer c.Close()key,err:=redis.String(c.Do("SRANDMEMBER", "ippoolkey"))res,err:=redis.String(c.Do("HGET", "ippool",key))res=strings.TrimLeft(res, "[")res=strings.TrimRight(res, "]")array := strings.Split(res,",")for i:=0;i<len(array);i++{array[i] = strings.Trim(array[i],"\"")}host:= strings.ToLower(array[4])+"://"+array[0]+":"+array[1]return host}

Golang实战【IP池-自动切换IP爬虫】相关推荐

  1. Windows系统自动切换IP批处理

    对于同时使用内外网的用户来说,经常需要手动切换内外网的IP.现提供一个自动切换IP的批处理. windows7如下: netsh interface ip set address name=" ...

  2. 网站多次切换服务器ip,站群多ip服务器怎么切换ip?

    租多ip服务器的主要目的是,有时候用服务器采集别处的内容被封了IP,我们就经常碰到.这时候我们就要换服务器主IP才可以继续采集,下面跟大家讲下多ip服务器怎么切换ip的方法,这个方法只对多IP的服务器 ...

  3. bat 切换网络适配器_Windows批处理自动切换IP地址设置无线网络和以太网的IP地址...

    经常带着笔记本电脑来回公司与家里上网,会碰到要切换本地IP的情况,由于上班公司工作需要设置固定IP才能上网,而在家都是自动获取IP地址的,下面这个bat批处理文件,可以很方便切换IP地址. @echo ...

  4. 技术改变生活--切换固定IP和自动分配IP地址的脚本

    公司给分配的电脑,总是自动重启,无奈自己天天背着本去上班!!更无奈的是,公司的网是固定IP,寝室的网是自动获取IP的(DHCP),每天到公司或者中午.晚上回寝室都得切换IP,很是麻烦,再装一个或者写一 ...

  5. 多IP服务器自动切换内网IP易语言源码

    介绍: 自动切换电脑内网IP, 记得以前开发这个主要是适应国外多IP服务器切换,对一般用户 用处不大. 所以把源码代码发出来 可以根据自己需求修改了或者学习一下. 网盘下载地址: http://kek ...

  6. 用netsh自动切换IP

    1. 设置中输入固定的IP和DNS,然后运行CMD命令输入以下命令:netsh -c interface dump >c:\staticip.txt 2. 用同样的方法将网卡TCP/IP属性设置 ...

  7. 获得代理ippython_Python搭建代理IP池实现获取IP的方法

    使用爬虫时,大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉.对于访问速度的处理比较简单,只要间隔一段时间爬取一次就行了,避免频繁访问 ...

  8. 协程大批量爬取是要被封IP的,最优秀的方法就是在被封IP时候立马切换IP

    一. 多协程爬虫遇到的难点 之前本着一封IP就切换IP的原则做了个协程爬虫.但是操作并发运行的爬虫和单线程的爬虫的难度真的是云泥之别.因为是并发运行的爬虫,用的IP是同一个,被封的时候当然是全部IP一 ...

  9. python建立ip代理池_Python搭建代理IP池实现存储IP的方法

    上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行.存储的方式有很多,直接一点的可以放在一个文本文件中,但操作起来不太灵活,而我选择的是 My ...

  10. html自动获取ip地址,自动获取ip地址怎么设置无线路由器?

    自动获取ip地址怎么设置无线路由器?如果用户的宽带类型是:自动获取IP地址上网的,那么在设置无线路由器的时候,正常情况下,只需要在"WAN口连接类型"或者"上网方式&qu ...

最新文章

  1. 如何调用形参数组_函数的参数
  2. 改进的二值图像像素标记算法及程序实现(含代码)
  3. 2.3.8 吸烟者问题
  4. linux 64位 寻址空间_Ubuntu 20.04(64位)如何配置gcc-3.4用于编译linux-0.11
  5. 西方餐厅的顶级食材,被中国人干到了“白菜价”
  6. 组态软件开发(zz)
  7. HTTP请求和数据安全
  8. python qt gui快速编程_《PYTHON QT GUI快速编程 PYQT编程指南》源码
  9. Mysql创建存储过程,使用游标Cursor循环更新
  10. 【prescan入门】prescan入门教程(场景搭建、参数设置、连接MATLAB实现仿真)
  11. 爬虫之requests模块
  12. Win7 您需要Trustedinstaller 提供的权限才能对此文件夹进行更改
  13. ZeroTier-全网畅连
  14. 几个Gerrit代码检查checkstyle问题总结
  15. 什么是同构与异构?及在不同背景下的理解
  16. 常用的Python开发工具有哪些?
  17. video标签的属性和事件用法大全
  18. 透明木头问世!“木头大王”胡良兵再发顶刊,已成立公司加速落地
  19. (二)从生物神经元来学习人工神经元基本模型的工作原理
  20. 长安渝北工厂机器人_面包车界的悲情品牌-「长安凯程欧尚」为何不敌通用五菱宝骏?...

热门文章

  1. Linux软件源镜像修改
  2. rda分析怎么做_RDA分析
  3. C++:无法打开包括文件:“xxxx.h“
  4. RetinaFace+ArcFace人脸识别测试
  5. 【matlab笔记】寻找极小值
  6. 没了美国EDA软件,我们就不能做芯片?
  7. stm32神舟I号开发板下的六子棋开发
  8. VS2015编译eXosip2-4.1.0 osip2-4.1.0
  9. CSDN开博三周年--回首向来萧瑟处,铁马冰河入梦来
  10. 晶体管电路设计下 【日】铃木雅臣