首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用Python快速检测免费代理IP的可用性

用Python快速检测免费代理IP的可用性

原创
作者头像
永不掉线的小白
发布2026-01-09 15:23:55
发布2026-01-09 15:23:55
1540
举报

用Python快速检测免费代理IP的可用性,参见如下

代码语言:javascript
复制
import requests
import concurrent.futures
from datetime import datetime

def test_proxy(proxy, test_url="http://www.baidu.com", timeout=3):
    """
    测试单个代理IP是否可用
    proxy: 代理地址,格式如 'http://123.45.67.89:8080'
    test_url: 测试用的网址(可替换成需求的目标网站)
    timeout: 超时时间(秒)免费代理建议设置 timeout=3-5 秒
    """
    proxies = {
        "http": proxy,
        "https": proxy
    }
    
    try:
        start_time = datetime.now()
        response = requests.get(test_url, proxies=proxies, timeout=timeout)
        latency = (datetime.now() - start_time).total_seconds() * 1000  # 毫秒
        
        if response.status_code == 200:
            # 检查返回的IP是否确实是代理IP(验证匿名性)
            origin_ip = response.json().get("origin", "")
            proxy_ip = proxy.split("://")[1].split(":")[0]
            
            # 基本可用性检测
            is_working = True
            # 进阶:检查是否是透明代理(可选)
            # 如果服务端能看见你的真实IP,则为透明代理
            
            return {
                "proxy": proxy,
                "status": "✅ 可用",
                "latency_ms": round(latency, 2),
                "response_ip": origin_ip,
                "anonymous": proxy_ip in origin_ip if origin_ip else False
            }
        else:
            return {"proxy": proxy, "status": f"❌ HTTP {response.status_code}"}
            
    except requests.exceptions.ConnectTimeout:
        return {"proxy": proxy, "status": "❌ 连接超时"}
    except requests.exceptions.ReadTimeout:
        return {"proxy": proxy, "status": "❌ 读取超时"}
    except requests.exceptions.ProxyError:
        return {"proxy": proxy, "status": "❌ 代理错误"}
    except requests.exceptions.SSLError:
        return {"proxy": proxy, "status": "❌ SSL错误"}
    except Exception as e:
        return {"proxy": proxy, "status": f"❌ 错误: {type(e).__name__}"}

def batch_test_proxies(proxy_list, max_workers=20):
    """批量测试代理IP"""
    print(f"开始测试 {len(proxy_list)} 个代理...\n")
    
    available_proxies = []
    
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        # 提交所有任务
        future_to_proxy = {
            executor.submit(test_proxy, proxy): proxy 
            for proxy in proxy_list
        }
        
        # 收集结果
        for i, future in enumerate(concurrent.futures.as_completed(future_to_proxy), 1):
            result = future.result()
            
            # 显示进度和结果
            status_symbol = "✓" if "可用" in result.get("status", "") else "✗"
            print(f"[{i:03d}/{len(proxy_list):03d}] {status_symbol} {result['proxy']:30} {result.get('status', '')}")
            
            if "可用" in result.get("status", ""):
                available_proxies.append(result)
    
    # 输出统计信息
    print(f"\n{'='*50}")
    print(f"测试完成!")
    print(f"总计测试: {len(proxy_list)} 个")
    print(f"可用代理: {len(available_proxies)} 个")
    print(f"可用率: {len(available_proxies)/len(proxy_list)*100:.1f}%")
    
    # 按延迟排序并显示可用代理详情
    if available_proxies:
        print(f"\n可用代理列表(按延迟排序):")
        available_proxies.sort(key=lambda x: x.get("latency_ms", 9999))
        
        for i, proxy_info in enumerate(available_proxies[:10], 1):  # 显示前10个
            anon_status = "高匿" if not proxy_info["anonymous"] else "透明"
            print(f"{i:2}. {proxy_info['proxy']:25} "
                  f"延迟:{proxy_info['latency_ms']:6.1f}ms  "
                  f"匿名:{anon_status}")
    
    return available_proxies

# ==================== 使用示例 ====================
if __name__ == "__main__":
    # 示例代理列表(请替换为你的免费代理IP)获取免费代理
    free_proxies = [
        "http://103.152.112.162:80",
        "http://45.77.56.213:3128",
        "http://138.68.60.8:8080",
        "http://207.244.229.34:8080",
        "http://8.219.97.248:80",
        "http://47.88.11.3:8080",
        "http://20.210.113.32:80"
    ]
    
    # 执行批量测试
    working_proxies = batch_test_proxies(free_proxies, max_workers=10)
    
    # 可选:将可用代理保存到文件
    with open("working_proxies.txt", "w", encoding="utf-8") as f:
        for p in working_proxies:
            f.write(f"{p['proxy']}\n")
    print(f"\n可用代理已保存至 working_proxies.txt")

有的免费代理IP自带检测功能,也可以直接使用

核心功能说明:

  1. 单IP测试 (test_proxy函数):
    • 检查代理是否响应
    • 测量连接延迟
    • 验证匿名性(是否隐藏真实IP)
  2. 批量并发测试 (batch_test_proxies函数):
    • 使用线程池提高测试效率
    • 实时显示测试进度
    • 统计可用率并排序输出
  3. 实用特性
    • 详细的错误分类(超时、代理错误等)
    • 延迟测量(毫秒级)
    • 匿名性检测(高匿/透明)
    • 结果保存到文件

核心功能说明:

  1. 单IP测试 (test_proxy函数):
    • 检查代理是否响应
    • 测量连接延迟
    • 验证匿名性(是否隐藏真实IP)
  2. 批量并发测试 (batch_test_proxies函数):
    • 使用线程池提高测试效率
    • 实时显示测试进度
    • 统计可用率并排序输出
  3. 实用特性
    • 详细的错误分类(超时、代理错误等)
    • 延迟测量(毫秒级)
    • 匿名性检测(高匿/透明)
    • 结果保存到文件

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 有的免费代理IP自带检测功能,也可以直接使用
  • 核心功能说明:
  • 核心功能说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档