如何检测代理IP有效性?附代码

提供免费代理 IP 的网页有很多,但是经过测试会发现并不是所有的免费代理 IP 都是有效的,甚至更不是匿名IP(即获取远程访问用户的 IP 地址是代理服务器的 IP 地址,不是用户本地真实的 IP 地址)。所以要使用我们爬取下来的免费代理 IP,就需要对这个 IP 进行检测。

实现检测免费代理 IP 是否可用时,首先需要读取保存免费代理 IP 的文件,然后对代理 IP 进行遍历并使用免费的代理 IP 发送网络请求,而请求地址可以使用查询 IP 位置的网页。如果网络请求成功说明免费的代理 IP 可以使用,并且还会返回当前免费代理 IP 的匿名地址。代码如下:

# -*- coding: UTF-8 -*-

"""

import requests# 导入网络请求模块

import pandas as pd# 导入pandas模块

from lxml import etree# 导入HTML解析模块

ip_table = pd.read_excel("ip.xlsx")# 读取代理IP文件内容

ip_list = ip_table["ip"]# 获取代理IP信息

# 头部信息

headers = {

"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36"

}

# 循环遍历代理IP并通过代理发送网络请求

for ip in ip_list:

# 这里添加了http和https两个代理,这样写是因为有些网页采用 http协议,有的则采用https协议,

# 为了在这两类网页上都能顺利使用代理,所以一般都同时写上。当然,如果确定了某网页的请求类型,可以只写一种

proxies = {http: http://{ip}.format(ip=ip),

https: https://{ip}.format(ip=ip)}

try:

response = requests.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip%E5%9C%B0%E5%9D%80",

headers=headers, timeout=3, proxies=proxies)

if response.status_code == 200:# 判断是否请求成功,请求成功说明代理IP可用

response.encoding = "utf8"# 进行编码

html = etree.HTML(response.text)# 解析HTML

info = html.xpath(//*[@id="1"]/div[1]/div[1]/div[2]/table//tr/td//text())[1:]

info = " ".join(info).replace("\xa0", "").strip().replace("本机IP:", "本机IP: ")

print(info)# 输出当前IP匿名信息

except Exception as e:

# print(e)# 打印异常信息

pass