You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python代理检测脚本进度异常排查:进度条秒满未检测代理

问题排查与修复方案

核心问题分析

你的代码出现进度条直接跳至100%且未实际检测代理,主要有以下几个关键原因:


1. 代理文件读取异常(空列表导致进度条瞬间完成)

如果./proxies/目录下的txt文件为空、全是空行/注释,或者目录本身不存在、相对路径未找到文件,check_proxies函数中proxies列表会是空的,tqdm循环直接结束,进度条瞬间拉满。

修复:
添加文件与代理数量校验,在关键节点打印信息排查:

def get_files(dir_name):
    if not os.path.exists(dir_name):
        print(f"Error: Directory {dir_name} does not exist")
        return []
    files = []
    for file_name in os.listdir(dir_name):
        if file_name.endswith('.txt'):
            full_path = os.path.join(dir_name, file_name)
            files.append(full_path)
            print(f"Found proxy file: {full_path}")
    return files

def check_proxies(file_name, timeout, url, string):
    proxies = []
    with open(file_name) as f:
        for line in f:
            line = line.strip()
            if line:
                proxies.append(line)
    print(f"Loaded {len(proxies)} proxies from {file_name}")  # 打印代理数量
    # ... 后续代码不变

2. SOCKS代理测试逻辑完全错误

原SOCKS代理测试存在两个致命问题:

  • 连接目标URL的80端口,但测试的是HTTPS站点(默认443端口),无法获取有效内容;
  • 仅建立socket连接未发送HTTP请求,socket.recv(4096)拿不到页面内容,永远检测不到目标字符串;
  • 多线程下使用socks.setdefaultproxy全局设置,多个线程互相覆盖代理配置,导致测试混乱。

修复:
改用requests配合socks适配器(需先执行pip install requests[socks]),避免全局冲突并正确发送请求:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def test_proxy(proxy, timeout, url, string):
    try:
        if proxy.startswith(('http://', 'https://')):
            proxies = {"http": proxy, "https": proxy}
            r = requests.get(url, proxies=proxies, timeout=timeout)
            r.raise_for_status()
            if string in r.text:
                return 'http' if proxy.startswith('http://') else 'https'
        elif proxy.startswith('socks4://') or proxy.startswith('socks5://'):
            session = requests.Session()
            adapter = HTTPAdapter(max_retries=Retry(total=0, backoff_factor=0))
            session.mount('http://', adapter)
            session.mount('https://', adapter)
            session.proxies = {'http': proxy, 'https': proxy}
            r = session.get(url, timeout=timeout)
            r.raise_for_status()
            if string in r.text:
                return 'socks4' if proxy.startswith('socks4://') else 'socks5'
    except Exception as e:
        print(f"Proxy {proxy} failed: {str(e)}")  # 打印错误便于排查
        pass
    return None

3. 捕获所有异常导致错误被隐藏

原代码用except:捕获所有异常,包括代理格式错误、网络超时等,导致你无法知晓测试过程中的问题,误以为代理未被检测。

修复:
改为捕获具体异常或打印异常信息(如上修复代码所示),便于定位问题。


4. 多线程队列未正确终止(潜在问题)

worker函数的while True循环仅在拿到None时退出,但原代码未向队列添加终止信号,线程会一直阻塞在q.get(),无法正常退出。

修复:
在队列中添加与线程数相等的终止信号:

def check_proxies_multithreaded(file_names, timeout, url, string, num_threads=10):
    q = Queue()
    for file_name in file_names:
        q.put(file_name)
    # 添加终止信号
    for _ in range(num_threads):
        q.put(None)
    threads = []
    for i in range(num_threads):
        t = threading.Thread(target=worker, args=(q, timeout, url, string))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

额外优化建议

  • 测试URL改用国内可访问站点(如http://httpbin.org/get),避免因网络限制导致所有代理检测失败;
  • 调整超时时间为3-5秒,减少等待时长;
  • 增加代理格式校验(检查是否包含://和有效端口),减少无效测试。

内容的提问来源于stack exchange,提问作者Bawzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:02:07