WordPress极简博客 WordPress极简博客
  • 新鲜事
  • 战疫情
  • UI素材
    • UI素材
    • 电商/节日
    • PPT
      • 节日庆典
      • 工作汇报
      • 商业计划书
    • word
      • 简历竞聘
      • 合同/公文
  • 创客头条
    • 音乐分享
    • 初创文章
    • 极客头条
    • 生活趣事
    • 生活日记
    • 防骗指南
  • 编程教学
    • API日记
    • Linux安全栏目
      • Linux运维安全汇总
      • DDOS攻击防护
      • XSS攻击防护
      • SQL安全防护
    • Python技术栏目
      • Python基础入门
      • Python基础结构
    • WordPress技术栏目
      • WP主题
      • WordPress技术教程
      • RIPRO主题美化
    • WordPress漏洞发布
    • 技术教程汇总
    • 严选源码
  • 专题
  • 基友
  • 隐私
  • 注册
    登录
立即登录
  • 首页
  • 云优化
  • 新疫情
  • 新鲜事
    • 热文
    • 极客
    • 生活
  • 技术篇
    • WP主题
    • 技术教程
    • Python入门
    • Python基础
  • 专题篇
  • 友链君
首页 技术教程(干货) python搭建匿名代理池

python搭建匿名代理池

夏柔 9月 28, 2019

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测试可运行。

 

#python干货
0
J2dcg1.png
猜你喜欢
  • Nginx添加跨域限制规则
  • 使用测速脚本对国内Linux服务器进行测速
  • 域名爆破之自动化信息收集脚本
  • 利用免费接口实现国家开放大学刷网课脚本
  • RiProV2定制导航条
  • 判断是否在微信浏览器打开
  • 微信内自动播放音频非百度方案
  • 利用veImageX加速您的网站,想不快都难!
  • SWAPIDC减少注册信息及防刷注册量教学
  • Python实现定时发送每日早报及生活指数
24 12月, 2019
解决宝塔后台phpMyAdmin - 4.7.2版本 本地云服务器套子节未正确设置
夏柔
站长
夏山如碧 - 怀柔天下
1724
文章
25
评论
58145K
获赞
版权声明

文章采用创作共用版权 CC BY-NC-ND/2.5/CN 许可协议,与本站观点无关。

如果您认为本文侵犯了您的版权信息,请与我们联系修正或删除。
投诉邮箱wpsite@aliyun.com

栏目推荐
Python基础入门33
WordPress技术教程267
前沿技术情报所22
城市创新——新消费11
最近有哪些不可错过的热文23
程序员的养生之道0
节
春
  • 新鲜事
  • 疫情实况
  • UI素材
  • 技术教程
  • 音乐分享
  • 专题
  • 友情
  • 隐私
  • 云优化
Copyright © 2019-2025 WordPress极简博客. Designed by 夏柔. 辽公网安备21010502000474号 辽ICP备19017037号-2