作为一个python小白,到处踩坑是家常便饭,经常为了一个问题,花费几个小时,到处百度,谷歌找解决方案。有些问题对很多IT高手来说是小儿科的事儿,不屑去写,所以每次翻看了几十篇文章才终于找到自己想要的答案,运行成功的那一刹那,真的泪流满面啊。次数多了,也就有了想把遇到的坑写下来,留个纪念的想法。
Python一大功能就是写爬虫,使用代理IP,是绕不过的坑,代理IP除了使用有效性以外,最重要的一点就是匿名性,碰到透明代理,把你的信息全部转发出去,就一点意义都没有了。
以下这个检测方法原理是通过代理连接http://icanhazip.com/这个网站,通过网站返回的值与使用的代理IP做比较来确定是否匿名。
连接icanhazip网站,返回IP地址,如图所示:
此处的坑是:网站返回的信息除了代理IP,还有一行空行,需要使用strip()函数去除空行
写法一
代理IP来源:自建IP代理池
数据格式:TXT格式
每次提取数量:随机提取1个
代码如下:
def confirm(self):
url = "http://XXX.XXX.XXX.XXX:5010/get/" #自建代理IP池提取的IP,可以替换成自己的。
r = requests.get(url).text #获得代理IP
print(r)
proxy_info = r.split(':') #把IP和PORT拆分,生成列表
print(proxy_info)
proxy_ip = proxy_info[0] #从列表中,取第一个值作为IP
proxy_port = proxy_info[1] #从列表中,取第二个值作为PORT
thisProxy = "http://" + proxy_ip + ':' + str(proxy_port)
# 使用取出的IP和PORT,重组成完整的代理
print(thisProxy)
requests.adapters.DEFAULT_RETRIES = 2 #设置请求数
nnn=requests.get(url="http://icanhazip.com/",timeout=8,proxies={"http":thisProxy}).text
#通过代理IP发出连接请求
return_info=nnn.strip()
#网站返回具体信息(IP),此处有坑!ICANHAZIP网站返回的信息除了IP,还会多一行空行,需要strip()函数去除空行
print(return_info)
if proxy_ip == return_info:
#用代理IP(不含PORT)和返回的IP做比较,一致为有效,否则为无效
print("代理IP:'" + thisProxy + "'有效!")
else:
print("代理IP无效!")
执行结果如下:
写法二:
代理IP来源:某收费代理
数据格式:JSON格式
每次提取数量:随机提取1个
代码如下:
def confirm(self):
url = "http://XXX.XXXXX.XXXXXX.com/proxy/api/get_ip_bs?appKey=14737f96f82b4f4b94c0876f0f922262&count=1&expiryDate=0&format=1&newLine=2"
r = requests.get(url)
print(r.text)
proxy_ip = r.json()['msg'][0]['ip']
print(proxy_ip)
proxy_port = r.json()['msg'][0]['port']
thisProxy = "http://" + proxy_ip + ':'+ str(proxy_port)
print(thisProxy)
requests.adapters.DEFAULT_RETRIES = 3
nnn=requests.get(url="http://icanhazip.com/",timeout=8,proxies={"http":thisProxy}).text
return_info=nnn.strip()
print(return_info)
if proxy_ip == return_info:
print("代理IP:'" + thisProxy + "'有效!")
else:
print("代理IP无效!")
为了查看每步代码的正确性,多处使用print()打印结果,代码也未优化,只提供了思路,实际使用可以自行调整优化,希望能给大家带来帮助。