免费代理IP采集与筛选:Python自动化获取可用代理
玩爬虫、做数据采集、进行网络测试的时候,免费代理IP绝对是解决IP限流、被封禁问题的神器!但手动找代理、一个个验证有效性真的太费时间了,而且网上大部分免费代理都存在失效、延迟高、匿名性差的问题,踩坑率超高。今天就带大家用Python全自动采集+智能筛选+批量校验免费代理IP,一键搞定可用代理池,全程不用手动操作,新手也能直接跑通!
一、项目能干什么?
-
自动爬取国内主流免费代理站的HTTP/HTTPS代理IP
-
智能筛选:自动过滤失效、高延迟、低垃圾匿名代理
-
批量校验代理可用性,精准留下能直接用的存活代理
-
自动IP去重,避免重复代理浪费运行资源
-
输出标准格式代理,直接套用到爬虫、网络请求脚本中
二、简单环境配置
整个项目基于Python3开发,只需要安装三个必备第三方库,打开终端输入下面命令一键安装即可:
pip install requests lxml aiohttp
简单说下每个库的作用,不用深究,安装就完事:
-
requests:用来请求代理网站,抓取原始IP数据
-
lxml:解析网页源码,精准提取IP、端口、代理类型
-
aiohttp:异步批量校验代理,速度比同步快好几倍
三、代理IP自动采集模块
我们本次选用西刺代理、66免费代理两个国内稳定的免费代理平台,针对性适配爬取规则,自动抓取公开的代理数据。
采集逻辑超简单:模拟浏览器访问网站 → 获取网页源码 → 解析提取代理数据 → 初步过滤无效代理。
import requests
from lxml import etree
import re
# 模拟浏览器请求头,防止被网站直接拦截
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"
}
# 存放原始采集到的代理数据
proxy_list = []
# 1. 西刺代理采集(HTTP/HTTPS)
def crawl_xici_proxy():
url = "https://www.xicidaili.com/nn/"
try:
res = requests.get(url, headers=HEADERS, timeout=10)
res.encoding = "utf-8"
html = etree.HTML(res.text)
# 解析代理表格数据
tr_list = html.xpath("//table[@id='ip_list']//tr[position()>1]")
for tr in tr_list:
ip = tr.xpath("./td[2]/text()")[0].strip()
port = tr.xpath("./td[3]/text()")[0].strip()
proxy_type = tr.xpath("./td[6]/text()")[0].strip().upper()
# 只保留常用的HTTP/HTTPS代理
if proxy_type in ["HTTP", "HTTPS"]:
proxy_list.append({
"ip": ip,
"port": port,
"type": proxy_type,
"proxy": f"{ip}:{port}"
})
except Exception as e:
print(f"西刺代理采集失败:{str(e)}")
# 2. 66免费代理采集(www.66daili.com)
def crawl_66_proxy():
url = "http://www.66daili.com/"
try:
res = requests.get(url, headers=HEADERS, timeout=10)
res.encoding = "utf-8"
html = etree.HTML(res.text)
tr_list = html.xpath("//table//tr[position()>1]")
for tr in tr_list:
# 适配66代理网页表格字段规则
ip = tr.xpath("./td[1]/text()")[0].strip()
port = tr.xpath("./td[2]/text()")[0].strip()
proxy_type = tr.xpath("./td[4]/text()")[0].strip().upper()
if proxy_type in ["HTTP", "HTTPS"]:
proxy_list.append({
"ip": ip,
"port": port,
"type": proxy_type,
"proxy": f"{ip}:{port}"
})
except Exception as e:
print(f"66免费代理采集失败:{str(e)}")
# 批量采集 + 自动去重
def crawl_all_proxy():
crawl_xici_proxy()
crawl_66_proxy()
# 去除重复的代理IP,避免无效校验
unique_proxy = []
seen = set()
for proxy in proxy_list:
if proxy["proxy"] not in seen:
seen.add(proxy["proxy"])
unique_proxy.append(proxy)
print(f"采集完成,去重后原始代理数量:{len(unique_proxy)}")
return unique_proxy
四、代理筛选 + 可用性批量校验
刚采集下来的原始代理,大部分都是失效的、延迟超高的,根本没法直接用!这里我们用异步校验的方式,快速筛查出能用的代理,效率拉满。
筛选标准很实用:请求超时不超过5秒、接口请求成功、只保留正规HTTP/HTTPS代理。
import aiohttp
import asyncio
# 代理超时阈值,可自行调整
TIMEOUT = 5
# 存放最终可用的代理
usable_proxy = []
# 异步校验单个代理是否可用
async def check_proxy(session, proxy_info):
proxy = proxy_info["proxy"]
proxy_type = proxy_info["type"]
# 稳定的公共测试接口
test_url = "http://httpbin.org/get"
try:
# 通过代理发起请求,验证可用性
async with session.get(
url=test_url,
proxy=f"{proxy_type.lower()}://{proxy}",
timeout=aiohttp.ClientTimeout(total=TIMEOUT)
) as response:
if response.status == 200:
print(f"可用代理:{proxy}")
usable_proxy.append(proxy_info)
except Exception:
# 超时、连接失败、报错都直接判定为无效代理
pass
# 批量并发校验所有代理
async def batch_check_proxy(proxy_data):
# 限制并发数,防止电脑卡顿、被网站封禁
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=100)) as session:
tasks = [check_proxy(session, item) for item in proxy_data]
await asyncio.gather(*tasks)
return usable_proxy
# 统一筛选入口
def filter_usable_proxy():
raw_proxy = crawl_all_proxy()
asyncio.run(batch_check_proxy(raw_proxy))
print(f"\n筛选完成,可用代理数量:{len(usable_proxy)}")
return usable_proxy
五、完整可直接运行代码
给大家整合了全套代码,复制粘贴就能直接运行,一站式完成采集、去重、校验、筛选全过程:
import requests
from lxml import etree
import aiohttp
import asyncio
# 全局请求配置
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"
}
TIMEOUT = 5
proxy_list = []
usable_proxy = []
# 采集模块-西刺代理
def crawl_xici_proxy():
url = "https://www.xicidaili.com/nn/"
try:
res = requests.get(url, headers=HEADERS, timeout=10)
res.encoding = "utf-8"
html = etree.HTML(res.text)
tr_list = html.xpath("//table[@id='ip_list']//tr[position()>1]")
for tr in tr_list:
ip = tr.xpath("./td[2]/text()")[0].strip()
port = tr.xpath("./td[3]/text()")[0].strip()
proxy_type = tr.xpath("./td[6]/text()")[0].strip().upper()
if proxy_type in ["HTTP", "HTTPS"]:
proxy_list.append({
"ip": ip,
"port": port,
"type": proxy_type,
"proxy": f"{ip}:{port}"
})
except Exception as e:
print(f"西刺代理采集失败:{str(e)}")
# 采集模块-66免费代理
def crawl_66_proxy():
url = "http://www.66daili.com/"
try:
res = requests.get(url, headers=HEADERS, timeout=10)
res.encoding = "utf-8"
html = etree.HTML(res.text)
tr_list = html.xpath("//table//tr[position()>1]")
for tr in tr_list:
ip = tr.xpath("./td[1]/text()")[0].strip()
port = tr.xpath("./td[2]/text()")[0].strip()
proxy_type = tr.xpath("./td[4]/text()")[0].strip().upper()
if proxy_type in ["HTTP", "HTTPS"]:
proxy_list.append({
"ip": ip,
"port": port,
"type": proxy_type,
"proxy": f"{ip}:{port}"
})
except Exception as e:
print(f"66免费代理采集失败:{str(e)}")
# 采集+去重核心函数
def crawl_all_proxy():
crawl_xici_proxy()
crawl_66_proxy()
unique_proxy = []
seen = set()
for proxy in proxy_list:
if proxy["proxy"] not in seen:
seen.add(proxy["proxy"])
unique_proxy.append(proxy)
print(f"采集完成,去重后原始代理数量:{len(unique_proxy)}")
return unique_proxy
# 异步校验单个代理
async def check_proxy(session, proxy_info):
proxy = proxy_info["proxy"]
proxy_type = proxy_info["type"]
test_url = "http://httpbin.org/get"
try:
async with session.get(
url=test_url,
proxy=f"{proxy_type.lower()}://{proxy}",
timeout=aiohttp.ClientTimeout(total=TIMEOUT)
) as response:
if response.status == 200:
usable_proxy.append(proxy_info)
except Exception:
pass
# 批量校验所有代理
async def batch_check_proxy(proxy_data):
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=100)) as session:
tasks = [check_proxy(session, item) for item in proxy_data]
await asyncio.gather(*tasks)
# 主函数:获取最终可用代理列表
def get_usable_proxies():
raw_proxy = crawl_all_proxy()
if not raw_proxy:
print("未采集到任何代理IP!")
return []
asyncio.run(batch_check_proxy(raw_proxy))
print(f"\n✅ 筛选完成,可用代理总数:{len(usable_proxy)}")
# 输出纯代理字符串,直接即用
proxy_str_list = [item["proxy"] for item in usable_proxy]
print("可用代理列表:")
for p in proxy_str_list:
print(p)
return proxy_str_list
# 程序入口
if __name__ == "__main__":
get_usable_proxies()
六、超简单使用教程
1. 直接运行
直接运行整个脚本就行,程序会自动走完「采集→去重→校验→筛选」全部流程,最后直接打印出所有可用的 ip:port 格式代理。
2. 自定义参数微调
-
超时时间:默认5秒,想要极速代理可以改成3秒,想兼容慢速代理可以调到8秒
-
并发数量:电脑配置一般的话,把 limit 从100改成50,避免运行卡顿
-
新增代理源:照着现有代码格式,就能轻松添加其他免费代理网站的采集规则
3. 爬虫项目调用示例
脚本返回的代理列表可以直接用到你的爬虫代码里,随机取用超方便:
proxies_list = get_usable_proxies()
# 随机挑选一个代理使用
import random
if proxies_list:
proxy = random.choice(proxies_list)
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}"
}
res = requests.get("https://www.baidu.com", proxies=proxies, headers=HEADERS)
print(res.status_code)
七、进阶优化小技巧
1. 提升代理存活率
-
多站点校验:除了httpbin,新增百度等多个测试接口,避免单边可用的虚假代理
-
定时更新:设置定时任务,定期重新采集筛选,实时更新可用代理池
-
过滤低匿名代理:新增匿名等级判断,只保留高匿名代理,防止暴露本机真实IP
2. 解决采集被拦截问题
-
添加随机延时:采集网页时加1-3秒随机等待,避免访问频率太高被网站封禁IP
-
多源采集:多整合几个代理网站,增加采集基数,可用代理会更多
3. 代理持久化保存
可以把筛选好的可用代理保存到本地TXT文件,不用每次都重新采集校验,随取随用:
# 将可用代理保存到本地txt文件
def save_proxy_to_txt(proxies, path="usable_proxy.txt"):
with open(path, "w", encoding="utf-8") as f:
for p in proxies:
f.write(p + "\n")
print(f"代理已保存至 {path}")
八、温馨提示
-
免费代理的稳定性比较一般,只适合日常测试、轻量数据采集使用,商用场景建议选择付费代理池
-
部分免费代理会有地域限制、限速情况,批量使用前可以简单二次校验
-
请合规使用代理IP,仅用于合法网络操作,不要用于违规场景
更多推荐


所有评论(0)