上周有个做市场研究的朋友丢来一段脚本,说跑到第 200 条左右就崩,报错是 InvalidSchema。我让他把代理那行贴出来,果然写成了 socks://203.0.113.10:1080——requests 只认 socks5:// 和 socks5h://,少一个 5 就直接抛异常。这种坑不大,但足以让人卡一下午。索性把 socks5 代理 ip 怎么用这件事,按浏览器、脚本、客户端三条路径拆开走一遍。
先把 socks5 这三个字弄明白
SOCKS5 是一个转发的协议,它不太管你上面跑的是什么——HTTP 请求、WebSocket、数据库连接、甚至自己定义的 TCP 协议,它都能照单转发。这就是它被很多采集脚本偏爱的原因:换成 HTTP 代理,只认 HTTP/HTTPS,走点别的就掉链子。
它比 HTTP 代理多出来的几样东西,实际用起来很值:
一是账号密码认证。socks5://用户名:密码@IP:端口 这种串法,代理服务端会让你先过一道验证,适合团队共用一个出口池子的场景。
二是 UDP 转发。有些图形化采集工具或抓包工具用的是 UDP,HTTP 代理直接不认。
三是可以让代理服务器帮你解析域名,也就是常说的 socks5h 里的那个 h,后面脚本那段会详细说。
也不是所有活儿都得用它。你只抓网页、只发 GET 请求、对速度更敏感,HTTP 代理反而更轻快。判断标准很简单:跑的东西是不是纯网页请求,是不是需要 UDP,是不是需要账号认证。前两个都"是",那就老老实实 socks5。
三条路先看个全景
接入这件事说穿了就三件事:把地址端口告诉工具、把账号密码带上、验证一下真的走了代理。区别只在于"告诉"的方式——浏览器得靠启动参数,脚本里就是一行字符串,客户端则是一个下拉框。
下面按使用频率从低到高排,浏览器放最前面,因为它最适合拿来验收 IP,不适合当主力。
方式一:浏览器里怎么接
先说个容易踩的:Chrome 和 Edge 的设置页面里,压根没有 SOCKS5 的输入框。Windows 系统里那个"手动设置代理"只接受 HTTP/HTTPS,你把 socks5:// 填进去,浏览器会拿它当 HTTP 代理去连,结果就是一直转圈,等半天给你一个连接失败。
能用的办法是启动参数。把下面这段存成批处理文件,双击运行,就是一个独立的、走代理的浏览器窗口:
"C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--proxy-server="socks5://203.0.113.10:1080" ^
--user-data-dir="C:\tmp\socks-profile"
第二行那个 --user-data-dir 别省。它会单独开一个配置目录,书签、登录态、系统代理设置都跟日常窗口隔开,关掉这个窗口,你平时上网一点没变。很多人图省事不加,结果代理参数被记进了主配置,回头发现日常浏览也走代理了,还得手动清。
账号密码这块说句实话:命令行里直接拼 socks5://user:pass@IP:端口,Chrome 大概率不认,要么弹一个认证框,要么静悄悄连不上。所以先用 curl 测一下这条代理到底要不要密码(命令在下一节),两条路分开处理更省心。
Firefox 是个例外,它自带 SOCKS5 的填写位:设置 → 网络设置 → 手动配置代理,SOCKS 主机填 IP,端口填 1080,下面选 SOCKS v5,最后把"使用 SOCKS v5 时代理 DNS 查询"勾上。这个勾很关键——不勾的话域名还在本地解析,代理服务器只拿到一个 IP,遇到按域名做限制的站点就白配了。
配完怎么验?随便打开一个能显示当前访问来源地址的查询页,看看显示的是不是你填的那条 IP;再打开一个本地页面,确认原来的环境没被带歪。两分钟的事,养成习惯。
方式二:脚本里接入,这才是主力
脚本接入的好处是可控:超时设几秒、失败重试几次、什么时候换 IP,全在自己手里。Python 这边先把依赖装上:
pip install requests pysocks
不装 pysocks,requests 是认不得 socks 协议的,会直接给你抛那个烦人的 InvalidSchema。
import requests
user = "你的账号"
pwd = "你的密码"
host = "203.0.113.10"
port = "1080"
# 注意是 socks5h,不是 socks5
proxy = f"socks5h://{user}:{pwd}@{host}:{port}"
proxies = {"http": proxy, "https": proxy}
session = requests.Session()
session.proxies = proxies
resp = session.get("https://example.com/", timeout=8)
print(resp.status_code, len(resp.text))
socks5h 和 socks5 差一个字母,效果差挺远。socks5h 会把域名原样交给代理服务器去解析,本机不查 DNS;socks5 是本机先解析成 IP 再连。做公开数据采集的时候,前者更稳——本地网络环境有问题、DNS 被劫持、或者解析出的 IP 跟实际要访问的地址对不上,都会表现为"代理明明通着却一直超时"。
不想写 Python 的,一条 curl 也能验:
curl -x "socks5h://你的账号:你的密码@203.0.113.10:1080" ^
-m 8 -s -o /dev/null -w "%{http_code}\n" https://example.com/
返回 200 就是通了,返回 000 基本是连不上或超时,返回 407 就是账号密码不对。别小看这一步,先确认代理本身是好的,再去调业务代码,能省掉一大半"到底是谁的问题"的扯皮。
短效动态 IP 有个特点要记牢:它有有效期。有人习惯任务开头取一条 IP 存变量里,然后跑两小时的长任务,后半段全在超时——不是代理坏了,是那条 IP 早就到期了。正确的做法是每一批任务开始前取,或者按条数取,每条 IP 的存活时长以你账号里标注的为准。
如果不想自己维护 IP 调度,神龙HTTP 的提取接口可以把这件事省掉:接口直接返回可用的 IP 和端口,请求时带上协议参数就能拿到 socks5 格式的串,代码里拼一下就成。他们的 API 兼容主流爬虫语言,文档里有现成的示例代码,接进去大概十几行的事。另外个人中心里有可视化的用量统计和实时监控,跑批量任务的时候能直接看到哪一段失败率高、哪几条 IP 反复超时,比在日志里翻半天强。
方式三:图形客户端里填
手里用的是采集软件、数据库客户端或者抓包工具,那就不用写代码,找"代理设置"或者"网络设置"那一栏,类型下拉选 SOCKS5,主机填 IP,端口填数字,账号密码各一栏,有个"测试连接"按钮的话先点一下。
这一步最容易出的是四个错:
类型选错了。填的是 socks5 的端口,下拉框却停在 HTTP 上,连过去当然不通。
端口串号了。同一台代理服务器,HTTP 端口和 SOCKS5 端口经常不是一个数字,从别处复制过来时容易只改一半。
密码里有特殊字符。带 @、#、: 的密码,在 URL 串里要做转义,@ 写成 %40,: 写成 %3A;如果是分成几个输入框填的,就不用管这个。
漏填端口。有些工具端口框留空时默认 1080,但服务端给的并不是 1080,填完整最保险。
三条路横向比一下
| 接入方式 | 上手难度 | 账号密码 | 域名解析 | 适合场景 |
|---|---|---|---|---|
| 浏览器(启动参数 / 内置设置) | 低 | 需借助扩展 | Firefox 可开启 | 验收 IP、检查页面渲染 |
| 脚本(Python / curl) | 中 | 原生支持 | socks5h 可指定 | 长期采集、定时任务 |
| 图形客户端 / 工具 | 低 | 支持 | 看工具实现 | 可视化采集、数据库连接 |
再说句掏心窝的建议:别一上来就写代码。先用 curl 确认这条 socks5 是活的,再进脚本调逻辑,最后由脚本转成客户端配置。顺序反了,出错时你要同时怀疑代理、怀疑代码、怀疑工具,排查成本翻三倍。
连不上,按这个顺序查
第一看返回码。407 是认证问题,账号密码错了、或者这条 IP 需要加白名单;000 或者连接被拒,八成是端口或地址写错,也有可能是本地网络根本出不去。
第二看解析。明明能连上但一直超时,把 socks5 改成 socks5h 试一次,很多"玄学超时"就是这么好的。工具里如果有"远程解析 DNS"之类的勾选项,勾上。
第三看 IP 生命周期。短效动态 IP 过了有效期,表现就跟断网一模一样。回头看看这次任务是几点开始跑的,跑了多久,中间有没有换过 IP。
第四看并发。同一个账号同时开太多线程,超出的部分会排队或者直接失败,日志里往往表现为"随机几条失败"。把并发数调低一半再试,如果失败率立刻归零,那就是并发压满了。神龙HTTP 支撑高并发提取,但具体能开多少还是看你账号里那条线,用量统计页上的并发曲线比猜准。
常见问题
Q:socks5 和 socks5h 到底选哪个?
默认用 socks5h。它让代理服务器去解析域名,本机不查 DNS,避免解析结果跟代理侧对不上导致的超时,也能少一次本地 DNS 查询。只有当你明确希望在本机完成解析时才用 socks5。
Q:浏览器里填了 socks5 地址,为什么一直转圈打不开页面?
先确认是不是填在了系统代理的设置里。Windows 的"手动设置代理"只认 HTTP/HTTPS,把 socks5 地址填那儿,浏览器会当 HTTP 代理去连。改用启动参数 --proxy-server="socks5://IP:端口",或者换成自带 SOCKS5 设置项的浏览器。
Q:脚本能跑通,但跑一阵就开始大量超时,是代理质量不行吗?
先别急着下结论。看一眼超时时间设了多少,8 到 10 秒比较合适,低于 5 秒容易误杀;再看 IP 是不是过期了;最后看并发有没有压满。这三条排完还不行,再去比对是不是特定目标站点的问题。神龙HTTP 这边可用率标称 99.9%,正常不会出现大段连续失败。
Q:同一套账号密码,能不能同时在浏览器和脚本里用?
技术上是同一份凭证,能填。但要注意并发上限是按账号算的,浏览器开着占一条,脚本里再开二十条,加起来可能就顶到线了。稳妥的做法是浏览器那条只在验收时短暂用一下,验完关掉,把额度留给正式任务。






