本文摘自php中文网,作者青灯夜游,侵删。
本篇文章给大家带来的内容是介绍如何用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为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | BASE_URL = "https://proxy-list.org/english/index.php?p="
Re_Pattern_IP = re. compile ( "(.*):" )
Re_Pattern_PORT = re. compile ( ":(.*)" )
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 }):
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
|
接下来是一段简易代理池框架类的代码,提供代理数据库的添加、删除、可连接性检测、匿名性检测:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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)" )
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
def delRecord( self , IP):
self .cursor.execute( "DELETE FROM " + self .TB_ProxyPool + " WHERE ip=?" ,(IP,))
|
下面是对代理池进行去“失效IP”的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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)
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搭建匿名代理池?搭建匿名代理池的方法的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
怎么获得一个字符串的子串
如何使用Python生成mac地址
Python学习日记(1)
带你简单了解Python创建神经网络模型的内容
大学有Python课吗
Python 各种删除文件失败的处理方式分享
Python中elif可以单独使用吗
Python怎么把两个列表合并
学Python用什么电脑
Python编程怎么学
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » 如何用Python搭建匿名代理池?搭建匿名代理池的方法