开始前的准备

注:在开始完成这个项目之前,需要懂一些简单的爬虫知识和tkinter的界面相关知识,不过这些相关的内容,博主也会通过链接的方式,在其他文章内对其进行详细描述,手把手教你完成一个IP代理池。

第一步:IP代理池的功能实现

框架

一个IP代理池主要需要IP的获取以及IP的检测两大功能,以及一个方便的取用方式
获取:主要通过爬虫来获取大量的免费IP代理
检测:可以通过ping的方式,来对IP的可用性进行检测
取用:可以通过构建一个异步的web服务,以此能够用API的方式,极为方便的取用IP
因此我们可以先获得一个大概的代码框架:

class IP代理池(object):'''IP代理池用于获取代理IP以及维护代理IP池'''def __init__(self):passdef 代理爬取(self,num):passdef 代理检测(self):passdef 代理取用(self):passif __name__ == '__main__':IPAP = IP代理池()

IP的爬取

我们可以通过爬虫,来获取网上的一些代理。
这里我们仅主要介绍爬取一个网站,其余的大家可以自己去寻找并获取,以丰富自己的IP代理来源。
在代码的框架上进行修改,得到:

import time
import httpx
from lxml import etreeheaders = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}class IP代理池(object):'''IP代理池'''def __init__(self):self.IPPool = []self.快代理链接 = "https://www.kuaidaili.com/free/"def 代理爬取(self,num):for i in range(1,num):url = self.快代理链接+"inha/"+str(i)res = httpx.get(url, headers=headers)if(res.status_code == 200):con = etree.HTML(res.text)ip_list = con.xpath('//*[@id="list"]/table/tbody/tr/td/text()')for i in range(len(ip_list)//8):self.IPPool.append({"IP":ip_list[i*8+0],"Port":ip_list[i*8+1],"匿名度":ip_list[i*8+2],"类型":ip_list[i*8+3]})print(self.IPPool)time.sleep(1)def 代理检测(self):passdef 代理取用(self):passif __name__ == '__main__':IPAP = IP代理池()IPAP.代理爬取(2)

IP的检测

以下代码添加了IP的可用性检测模块,通过获取百度首页的方式,来判断代理是否可用,并筛选出反应速度在0.3s以上的代理,写入csv文件中

import time,os,csv
import httpx
from lxml import etreeheaders = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}class IP代理池(object):'''IP代理池'''def __init__(self):self.IP池 = []self.可用IP = []self.快代理链接 = "https://www.kuaidaili.com/free/"# 如果存在IP代理池文件,则进行读取if(os.path.exists("IPPool.csv")):# 读取相关文档with open("IPPool.csv",'r') as csv_f:reader = csv.DictReader(csv_f)for cvs_row in reader:self.IP池.append({'IP':cvs_row['IP'],'Port':cvs_row['Port'],'匿名度':cvs_row['匿名度'],'类型':cvs_row['类型']})def 代理爬取(self,num):for i in range(1,num+1):url = self.快代理链接+"inha/"+str(i)res = httpx.get(url, headers=headers)if(res.status_code == 200):con = etree.HTML(res.text)ip_list = con.xpath('//*[@id="list"]/table/tbody/tr/td/text()')for i in range(len(ip_list)//8):ipcon = {"IP":ip_list[i*8+0],"Port":ip_list[i*8+1],"匿名度":ip_list[i*8+2],"类型":ip_list[i*8+3]}if(not ipcon in self.IP池):self.IP池.append(ipcon)print("添加IP代理:"+ipcon["IP"]+":"+ipcon["Port"])else:print("IP代理:"+ipcon["IP"]+":"+ipcon["Port"]+"已存在")time.sleep(1)def 代理检测(self):for each in self.IP池:proxies = {each["类型"]+"://":each["类型"]+"://"+each["IP"]+":"+each["Port"]}res = httpx.get("https://www.baidu.com/", headers=headers, proxies=proxies, timeout=0.3)if(res.status_code == 200):if(not each in self.可用IP):self.可用IP.append(each)print("IP代理:"+each["IP"]+":"+each["Port"]+"可使用")else:print("IP代理:"+each["IP"]+":"+each["Port"]+"已存在")else:print("IP代理:"+each["IP"]+":"+each["Port"]+"无效")with open("IPPool.csv",'w',newline='') as csv_f:write=csv.writer(csv_f)# 写入头row=['IP','Port','匿名度','类型']write.writerow(row)for each in self.可用IP:# 写入数据row=[each["IP"],each["Port"],each["匿名度"],each["类型"]]write.writerow(row)print("代理IP写入完毕!")def 代理取用(self):passif __name__ == '__main__':IPAP = IP代理池()index = input('1.爬取代理\n2.检测代理\n3.取用代理\n请选择:')while(True):if(index == '1'):IPAP.代理爬取(2)IPAP.代理检测()elif(index == '2'):IPAP.代理检测()elif(index == '3'):IPAP.代理取用()

IP的取用

IP的取用部分本来也是想要封装在类里的,但是Sanic似乎必须运行在主线程,暂时一下子没有找到什么解决方法,能力有限,也就先这样用了。
主要是希望能够通过API的方式进行调用,获取IP,当前是通过get的方式,来随机获取IP,后续也可以进行进一步优化,通过post请求,按照指定方式来获取指定数量的IP。

import time,os,csv,random
import httpx
from sanic import Sanic
from lxml import etree
import threading
from sanic.response import json
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}class IP代理池(object):'''IP代理池'''def __init__(self):self.IP池 = []self.可用IP = []self.快代理链接 = "https://www.kuaidaili.com/free/"# 如果存在IP代理池文件,则进行读取if(os.path.exists("IPPool.csv")):# 读取相关文档with open("IPPool.csv",'r') as csv_f:reader = csv.DictReader(csv_f)for cvs_row in reader:self.IP池.append({'IP':cvs_row['IP'],'Port':cvs_row['Port'],'匿名度':cvs_row['匿名度'],'类型':cvs_row['类型']})def 代理爬取(self,num):for i in range(num):url = self.快代理链接+"inha/"+str(i+1)try:res = httpx.get(url, headers=headers)except:print("爬取超时")time.sleep(1)if(res.status_code == 200):con = etree.HTML(res.text)ip_list = con.xpath('//*[@id="list"]/table/tbody/tr/td/text()')for i in range(len(ip_list)//8):ipcon = {"IP":ip_list[i*8+0],"Port":ip_list[i*8+1],"匿名度":ip_list[i*8+2],"类型":ip_list[i*8+3]}if(not (ipcon in self.IP池)):self.IP池.append(ipcon)print("添加IP代理:"+ipcon["IP"]+":"+ipcon["Port"])else:print("IP代理:"+ipcon["IP"]+":"+ipcon["Port"]+"已存在")def 代理检测(self):for each in self.IP池:proxies = {each["类型"]+"://":each["类型"]+"://"+each["IP"]+":"+each["Port"]}try:res = httpx.get("https://www.baidu.com/", headers=headers, proxies=proxies, timeout=0.3)except:print("检测超时,检测未通过")if(res.status_code == 200):if(not each in self.可用IP):self.可用IP.append(each)print("IP代理:"+each["IP"]+":"+each["Port"]+"可使用")else:print("IP代理:"+each["IP"]+":"+each["Port"]+"已存在")else:print("IP代理:"+each["IP"]+":"+each["Port"]+"无效")with open("IPPool.csv",'w',newline='') as csv_f:write=csv.writer(csv_f)# 写入头row=['IP','Port','匿名度','类型']write.writerow(row)for each in self.可用IP:# 写入数据row=[each["IP"],each["Port"],each["匿名度"],each["类型"]]write.writerow(row)print("代理IP写入完毕!")IPAP = IP代理池()
app = Sanic("IPPoll")
@app.route("/")
async def IP代理取用(request):num = random.randint(0,len(IPAP.IP池)-1)return json({'IP': IPAP.IP池[num]['IP'],'Port': IPAP.IP池[num]['Port'],'Type': IPAP.IP池[num]['类型']})def IP爬取():index = input('1.爬取代理\n2.检测代理\n请选择:\n')while(True):if(index == '1'):IPAP.代理爬取(50)IPAP.代理检测()elif(index == '2'):IPAP.代理检测()if __name__ == '__main__':threading.Thread(target=IP爬取).start()app.run(host="localhost", port=8000)

使用方式:
直接访问 “http://localhost:8000/” 即可。

这样一来,整个的基本盘也就完成了,后续当然还可以进行很多的优化,这些就交给大家自己去尝试了。
如:
IP获取的各种方式
IP爬取的速度
代理IP获取的来源
定时的IP获取
或者如果需要UI界面的话,也可以进行添加
等等等等……

最后:千万记得,点赞,关注,收藏哦~
有什么其他的问题也可以在评论区询问,作者后面有时间也会把优化完的IP代理池也发一下,一切以使用更方便为目的。

如何制作一个自己的IP代理池相关推荐

  1. 实现一个免费的IP代理池

    我将代理池程序设计为4个模块:存储模块,获取模块,检查模块,接口模块.模块之间关系如下: 存储模块:我使用的是redis数据库存储,使用的是redis中的集合,集合内元素无序并且无重复.该存储模块的主 ...

  2. 手把手教你用Python搭建IP代理池,轻松破解请求频率限制反爬虫~

    我们所写的爬虫,它对服务器发出的网络请求频率要比正常用户的高的多,从而开发者可以将请求频率过高的用户视为爬虫程序,从而来限制爬虫程序. 今天志斌就来给大家分享一下,如何用Python搭建一个IP代理池 ...

  3. Scrapy ip代理池

    一.概述 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时,该ip就会被拉黑.在一段时间内禁止访问. 应对的方法有两种: 1. 降低爬 ...

  4. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...

  5. python ip动态代理_给自己的爬虫做一个简单的动态代理池

    使用代理服务器一直是爬虫防BAN最有效的手段,但网上的免费代理往往质量很低,大部分代理完全不能使用,剩下能用的代理很多也只有几分钟的寿命,没法直接用到爬虫项目中. 下面简单记录一下我用scrapy+r ...

  6. Python使用Redis实现IP代理池

    可以使用快代理,芝麻代理,蘑菇代理 ,讯代理等代理商提供API代理IP或者免费代理建立自己IP代理池 #使用apscheduler库定时爬取ip,定时检测ip删除ip,做了2层检测,第一层爬取后放入r ...

  7. 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件

    一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...

  8. Python3网络爬虫开发实战,IP代理池的维护

    我们在上一节了解了代理的设置方法,利用代理我们可以解决目标网站封 IP 的问题,而在网上又有大量公开的免费代理,其中有一部分可以拿来使用,或者我们也可以购买付费的代理 IP,价格也不贵.但是不论是免费 ...

  9. python通过ip池爬_python爬虫18 | 就算你被封了也能继续爬,使用IP代理池伪装你的IP地址,让IP飘一会...

    我们上次说了伪装头部 ↓ 让自己的 python 爬虫假装是浏览器 小帅b主要是想让你知道 在爬取网站的时候 要多的站在对方的角度想问题 其实 这和泡妞差不多 你要多站在妹纸的角度思考 她的兴趣是什么 ...

最新文章

  1. 系统技术方案 系统构架_构架系统时应注意的事项
  2. java封装插件,基于面向对象思想封装一个水球插件
  3. 「镁客·请讲」天宝陈朝晖:AI 的准确译法不是人工智能,而是机器智能...
  4. 费解!为什么那么多人用“ji32k7au4a83”作密码?
  5. Spring源码解析之:Spring Security启动细节和工作模式--转载
  6. 05字符串的常用基本操作
  7. BASIC-5 查找整数
  8. 企业微服务:实现crud操作之创建实体类
  9. Bash脚本教程之目录堆栈
  10. python原理与架构_Python:爬虫原理和网页构造
  11. 突破开源Redis的内存限制,存算分离的GaussDB到底有多能“装”?
  12. Jquery插件的编写和使用
  13. P3399 丝绸之路(线性二维dp)
  14. End-to-end Recovery of Human Shape and Pose
  15. Flask运行时Unicode编码错误
  16. 双人对战的球类游戏ios源码
  17. java青蛙跳井_数学运算归纳
  18. Euraka服务注册篇
  19. 如何防止企业电子邮件外泄
  20. 蓝凌LBPM平台,大公司流程数字化升级必选

热门文章

  1. Qt 获取当前桌面 app路径
  2. C程序如何与操作系统交互?
  3. Vue父组件拿到接口的数据,并把数据传给子组件的问题;同时,父组件数据更新,子组件同样拿到新数据的问题
  4. Jspxcms 目录结构
  5. 住建部详解明年楼市调控重点,释放了这些信号
  6. java 圆角_CSS3倒圆角
  7. 正则表达式 常规的一些用户登录验证信息
  8. 手机处理器的nm制造工艺
  9. 单例模式之饿汉、懒汉模式
  10. linux系统10个最常用命令,Linux操作系统10条最常用的基础操作命令