如何用Python检测代理类型(SOCKS4/SOCKS5)及异步筛选SOCKS5
异步检测代理类型并筛选SOCKS5代理
实现思路
针对收集到的IP:PORT格式代理列表,通过异步尝试不同类型的代理连接判断其支持的协议:
- 优先测试SOCKS5连接,成功则标记为SOCKS5
- 若SOCKS5失败,依次测试SOCKS4、HTTP
- 最终筛选出支持SOCKS5的代理
依赖安装
先安装所需异步网络库:
pip install aiohttp aiohttp_socks
完整代码实现
import asyncio from aiohttp import ClientSession, ClientError from aiohttp_socks import ProxyConnector, ProxyType async def check_proxy_type(proxy_addr: str) -> str | None: # 选用稳定的公开接口做连通性测试 test_url = "http://httpbin.org/ip" timeout = 10 # 设置超时,避免阻塞任务队列 # 按优先级尝试不同代理类型 for proxy_type in [ProxyType.SOCKS5, ProxyType.SOCKS4, ProxyType.HTTP]: try: host, port = proxy_addr.split(":") connector = ProxyConnector( proxy_type=proxy_type, host=host, port=int(port), verify_ssl=False ) async with ClientSession(connector=connector, timeout=timeout) as session: async with session.get(test_url): return proxy_type.name except (ClientError, asyncio.TimeoutError, ValueError): continue return None async def main(proxy_list: list[str]): tasks = [check_proxy_type(proxy) for proxy in proxy_list] results = await asyncio.gather(*tasks, return_exceptions=False) # 筛选SOCKS5代理 socks5_proxies = [proxy for proxy, res in zip(proxy_list, results) if res == "SOCKS5"] print("有效SOCKS5代理:") for proxy in socks5_proxies: print(proxy) return socks5_proxies if __name__ == "__main__": # 替换为你的实际代理列表 PROXIES = [ "123.45.67.89:1080", "98.76.54.32:1081", # ... 更多代理 ] asyncio.run(main(PROXIES))
代码说明
- 超时控制:10秒超时限制,避免单个代理测试拖慢整体任务
- 连接验证:通过访问
httpbin.org/ip确认代理连通性,无需解析返回内容 - 异常处理:捕获连接错误、超时、格式错误等异常,保证任务队列稳定运行
- 结果筛选:直接提取测试结果为
SOCKS5的代理,输出并返回
内容的提问来源于stack exchange,提问作者Silent Mind
相关产品推荐
相关产品推荐

