发布网友 发布时间:2022-04-22 08:05
共5个回答
懂视网 时间:2022-05-10 18:32
本篇文章给大家带来的内容是介绍如何用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测试可运行。
热心网友 时间:2022-05-10 15:40
1、使用Hide IP Platinum热心网友 时间:2022-05-10 16:58
对于网络爬虫来讲,高匿免费HTTP代理IP算得上是必要资源之一,因为在实际采集过程中,网络爬虫IP被封是一个很普遍的问题。原理很简单,因为爬虫抓取速度太快。对于HTTP代理IP的选择,大多数的爬虫从业者会选择自己动手做个程序,定时从网络各种免费代理IP网站中抓取免费代理IP,虽然成本低,但是这种IP通常具有两个致命性缺点,一是可用代理IP数量没法保证;二是IP质量普遍不稳定。
假如想要使用更多更稳定的网页代理服务器,还是要踏踏实实找个大型的服务商,拥有庞大的代理IP池,IP数量有保障;IP有专人实时维护,稳定性安全性更佳。
传统的网络爬虫技术局限于对静态页面的抓取,模式相对单一。近几年随着网络技术不断发展,动态页面由于具有强大的交互能力,已成为网络信息传播的主流。Python语言在最近几年在网络爬虫界兴起,不得不归功于它足够简洁的语法和足够多的库的支持,使开发效率变高。
直白的说,用Python可以1个人做5个人的事情,只是多用10倍的机器,这是非常划算的事。在使用Python爬虫时,再配合一款好用的高匿HTTP代理IP,简直如虎添翼。
分布式爬虫是在计算机集群之上运转的爬虫系统。集群每一个节点上运行的爬虫程序与集中式爬虫系统工作原理相同,随着计算机集群使用数量增加,分布式爬虫优势也逐渐体现,对比单机爬虫,工作效率翻倍增长。
分布式爬虫在高速完成spider任务时,也会因过量过频的访问次数,更容易触发网站反爬机制,这时候单一IP地址早已无法满足分布式爬虫的抓取需要,使用大量代理IP成为必然趋势。拥有海量优质代理ip资源,特有分布式系统架构,从容应对分布式爬虫爆发增长,成为分布式爬虫的刚需资源,通过接入平台直接多线程操作,省去了多余的人力和时间。
随着大数据时代的来临,大数据也吸引了越来越多的关注。网络爬虫是一种高效的信息抓取工具,它集成了搜索引擎技术,并通过大数据技术手段进行优化。
分布式爬虫,从字面意思可以理解为集群爬虫,如果有spider任务,可以用多台机器同时运行。简单的说,分布式爬虫需要协调不同计算机之间的任务分工、资源分配、信息整合,而在此期间,使用大量代理ip资源将必不可少。
热心网友 时间:2022-05-10 18:33
其实在论坛一些网站上发过帖子的人都知道,有时候我们的频繁操作可能会被网站的监控系统*,提示被*发帖,其实原因是我们的IP被*了,这时使用代理Ip,替换一个IP就可以继续发帖了。热心网友 时间:2022-05-10 20:24
ip软件 切换 ip地址