如何用Python Requests快速测试SOCKS代理?脚本检测无效排查
一、原代码的核心问题
你的代码存在几个关键问题,导致SOCKS代理验证失效:
- SOCKS协议前缀缺失:requests库默认仅支持HTTP/HTTPS代理,SOCKS代理必须明确指定协议前缀(
socks4://或socks5://)。你代码里用http://前缀,requests会把SOCKS代理当成HTTP代理处理,自然无法生效。 - 缺少SOCKS依赖:requests本身不包含SOCKS代理处理模块,必须安装
requests[socks]扩展包才能支持SOCKS协议。 - 异常处理不全:仅捕获
ProxyError,但请求过程中还可能出现超时、连接失败、页面解析错误等异常,这些情况会直接跳过测试,无法排查具体原因。 - 页面解析容错性差:如果目标页面结构变化,
soup.find()会返回None,后续调用find()会抛出AttributeError,导致有效代理也被误判为无效。
二、改进后的验证代码
首先安装依赖:
pip install requests[socks] beautifulsoup4
修改后的脚本(适配SOCKS代理,增加容错性):
import requests import time from bs4 import BeautifulSoup # 读取代理列表,若原文件仅存ip:port格式,需手动添加socks4:///socks5://前缀 proxies_list = [] with open('../proxies.txt', 'r') as proxies_file: proxies_list = [line.rstrip() for line in proxies_file if line.strip()] headers = { "User-Agent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" } counter = 0 test_count = min(10, len(proxies_list)) # 先测试前10个,快速验证 for proxy in proxies_list[:test_count]: # 校验代理协议前缀 if not proxy.startswith(('socks4://', 'socks5://')): print(f"代理 {proxy} 缺少SOCKS协议前缀,跳过") continue proxies = { "http": proxy, "https": proxy, } try: print(f"正在测试代理: {proxy}") # 设置超时,避免长时间阻塞 page = requests.get( url='https://ipaddress.my/', proxies=proxies, headers=headers, timeout=10 ) page.raise_for_status() # 检查HTTP状态码是否正常 # 容错式解析IP soup = BeautifulSoup(page.content, 'html.parser') ip_ul = soup.find("ul", {"class": "list-inline text-center"}) if not ip_ul: print(f"页面结构变化,无法解析IP: {proxy}") continue ip_li = ip_ul.find("li", recursive=False) if not ip_li: print(f"页面结构变化,无法解析IP: {proxy}") continue detected_ip_span = ip_li.find("span", recursive=False) if not detected_ip_span: print(f"页面结构变化,无法解析IP: {proxy}") continue detected_ip = detected_ip_span.text.strip() # 提取代理中的纯IP部分 proxy_ip = proxy.split('://')[1].split(':')[0] if detected_ip == proxy_ip: counter += 1 print(f"代理 {proxy} 验证成功,当前IP: {detected_ip}") else: print(f"代理 {proxy} 未生效,当前IP: {detected_ip}") time.sleep(2) except requests.exceptions.ProxyError: print(f"代理 {proxy} 连接失败(ProxyError)") except requests.exceptions.Timeout: print(f"代理 {proxy} 请求超时") except requests.exceptions.HTTPError as e: print(f"代理 {proxy} 返回错误状态码: {e}") except AttributeError: print(f"代理 {proxy} 页面解析失败") except Exception as e: print(f"代理 {proxy} 测试出错: {str(e)}") print(f"\n总计验证成功 {counter} 个代理")
三、代理本身的可能性
如果修改代码后仍验证失败,大概率是代理本身的问题:
- 免费Elite代理存活率极低:公开免费代理列表中,大部分已失效、被封禁,或需要用户名密码认证(你的代码未处理认证逻辑)。
- 代理被目标网站屏蔽:部分代理可能被
ipaddress.my这类IP检测网站列入黑名单,导致请求被拦截。 - 网络环境限制:你的本地网络可能无法连接海外代理,或代理服务器本身网络不稳定。
内容的提问来源于stack exchange,提问作者Tomek
相关产品推荐
相关产品推荐

