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
相关产品推荐
相关产品推荐

