提供免费代理 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