Python免费代理自动爬取+验证脚本 批量筛选可用代理
一、脚本功能介绍
平时写爬虫、做接口测试、临时换IP,基本都离不开免费代理。但说实话,网上找免费代理真的巨坑!随便搜的代理列表一大堆过期、失效、重复的假IP,手动一个个测速核验又累又慢,好不容易挑出来的IP,跑两行代码就挂掉,特别耽误干活。
所以我直接整理了这套全自动免费代理爬取+校验+筛选脚本,全程傻瓜式运行,不用手动干预。自动抓取公开代理资源、批量测速、剔除垃圾IP、自动去重,最后只给你留下能用的优质代理,日常测试、小规模爬虫使用完全够用。
给大家捋下这套脚本的核心亮点,实打实解决免费代理痛点:
-
双渠道多源爬取:优先用66代理免费API(不用解析网页,超稳不报错),搭配89IP网页数据源兜底,不愁没代理资源
-
全自动可用性校验:自动测速检测每一个代理,精准过滤超时、连不上的废IP
-
智能去重过滤:自动清理重复、无效代理,不用自己手动筛查
-
批量高效处理:一次性批量校验所有代理,速度快、效率拉满
-
自动存结果:跑完直接把可用代理保存到本地TXT,打开就能复制用
-
容错性超强:遇到链接失效、数据异常会自动跳过,脚本不会闪退崩溃
二、环境依赖安装
脚本基于Python3开发,只需要两个超常用的第三方库,终端执行下面命令,一键搞定安装,懒人直接冲!
pip install requests lxml
简单说下两个库的作用:
-
requests:核心请求工具,负责爬取代理、校验代理可用性
-
lxml:快速解析网页内容,精准提取IP和端口信息
三、完整可运行脚本代码
# -*- coding: utf-8 -*-
# 免费代理自动爬取+验证脚本 批量筛选可用代理
# 优化版:66代理免费API直取IP + 89IP网页抓取 双数据源 规避解析报错
import requests
import time
import random
# 全局配置
# 代理稳定性测试接口(实测稳定可访问)
TEST_URL = "http://httpbin.org/ip"
# 代理请求超时时间(秒,越小筛选代理速度越快、质量越高)
TIMEOUT = 5
# 数据源配置:优先使用66免费代理API(无需解析网页,零报错、超稳定)
# 66代理免费API:可自定义获取数量,直接返回 IP:PORT 文本格式
PROXY_API_SOURCES = [
"http://api.66daili.com/?format=json"
]
# 备用网页数据源(兜底补充)
PROXY_HTML_SOURCES = [
"https://www.89ip.cn/tqdl.html?num=100",
]
# 通用请求头,防基础反爬
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
def crawl_proxy_by_api() -> list:
"""
通过66免费代理API直接批量获取代理IP(无需网页解析,稳定零报错)
:return: 原始代理列表 [ip:port, ...]
"""
proxy_list = []
print("【开始通过66免费API抓取代理】")
for api_url in PROXY_API_SOURCES:
try:
res = requests.get(api_url, headers=HEADERS, timeout=10)
res.encoding = "utf-8"
# API直接返回每行一个IP:PORT,清洗空行、无效字符
raw_data = res.text.strip().split("\n")
for item in raw_data:
item = item.strip()
if item and ":" in item:
proxy_list.append(item)
print(f"【66代理API抓取完成】本次获取代理:{len(proxy_list)}个")
time.sleep(random.uniform(0.5, 1))
except Exception as e:
print(f"【66代理API抓取失败】错误:{str(e)}")
continue
return proxy_list
def crawl_proxy_by_html() -> list:
"""
备用:网页抓取兜底(仅89IP稳定站点,规避失效站点)
:return: 原始代理列表 [ip:port, ...]
"""
from lxml import etree
proxy_list = []
print("【开始抓取备用网页代理数据源】")
for url in PROXY_HTML_SOURCES:
try:
res = requests.get(url, headers=HEADERS, timeout=10)
res.encoding = "utf-8"
html = etree.HTML(res.text)
# 仅适配稳定89IP站点
ip_list = html.xpath('//div[@class="layui-card-body"]//tr/td[1]/text()')
port_list = html.xpath('//div[@class="layui-card-body"]//tr/td[2]/text()')
for ip, port in zip(ip_list, port_list):
proxy = f"{ip.strip()}:{port.strip()}"
proxy_list.append(proxy)
print(f"【{url}】 抓取完成,新增代理:{len(proxy_list)}个")
time.sleep(random.uniform(1, 2))
except Exception as e:
print(f"【{url}】 抓取失败,错误信息:{str(e)}")
continue
return proxy_list
def crawl_proxy() -> list:
"""
整合API+网页双渠道抓取,自动去重
:return: 去重后的原始代理列表
"""
# 优先API抓取,补充网页兜底
api_proxies = crawl_proxy_by_api()
html_proxies = crawl_proxy_by_html()
all_proxies = api_proxies + html_proxies
# 全局去重
all_proxies = list(set(all_proxies))
print(f"\n【全量抓取结束】API+网页合计去重代理:{len(all_proxies)}个\n")
return all_proxies
def verify_proxy(proxy: str) -> bool:
"""
校验单个代理可用性
:param proxy: 代理地址 ip:port
:return: 可用返回True,不可用返回False
"""
try:
# 兼容HTTP/HTTPS双协议
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}"
}
# 发送测试请求
res = requests.get(TEST_URL, proxies=proxies, timeout=TIMEOUT)
if res.status_code == 200:
print(f"✅ 可用代理:{proxy}")
return True
return False
except Exception:
print(f"❌ 失效代理:{proxy}")
return False
def batch_verify_proxy(proxy_list: list) -> list:
"""
批量校验代理可用性
:param proxy_list: 原始代理列表
:return: 可用代理列表
"""
usable_proxy = []
print("【开始批量验证代理可用性】")
for proxy in proxy_list:
if verify_proxy(proxy):
usable_proxy.append(proxy)
return usable_proxy
def save_proxy(usable_proxy: list):
"""
保存可用代理到本地文件
:param usable_proxy: 可用代理列表
"""
with open("usable_proxy.txt", "w", encoding="utf-8") as f:
for proxy in usable_proxy:
f.write(proxy + "\n")
print(f"\n【筛选完成】共获取可用代理:{len(usable_proxy)}个")
print("【结果保存】可用代理已保存至 usable_proxy.txt")
if __name__ == "__main__":
# 1. 双渠道抓取代理
raw_proxies = crawl_proxy()
if not raw_proxies:
print("未爬取到任何代理,程序结束!")
else:
# 2. 批量验证筛选
good_proxies = batch_verify_proxy(raw_proxies)
# 3. 保存结果
save_proxy(good_proxies)
四、脚本核心原理
1. 代理爬取逻辑
脚本采用API优先、网页兜底的组合玩法,完美避开传统爬虫的各种坑!之前网页解析容易报错、被反爬、抓不到数据,现在优先用66代理免费API,直接获取结构化代理数据,不用啃复杂网页源码,稳定又快速。再搭配89IP当做备用数据源,保证代理数量足够,最后自动全局去重,减少后续校验工作量。
2. 代理验证逻辑
我用的是 http://httpbin.org/ip 这个超稳定的公共接口当校验标准。给每个抓取到的代理配置请求规则,只要能在设定的超时时间内正常响应、状态码为200,就判定是可用好代理,超时或者报错的直接淘汰。大家可以自行修改超时时间,数值越小,筛选出来的代理网速越快、质量越高。
3. 结果处理逻辑
全部代理校验完成后,脚本会自动筛掉所有超时、失效、重复的垃圾IP,只保留能用的优质代理。最后自动写入本地 usable_proxy.txt,文件里一行一个IP:端口,格式干干净净,随拿随用,特别省心。
五、超简单使用教程
-
电脑提前装好Python3和上面两个依赖库;
-
复制全部代码,保存为
proxy_crawl.py文件; -
终端进入文件所在文件夹,运行命令:
python proxy_crawl.py; -
坐等脚本自动跑完,文件夹里会自动生成可用代理的TXT文件。
六、自定义微调优化
-
调整代理网速:修改
TIMEOUT变量,默认5秒,改成3秒就能筛出极速代理 -
自定义抓取数量:修改66代理API链接里的数量参数,自由控制单次抓取代理数
-
更换测试接口:如果默认接口不稳定,可换成百度、京东等公共稳定接口
-
提速翻倍:可搭配多线程运行,大批量代理校验速度直接拉满
-
新增数据源:找到靠谱免费代理站点,适配解析规则后即可加入脚本
七、避坑注意事项(重点)
-
免费代理时效性超级短,基本是临时可用,一定要随爬随用,别存放太久,大概率会过期失效
-
部分代理只支持单一HTTP/HTTPS协议,使用报错时,手动筛选适配协议即可
-
合规使用代理资源,别用来做爬虫攻击、违规访问等操作,遵守网络规范
-
实测66代理新版API偶尔会出现解析失败的情况,脚本已做好容错,会自动切换89IP兜底抓取,不影响整体运行
-
89IP数据源稳定性不错,能稳定抓取大量代理,作为主力兜底完全够用
-
66免费公开API无密钥、免费无限调用,完全满足日常测试、小规模爬虫需求
更多推荐



所有评论(0)