Email: WlRCME0zSjRRR2R0WVdsc0xtTnZiUT09

0x01 写在前面

常听到很多人抱怨自己的IP因爬虫次数太多而被网站屏蔽,不得不频繁使用各种代理IP,却又因为网上的公开代理大部分都是不能使用,而又要花钱花精力去申请VIP代理,几番波折又遭屏蔽。特此写一篇如何利用Python搭建代理池的文章,以降低时间及精力成本,实现自动化获取活跃代理IP的功能。

0x02 运作原理

一、 网站代理获取

1. 爬免费代理网站的IP列表测试是否可用及是否是高匿

2. 若都是,则放进数据库,否则丢弃。

3. 重复第2步

二、 保证失效的代理能被尽快从代理池中挑出

1. 从爬虫数据库获取IP

2. 测试IP的可用性和匿名性

3. 如果可用且匿名,则保留,否则丢弃。

4. 重复第1步

说明①:可建立一个爬虫程序守护程序(Daemon),有此方面需要的小伙伴可自行谷歌,在此不多做介绍。

说明②:可建立一个对外代理信息接口,无论你用NodeJS或者Flask/Django或者PHP来写都没关系,我会在未来的更新中加上这个功能,在这篇文章中也不多做介绍。

0x03 实现

建议库: requests, BeautifulSoup, re, sqlite3。

其中,用requests库获取代理网站页面,用BeautifulSoup和re两库来进行代理信息获取,用sqlite3来对这些信息进行存取。

如果必要(如代理网站有反爬虫策略时),可用PhantomJS替代requests,或用相应库进行数据清理(如base64解码)。

下面简单展示一下各部分的代码:

首先是选择多个能爬取代理且不容易被屏蔽IP的网站,此处以http://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

0x04 反思

这个项目是我年初时用Python练手写的,现在再来回顾,首先是逻辑不够严谨,各类功能太过耦合,不少段落需要重写并模块化,其次因为这个代理池需要在校园网内运行,所以还需要考虑到无线网络连接的稳定性,这就造成代码之间各种添添补补的混乱关系。

通过http://icanhazip.com来检测代理匿名性的方法或许有效,但却忽略了X-Forwarded-For的HTTP头,所以有很大风险,必须改进。

验证代理池内代理的有效性,需要多线程或者异步,目前的方案效率太低,与其说是工具不如说是玩具。

0x05 完整代码

放在此文章中的是代理池的核心代码,旨在提供各位读者能够自己实现的思路及参考。完整代码可在我的Github主页中找到(ProxyPool),Win7 64位、Ubuntu 16.04及Kali下用Python 2.7测试可运行。

0x06 附

这篇文章首先是在Python中文社区的公众号上所写,在知乎修改的时候我已经开始大改Github上的代码了,不出意外的话过一段时间就能把高匿代理池改进,修复上述的部分问题,届时将会重新给该项目写篇教程,请各位拭目以待更优秀的高匿代理池。

python代理池_进击:用Python搭建高匿代理池相关推荐

  1. Python爬虫 | 反爬机制:IP限制高匿代理 IP 突破(爬虫 IP 被禁怎么办?)

    一. 什么是代理? 二. 代理服务器的作用 可以进行请求的响应和转发 三. 在爬虫中为何要使用代理 如果我们使用爬虫对一个网站在一段时间内发起一个高频请求,该网站会检测出这个异常的现象,并将异常的请求 ...

  2. python爬取高匿代理IP(再也不用担心会进小黑屋了)

    一起进步 为什么要用代理IP 很多数据网站,对于反爬虫都做了一定的限制,这个如果写过一些爬虫程序的小伙伴应该都深有体会,其实主要还是IP进了小黑屋了,那么为了安全,就不能使用自己的实际IP去爬取人家网 ...

  3. 搭建ADSL自动拨号高匿代理池

    搭建ADSL自动拨号高匿代理池 adsl这种服务器网上有很多, 各位自己选择一个服务商购买就行. 搭建服务器环境: centos7 64位 首先购买后,连上服务器先进行拨号, 我这里的拨号命令是 pp ...

  4. python爬取国内代理ip_【python】国内高匿代理爬取,并验证代理ip有效性

    运行环境:python 3.7.3 所需库: 1. requests 2. lxml 3. time 4. multiprocessing 5. sys 目的:构建自己的代理ip池,针对封ip型反爬虫 ...

  5. Python爬取西刺国内高匿代理ip并验证

    1.抓取ip存入文件 首先,我们访问西刺首页 http://www.xicidaili.com/,并点击国内高匿代理,如下图: 按 F12 检查网页元素或者 ctrl+u查看网页源代码: 我们需要提取 ...

  6. netty 高匿ip检测_高匿代理ip不用担心被网站检测

    高匿代理ip不用担心被网站检测 市场上关于代理ip的服务有很多种,可谓是鱼目混珠,一些服务虽然可以保证用户切换ip地址,但经常会被举报,暴露真实的ip地址,风险系数极高,让网民们苦不堪言. 近期,以高 ...

  7. 【爬虫】 Squid 3.5.20 安装与配置 高匿代理

    Squid 介绍 Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据.也就是说,当一个用户象要下载一个主页时,它向Squid发出一个申请,要Squid替它 ...

  8. 获取高匿代理ip的步骤思路

    一.获取高匿代理IP思路 注意事项 做第二步之前你需要先找个地址url,用本机访问出来一个成功的页面,建议保留为html,作为后面使用,进行成功和禁用页面的对比,然后才可以高频访问此网站使你的电脑禁用 ...

  9. 获取高匿代理ip的步骤思路(推荐使用--刚找到的方法判断是否高匿)

    文章目录 一.获取高匿代理IP思路 注意事项 2.(刚找到的,推荐这个)判断高匿代理ip的另外俩个方法 1.获取高匿的可用代理ip,可以用以下四个步骤(之前的笨方法): 二.实践. 1.获取代理ip, ...

最新文章

  1. 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析
  2. RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
  3. php框架where条件使用,where条件
  4. java斗破苍穹游戏阵容,斗破苍穹手游竞技场阵容搭配解析 最强阵容你知道吗
  5. 华为交换机导入配置_华为交换机基础配置1—进入命令行
  6. 图像处理之添加文字水印
  7. 图Graph--寻找二度好友(BFS应用)
  8. POJ3420 Quad Tiling(模板+矩阵快速幂)
  9. 如何让笨重的系统架构变灵巧?
  10. date命令使用文档.txt
  11. win10计算机桌面路径,win10桌面路径是什么?如何修改win10桌面文件路径?
  12. 微信小程序上传图片到云储存
  13. 可见的轮廓线用虚线绘制_机械制图国家标准规定,可见的轮廓线用虚线绘制。...
  14. Scratch小游戏《恐龙》
  15. 迅为STM32MP157开发板使用手册更新啦
  16. 网站流量的算法是怎么算的?网站每月10G流量够用吗
  17. Xmanager、Xshell、Xftp、Xlpd免费版下载
  18. NXP JN5189 ZigBee 3.0开发环境搭建(续)
  19. 计算机心理学测试题目及答案解析,大学生趣味心理测试题及答案
  20. 阿哲学了就来聊——Java反射

热门文章

  1. 《挑战程序设计竞赛》阅读笔记二 之 ALDS1_2_C Stable Sort
  2. 如何注册网站域名?需要注意哪些事项?
  3. 暗斑怎么形成的_脸上出现暗斑的原因是什么?暗斑怎么形成的
  4. 快速搭建仓储管理系统
  5. Codeforces 1324 D. Pair of Topics(二分)
  6. Equalize Prices
  7. 190㎡现代轻奢私宅,满屋洋溢着高级与优雅~
  8. Android UI 切图命名规范、标注规范及单位描述
  9. Android 路由框架ARouter最佳实践
  10. EXCEL【数据处理之数据合并——字段合并】