python搭建匿名代理池 : GezCode源码站-专业源码源代码,抓包资源整站,互站源码,php源码,java源码,vue源码,游戏源码,直播源码,直播带货,合约源码,合约源码下载,娱乐彩,求购需求,源码出售,源码买卖,源码平台,整站源码下载!GezCode Source Station-Professional source code, package grabbing resources for the entire site, mutual source code, PHP source code, Java source code, Vue source code, game source code, live source code, live streaming with goods, contract source code, contract source code download, entertainment lottery, purchase demand, source code sales, source code trading, source code platform, whole site source code download! - GezCode源码站-专业源码源代码,抓包资源整站,互站源码,php源码,java源码,vue源码,游戏源码,直播源码,直播带货,合约源码,合约源码下载,娱乐彩,求购需求,源码出售,源码买卖,源码平台,整站源码下载!GezCode Source Station-Professional source code, package grabbing resources for the entire site, mutual source code, PHP source code, Java source code, Vue source code, game source code, live source code, live streaming with goods, contract source code, contract source code download, entertainment lottery, purchase demand, source code sales, source code trading, source code platform, whole site source code download!

python搭建匿名代理池

python搭建匿名代理池

如果您是本站会员;我们将为您提供技术支持!!!

 
本篇文章给大家带来的内容是介绍如何用Python搭建匿名代理池?搭建匿名代理池的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
常听到很多人抱怨自己的IP因爬虫次数太多而被网站屏蔽,不得不频繁使用各种代理IP,却又因为网上的公开代理大部分都是不能使用,而又要花钱花精力去申请VIP代理,几番波折又遭屏蔽。特此写一篇如何利用Python搭建代理池的文章,以降低时间及精力成本,实现自动化获取活跃代理IP的功能。
运作原理
一、 网站代理获取
1. 爬免费代理网站的IP列表测试是否可用及是否是高匿
2. 若都是,则放进数据库,否则丢弃。
3. 重复第2步
二、 保证失效的代理能被尽快从代理池中挑出
1. 从爬虫数据库获取IP
2. 测试IP的可用性和匿名性
3. 如果可用且匿名,则保留,否则丢弃。
4. 重复第1步
说明①:可建立一个爬虫程序守护程序(Daemon),有此方面需要的小伙伴可自行谷歌,在此不多做介绍。
说明②:可建立一个对外代理信息接口,无论你用NodeJS或者Flask/Django或者PHP来写都没关系,在此也不多做介绍。
实现:
建议库: requests, BeautifulSoup, re, sqlite3。
其中,用requests库获取代理网站页面,用BeautifulSoup和re两库来进行代理信息获取,用sqlite3来对这些信息进行存取。
如果必要(如代理网站有反爬虫策略时),可用PhantomJS替代requests,或用相应库进行数据清理(如base64解码)。
下面简单展示一下各部分的代码:
首先是选择多个能爬取代理且不容易被屏蔽IP的网站,此处以proxy-list.org为例:

BASE_URL = "https://proxy-list.org/english/index.php?p="   #IP地址及端口的正则  Re_Pattern_IP = re.compile("(.*):")  Re_Pattern_PORT = re.compile(":(.*)")   #网站有11页,所以循环11次获取所有代理IP及端口  for startingURL_Param in range(1,11):     HTML_ProxyPage = requests.get(BASE_URL+str(startingURL_Param)).content     soup = bs(HTML_ProxyPage,"html.parser")     for Raw_ProxyInfo in soup.find_all("ul",{"class":None}):         #此网站有用Base64简单对代理进行了加密,所以这里对其解码         ip_port = base64.b64decode(Raw_ProxyInfo.find("li",{"class":"proxy"}).text.replace("Proxy('","").replace("')",""))         #接下来利用正则从网页数据中提取我们需要的信息         IP = re.findall(Re_Pattern_IP, ip_port)[0]         PORT = re.findall(Re_Pattern_PORT, ip_port)[0]         TYPE = Raw_ProxyInfo.find("li",{"class":"https"}).text

接下来是一段简易代理池框架类的代码,提供代理数据库的添加、删除、可连接性检测、匿名性检测

class ProxyPool:             #初始化爬虫池数据库     def __init__(self,ProxyPoolDB):         self.ProxyPoolDB = ProxyPoolDB         self.conn = sqlite3.connect(self.ProxyPoolDB, isolation_level=None)         self.cursor = self.conn.cursor()         self.TB_ProxyPool = "TB_ProxyPool"         self.cursor.execute("CREATE TABLE IF NOT EXISTS "+self.TB_ProxyPool+"(ip TEXT UNIQUE, port INTEGER, protocol TEXT)")        #添加代理IP进代理池的接口     def addProxy(self, IP, PORT, PROTOCOL):           self.cursor.execute("INSERT OR IGNORE INTO " + self.TB_ProxyPool+"(ip, port, protocol) VALUES (?,?,?)", [IP,PORT,PROTOCOL])        #检查代理的匿名性及可连接性     def testConnection(self, IP, PORT, PROTOCOL):         proxies = { PROTOCOL: IP+":"+PORT }         try:             OrigionalIP = requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content             MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT,proxies=proxies).content             if OrigionalIP != MaskedIP:                 return True             else:                 return False         except:                 return False        #删除代理IP对应的数据库记录     def delRecord(self, IP):         self.cursor.execute("DELETE FROM "+self.TB_ProxyPool+" WHERE ip=?",(IP,))

下面是对代理池进行去“失效IP”的代码:

#循环代理池,逐行测试IP地址端口协议是否可用  def cleanNonWorking(self):     for info in self.cursor.execute("SELECT * FROM "+self.TB_ProxyPool).fetchall():         IP = info[0]         PORT = str(info[1])         PROTOCOL = info[2].lower()            isAnonymous = self.testConnection(IP,PORT,PROTOCOL)         if isAnonymous == False:             #这条代理的可用性失效了,从数据库里删除             self.delRecord(IP)     #通过检测icanhazip.com回显来检测可用性及匿名性  def testConnection(self, IP, PORT, PROTOCOL):         proxies = { PROTOCOL: IP+":"+PORT }         try:             OrigionalIP = requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content             MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT,proxies=proxies).content             if OrigionalIP != MaskedIP:                 return True             else:                 return False         except:                 return False

反思

这个项目是我当年用Python练手写的,以现在的程度再来回顾,逻辑不够严谨,各类功能太过耦合,不少段落需要重写,因为代码是在校园网内所跑,所以还需要考虑到网络连接的稳定性,这就造成部分代码之间的混乱关系。
通过icanhazip.com来检测代理匿名性的方法或许有效,但却忽略了X-Forwarded-For的HTTP头,所以有很大风险,必须改进。
验证代理池内代理的有效性,需要多线程,目前的方案效率太低。

完整代码

放在此文章中的是代理池的核心代码,旨在提供各位读者能够自己实现的思路及参考,Ubuntu 16.04及Kali下用Python 2.7测试可运行。
 

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开/商品支付,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

可以

常见问题

相关文章

评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

我们将24小时内回复。
取消
python搭建匿名代理池-海报

分享本文封面