玩爬虫、做数据采集、进行网络测试的时候,免费代理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,仅用于合法网络操作,不要用于违规场景

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐