[求助] 如何用 Python 批量测试 IP 代理是否可用

python 小白,爱好者 求教

用 shell 抓取到一组代理 IP 并另存为一个文本文件 xiciip.txt 中; 如:

183.129.153.122:36839
115.46.71.101:8123
222.191.233.74:36574
219.157.144.246:8118
121.31.163.225:8123
122.235.168.162:8118
119.31.210.170:7777
183.129.207.74:14823
116.62.134.173:9999
116.192.171.169:43928
115.46.77.208:8123
183.21.81.58:40539
120.92.74.237:3128
27.37.46.202:9000
120.92.74.189:3128

shell 没找到方法来测试确认代理 IP 是否可用,网上找一些 python 方法;

但网上的例子都是指定一个代理 IP 去测试;

我想用 python 按行读取代理 IP 与端口,然后用 for 循环逐行批量测试 ip 是否可用;

import requests

f = open(“xiciip.txt”)

line = f.readline() #读取一行, for line in f : try: requests.get(‘http://bing.com/’, proxies = {“http”:“http://120.92.74.189:3128”} ) #这样是成功的,120.92.74.189:3128 可用 #我想把 120.92.74.189:3128 用 line 变量来替换,多次测试没成功; except: print ( “connect failed” ) else: print ( “success” )

请高手指定一下,如何在 proxies = 后面加入 line 变量,我不知道哪里出问题了

尝试 1 把{}中的内容 做成一个变量

proxy = '"http":"http://'+line[:-1]+'"' #不知这样定义有无问题,对 shell 和 python 的符号使用很感冒
requests.get('http://bing.com/', proxies = {proxy} )

但不成功返回全是 failed

尝试 2

把 proxies = {"http":"http://120.92.74.189:3128"} 全定义为变量字符串

请大家帮助指教一下

如何引入变量 line "http":"http://120.92.74.189:3128"

解释一下这句语法意思,为什么会多个双引号,还有冒号的 proxies = {"http":"http://120.92.74.189:3128"}

谢谢!


[求助] 如何用 Python 批量测试 IP 代理是否可用

13 回复

line = ‘http://’ + line

requests.get(‘http://bing.com/’, proxies = {“http”:line}

另外,使用多线程效率会大大提升


import requests
import concurrent.futures
from typing import List, Dict
import time

def test_proxy(proxy: str, timeout: int = 5) -> Dict:
    """
    测试单个代理是否可用
    :param proxy: 代理地址,格式如 "http://1.2.3.4:8080"
    :param timeout: 超时时间(秒)
    :return: 包含测试结果的字典
    """
    proxies = {
        "http": proxy,
        "https": proxy
    }
    
    test_urls = [
        "http://httpbin.org/ip",  # 返回请求IP
        "https://httpbin.org/ip"
    ]
    
    result = {
        "proxy": proxy,
        "valid": False,
        "response_time": None,
        "error": None,
        "actual_ip": None
    }
    
    try:
        start_time = time.time()
        
        # 测试HTTP和HTTPS
        for url in test_urls:
            try:
                response = requests.get(
                    url, 
                    proxies=proxies, 
                    timeout=timeout,
                    headers={"User-Agent": "Mozilla/5.0"}
                )
                
                if response.status_code == 200:
                    data = response.json()
                    result["actual_ip"] = data.get("origin", "Unknown")
                    result["valid"] = True
                    break  # 只要一个成功就认为可用
                    
            except requests.exceptions.Timeout:
                result["error"] = "连接超时"
                continue
            except requests.exceptions.ProxyError:
                result["error"] = "代理错误"
                continue
            except Exception as e:
                result["error"] = str(e)
                continue
                
        result["response_time"] = round(time.time() - start_time, 2)
        
    except Exception as e:
        result["error"] = str(e)
    
    return result

def batch_test_proxies(proxy_list: List[str], max_workers: int = 10) -> List[Dict]:
    """
    批量测试代理
    :param proxy_list: 代理列表
    :param max_workers: 最大并发数
    :return: 测试结果列表
    """
    results = []
    
    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 future in concurrent.futures.as_completed(future_to_proxy):
            try:
                result = future.result()
                results.append(result)
            except Exception as e:
                results.append({
                    "proxy": future_to_proxy[future],
                    "valid": False,
                    "error": str(e)
                })
    
    return results

def save_results(results: List[Dict], filename: str = "proxy_test_results.txt"):
    """保存测试结果到文件"""
    with open(filename, "w", encoding="utf-8") as f:
        valid_count = 0
        total_count = len(results)
        
        f.write(f"代理测试报告 - 总计: {total_count}个\n")
        f.write("=" * 50 + "\n\n")
        
        for result in results:
            status = "✓ 可用" if result["valid"] else "✗ 不可用"
            f.write(f"代理: {result['proxy']}\n")
            f.write(f"状态: {status}\n")
            
            if result["valid"]:
                valid_count += 1
                f.write(f"响应IP: {result['actual_ip']}\n")
                f.write(f"响应时间: {result['response_time']}秒\n")
            else:
                f.write(f"错误: {result.get('error', '未知错误')}\n")
            
            f.write("-" * 30 + "\n")
        
        f.write(f"\n总结: {valid_count}/{total_count} 个代理可用 ({valid_count/total_count*100:.1f}%)\n")

# 使用示例
if __name__ == "__main__":
    # 你的代理列表,格式:协议://IP:端口
    proxies_to_test = [
        "http://123.45.67.89:8080",
        "http://111.222.333.444:3128",
        "socks5://127.0.0.1:1080",
        "https://proxy.example.com:443"
    ]
    
    print("开始测试代理...")
    results = batch_test_proxies(proxies_to_test, max_workers=5)
    
    # 显示结果
    print("\n测试结果:")
    for result in results:
        if result["valid"]:
            print(f"✓ {result['proxy']} - 可用 ({result['response_time']}秒)")
        else:
            print(f"✗ {result['proxy']} - 失败: {result.get('error', '未知错误')}")
    
    # 保存结果
    save_results(results)
    print(f"\n详细结果已保存到 proxy_test_results.txt")

这个脚本的核心思路是:用requests库通过代理访问测试网站(httpbin.org),根据响应判断代理是否可用。主要特点:

  1. 支持HTTP/HTTPS/SOCKS代理:requests自动识别协议
  2. 并发测试:用ThreadPoolExecutor同时测试多个代理,提高效率
  3. 完整错误处理:捕获超时、代理错误等各种异常
  4. 返回详细信息:包括实际IP、响应时间、错误原因
  5. 结果保存:自动生成测试报告文件

使用很简单:把代理列表填到proxies_to_test里,运行就能看到哪些代理可用。测试网站可以换成你自己的目标网站,这样更准确。

建议用这个脚本定期检查代理池,及时剔除失效的代理。

proxies 是字典,你要循环的是字典

用 aiohttp

试试 print(’ “http:” ')输出的是什么就知道了

把冒号后面换成 line。另外要注意 line 有没有把换行符也一起读进来了。
在 Shell 里面用 curl 也可以测代理通不通啊。

xici 的我认为可以直接放弃了,不知道是不是技术原因 99%不能用。在 V2 翻到一个老帖子,推荐一下,感觉可用的很多。https://www.v2ex.com/t/438606

有古老工具可用

谢谢,各位的回复;

readline 会把每行最后的\n 读进来,把 line strip 一下

在网上找到一个多线程的方法,真接把 ip.txt 替换成我的, 但执行后没有反应,也没有生成文件

回到顶部