大家好,今天来为大家解答高效构建匿名代理池:Python爬虫实战攻略这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
02工作原理
1.获得网站代理
1.爬取免费代理网站的IP列表,测试是否可用,是否高密
2. 如果两者都是,则将它们放入数据库,否则丢弃它们。
3.重复步骤2
2. 确保尽快从代理池中挑选出失败的代理
1.从爬虫数据库获取IP
2. 测试IP可用性和匿名性
3. 如果可用且匿名,则保留它,否则丢弃它。
4.重复步骤1
注:可以创建爬虫守护进程(Daemon)。有需要的朋友可以自行Google一下。我这里就不介绍了。
注:可以建立外部代理信息接口。无论你使用NodeJS 还是Flask/Django 或者PHP 来编写它都没有关系。我这里就不介绍了。
03实现
建议的库:requests、BeautifulSoup、re、sqlite3。
其中requests库用于获取代理网站页面,BeautifulSoup和re库用于获取代理信息,sqlite3用于访问该信息。
如果有必要(比如代理网站有反爬虫政策时),可以使用PhantomJS来替换请求,或者使用相应的库进行数据清洗(比如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和端口
forstartingURL_Paraminrange(1,11):
HTML_ProxyPage=requests.get(BASE_URL+str(startingURL_Param)).content
soup=bs(HTML_ProxyPage,"html.parser")
forRaw_ProxyInfoinsoup.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
接下来是一段简单的代理池框架类的代码,提供了代理数据库的增删改查、连通性检测、匿名性检测:
类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("如果不存在则创建表"+self.TB_ProxyPool+"(ip TEXT UNIQUE, 端口INTEGER, 协议TEXT)")
#将代理IP添加到代理池的接口
defaddProxy(自身,IP,端口,协议):
self.cursor.execute("插入或忽略"+self.TB_ProxyPool+"(ip、端口、协议)值(?)",[IP,端口,协议])
#检查代理的匿名性和可连接性
deftestConnection(自身,IP,端口,协议):
代理={协议:IP+":"+端口}
尝试:
OrigionalIP=requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content
MaskedIP=requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT,proxies=proxies).content
ifOrigionalIP!=MaskedIP:
返回真
否则:
返回错误
除了:
返回错误
#删除代理IP对应的数据库记录
defdelRecord(自身,IP):
self.cursor.execute("从"+self.TB_ProxyPool+" 删除,其中ip=?",(IP,))
以下是从代理池中删除“无效IP”的代码:
#循环代理池,逐行测试IP地址端口协议是否可用
defcleanNonWorking(自我):
forinfoinself.cursor.execute("SELECT * FROM "+self.TB_ProxyPool).fetchall():
IP=信息[0]
端口=str(信息[1])
协议=信息[2].lower()
isAnonymous=self.testConnection(IP,端口,协议)
ifisAnonymous==False:
#该代理的可用性已过期,将从数据库中删除。
self.del记录(IP)
#通过检测icanhazip.com echo 检查可用性和匿名性
deftestConnection(自身,IP,端口,协议):
代理={协议:IP+":"+端口}
尝试:
OrigionalIP=requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content
MaskedIP=requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT,proxies=proxies).content
ifOrigionalIP!=MaskedIP:
返回真
否则:
返回错误
除了:
返回错误
04反思
年初我在这个项目上用Python练习了手写。现在回想起来,逻辑不够严谨,各个功能耦合性太强。很多段落需要重写。由于代码运行在校园网上,仍然需要考虑网络连接的稳定性,这就造成了部分代码之间的混乱关系。
通过icanhazip.com检测代理匿名的方法可能有效,但它忽略了X-Forwarded-For HTTP标头,因此风险很大,必须改进。
验证代理池中代理的有效性需要多线程,目前的方案效率太低。
05完整代码
【高效构建匿名代理池:Python爬虫实战攻略】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
python真强大啊!搭建代理池自己也能搞定?太酷了
有15位网友表示赞同!
我一直想要学习爬虫,感觉这个标题很有吸引力
有7位网友表示赞同!
匿名代理池很重要吗?我需要了解一下
有20位网友表示赞同!
玩转爬虫听起来好有趣,我要去看看文章的内容
有17位网友表示赞同!
不知道Python搭建代理池难度有多大?我能学到吗?
有6位网友表示赞同!
以前听说过爬虫,没想到还能用python实现匿名代理池,厉害了!
有5位网友表示赞同!
这个标题让我对数据采集更加感兴趣
有7位网友表示赞同!
爬虫技术真牛批,可以采集很多有用的数据
有8位网友表示赞同!
我还在学习编程,感觉能学到很多技巧
有11位网友表示赞同!
匿名代理池是不是用来保护隐私啊?
有16位网友表示赞同!
Python真的是万能的语言!
有15位网友表示赞同!
搭建自己的代理池听起来很专业!
有11位网友表示赞同!
爬虫技术应用广泛吧?
有8位网友表示赞同!
希望文章能解释清楚这个技术的原理
有9位网友表示赞同!
学习新的技术总是一件兴奋的事
有11位网友表示赞同!
这篇文章应该挺有实战价值的,希望能学到点东西
有10位网友表示赞同!
我要去网上搜一下Python爬虫教程
有12位网友表示赞同!
感觉爬虫是一个很有潜力的技术领域,以后有机会多学习一下
有6位网友表示赞同!
希望这篇文章能提供一些实际操作步骤
有6位网友表示赞同!
搭建代理池可以提高效率吗?
有14位网友表示赞同!
我想知道这个项目要多少时间才能完成?
有6位网友表示赞同!