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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:12:32