python爬虫如何更换ip_Python爬虫被封IP,怎么换ip?
Python爬虫被封IP,怎么换ip?常听到很多人抱怨自己的IP因爬虫次数太多而被网站屏蔽,不得不频繁使用各种代理IP,却又因为网上的公开代理大部分都是不能使用,而又要花钱花精力去申请VIP代理,几番波折又遭屏蔽。特此写一篇如何利用Python搭建代理池的文章,以降低时间及精力成本,实现自动化获取活跃代理IP的功能。
1.运作原理:
一:网站代理获取
1.爬免费代理网站的IP列表测试是否可用以及是否高匿
2.若都是,则放进数据库,否则丢弃
3.重复以上步骤
二:保证失效的代理能被尽快从代理池中挑出
1.从爬虫数据库获取IP
2.测试IP的可用性和匿名性
3.如果可以用且匿名,则保留,否则丢弃
4.重复以上操作
说明①:可建立一个爬虫程序守护程序(Daemon),有此方面需要的小伙伴可自行谷歌,在此不多做介绍。
说明②:可建立一个对外代理信息接口,无论你用NodeJS或者Flask/Django或者PHP来写都没关系,我会在未来的更新中加上这个功能,在这篇文章中也不多做介绍。
2.实现:
建议库:requests, Beautifulsoup,re, sqlite3.
其实,用requests库获取代理网站页面,用Beautifulsoup和re两库来进行代理信息获取,用sqlite3来对这些信息进行存取
如果有必要(如代理网站有反爬虫策略时),可用PhantomJS,或用相应库进行数据清理(如base64解码)。
下面简单展示一下各部分的代码:
首先时选择多个能爬取代理且不容易被屏蔽IP的网站,此处以poxy-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
放在此文章中的是代理池的核心代码,旨是提供各位读者能够自己实现的思路及参考。完整代码可在我的Github主页中找到(ProxyPool),Win7 64位、Ubuntu 16.04及Kali下用Python 2.7测试可运行。如果这种IP依然满足不了要求,可推荐:ip精灵IP,匿名,高匿,稳定安全可靠,可用率>95% ,每天流水40万+,值得信赖的代理IP供应平台
python爬虫如何更换ip_Python爬虫被封IP,怎么换ip?相关推荐
- python爬虫自动更换ip_Python 爬虫使用动态切换ip防止封杀
对于爬虫被封禁 ! 爬虫一般来说只要你的ip够多,是不容易被封的. 一些中小网站要封杀你,他的技术成本也是很高的,因为大多数网站没有vps,他们用的是虚拟空间或者是sae,bae这样的paas云. 其 ...
- 换ip_手动更换ip与换ip软件的优劣对比
随着科技发达以及技术革新,越来越多新奇古怪的软件已经走进人们的生活,尤其是在市场营销方面,许许多多能够促进市场营销方面以及高效的软件也逐渐进入人们的视野.换ip软件就是其中之一.但是随着科技的发达,还 ...
- python爬虫使用代理ip_python爬虫如何设置代理ip
python爬虫设置代理ip的方法:首先写入获取到的ip地址到proxy:然后用百度检测ip代理是否成功,并请求网页传的参数:最后发送get请求,并获取返回页面保存到本地. [相关学习推荐:pytho ...
- python获取他人的ip_Python获取指定网段正在使用的IP
#!/usr/bin/env python # -*- coding: utf-8 -*- ''''' 使用方法样例 python test20.py 192.168.1.1 (会扫描192.168. ...
- python web ip_Python爬虫IP代理教程,让你不再为IP被封禁发愁!
本文来源没啥特别,因为没使用ip代理导致爬取boos直聘数据时,ip被封了,不过好在已解决,想看看博主的爬虫文章的可以点击下方链接,还是蛮全的. 一.免费代理ip地址推荐 站大爷 快代理 芝麻代理芝麻 ...
- python爬虫代理ip_Python爬虫如何获取代理ip及ip验证?
如何获取大量的公开数据信息,这是我们互联网在竞争激烈的环境中的生存之道,不管在什么环境下都要学习和了解用户市场,客户需求,竞争对手,如何能获取到大量的数据信息,那么就需要用到网络爬虫. 在我们从事py ...
- python 获取用户ip_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
你还在苦苦拉票吗? 前言 剖析投票原理 处理思路 具体实战 主要流程 具体细节python 代码实例python 具体细节java 代码实现java 总结 点击此处,获取海量Python学习资料! 前 ...
- python爬虫防屏蔽_python爬虫程序如何预防被限制
有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份.此时,我们就可以通过设置Use ...
- Python进阶之前端和爬虫基础
前端和爬虫基础 一.了解前端页面源代码 1.了解前端页面源代码的构成 html全称HyperText Mackeup Language,翻译为超文本标记语言,它不是一种编程语言,是一种描述性的标记语言 ...
- Python实现信息自动配对爬虫排版程序(附下载)
授权自AI科技大本营(ID:rgznai100) 本文约2800字,建议阅读7分钟. 本文为你介绍Python实现信息自动配对爬虫排版程序. 公众号(DatapiTHU)后台回复"20200 ...
最新文章
- usaco Mixing Milk
- Ubuntu远程操作Linux服务器GUI程序
- 【转】[教程] CSS入门3:如何插入CSS样式
- oracle运维平台开发,Oracle数据库运维
- Hibernate5-1对多(1:n)-级联删除-cascade=delete-orphanl
- 如何新建一个datatable,并往表里赋值
- iOS开发日记39-上传ERROR-90535,90529,90049
- Himall商城LinqHelper帮助类(2)
- python列表替换_Python 列表元素替换
- Excel 行列转换的最简方法 1
- 痱子的预防和治疗方法
- 勇敢码农,不怕困难!阿里内部不外传秘籍50万字Java面试手册奉上
- mysql判断空_MySQL判断字段是否为null
- 【AI测试】人工智能测试整体介绍——第二部分
- 四、字符编码:ascii、gbk、Unicode、utf-8
- C#基于NAudio的声音识别(二)——MFCC+SVM/BP
- Java生成XML数字签名
- RSD 教程 —— 4 框架
- PB反编译(Powerbuilder反编译)工具的优缺点对比总结
- day72 JavaWeb框架阶段——RabbitMQ消息队列【了解常见的MQ产品,了解RabbitMQ的5种消息模型,会使用Spring AMQP】