在搜索引擎上找到的免费代理IP网站,我们对其进行爬取之后,这些IP需要经过检测。因为免费代理IP的可用率是比较低的,因为它的开放性,所以需要经过这么一步才能将有用的IP筛选下来。
1、代理IP验证
由于免费的代理IP很多都是无法使用,或是不稳定,或是时效短。所以验证代理ip是否可用,就非常有必要。主要验证原理:使用代理ip去访问网页,判断是否能够正常访问。在此我选择的网站是“站长之家”,这个网站可用直接返回你当前使用的ip以及ip所在地。这里需要注意的是访问前可以设定连接超时的时间如果访问时间超过一定时间,就直接跳过这个代理ip。建议是设定在2秒内,具体的可以看以下函数:
def ip_test(ip_proxies):
"""
验证单个代理ip是否可用
:param ip_proxies: 待验证ip,例如:101.96.10.36:88
:return:
"""
url = "http://ip.chinaz.com/"
headers = {
"Host": "ip.chinaz.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Referer": "https://blog.csdn.net/Winterto1990/article/details/51220307",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Cache-Control": "max-age=0",
}
proxies = {"http": "http://" + ip_proxies, } # 设置代理
res = requests.get(url, headers=headers, proxies=proxies, timeout=1) # timeout为设定的相应时长,建议在2秒内
# 解析网页
soup = BeautifulSoup(res.text, "html.parser")
info_list = soup.find_all("p", {"class": "getlist pl10"})
for info in info_list:
is_local = info.get_text()
print(info.get_text())
return is_local.find("XXX.XXX.XXX.XXX") # 判断是否为本地的地址
2、批量验证代理IP
要批量的对代理IP进行验证,实际上这就是调用上一步中验证代理ip中的程序。具体程序如下:
def ip_batch_inspection(read_path, save_path):
"""
验证多个代理ip是否可用
:param read_path: 代理ip文件路径
:param save_path: 验证可用的代理ip保存路径
:return:
"""
with open(read_path, "r") as fr:
lines = fr.readlines()
fr.close()
count = 0
file_name = read_path.split("/")
print(file_name[-1] + "文件共有 " + str(len(lines)) + " 条数据")
for line in lines:
count += 1
ip_proxies = line.replace("\n", "")
try:
is_local = ip_test(ip_proxies) # 如果是本地ip,返回值为大于0数值
if is_local < 0:
with open(save_path, "a") as fs:
fs.write(ip_proxies + "\n")
except Exception as e:
pass
# print("ip不可用")
print("验证中......%.2f%%" % (count/len(lines)*100))
print("验证完毕")
完成以上2步之后,我们就完成了免费代理IP的使用前准备了,可以放到代理IP池,等到之后需要时候再调用。