先认清一行代理信息长什么样
很多人第一次拿到代理,看到后台返回的一串字符直接发懵:http://user123:pwd456@123.45.67.89:8080,这到底哪段是地址、哪段是端口?其实拆开看特别简单,从左往右就四块东西。
协议在最前面,http、https、socks5 三种,填错协议会直接连不上。用户名和密码夹在 // 和 @ 之间,用冒号分开。@后面那一段冒号左边,就是代理地址,可能是一串 IP(比如 123.45.67.89),也可能是一个域名。最后冒号右边的数字,就是端口,常见的像 8080、3128、1080 这些。
如果你拿到的信息里没有 user:pass@ 这一段,只给了 123.45.67.89:8080,那说明走的是白名单鉴权,不是账号密码鉴权。这两种模式别混着用,混了必然报错。
再提醒一句:地址和端口是一对儿,必须成对使用。只抄了地址忘了端口,或者把别的批次的端口配到这台的地址上,表现出来就是"连不上",而且看不出原因。
地址和端口从哪里看,别自己猜
正确姿势是登录服务商的个人中心,在代理 IP 列表里直接看。神龙HTTP 的后台就是把这个信息摆在明面上的:每条 IP 记录后面跟着地址、端口、协议类型、有效期,还有一键复制的按钮,复制出来就是完整可用的那一串,不用自己拼接。
用 API 提取的,返回的通常是结构化的数据,字段名一般是 ip、port、expire_time 这种。写脚本的时候直接按字段取值,别用字符串截取,不然遇到域名型地址截出来的东西是错的。
这里有个特别容易踩的坑:短效动态 IP 换得很快,你记在记事本里的地址端口可能早就失效了。所以调试阶段务必每轮都重新提取一次,用最新那条去测。长效静态 IP 和固定 IP 代理相对稳定,地址端口在一段时间内不变,可以放心存进配置文件。
三种产品线在"地址端口稳不稳"这件事上的差别,用一张表看得更清楚:
| 类型 | 代理地址 | 端口 | 适合的用法 |
|---|---|---|---|
| 短效动态 IP | 每次提取都在变 | 随批次一起变 | 短周期、多批次的公开数据采集 |
| 长效静态 IP | 一段时间内不变 | 固定 | 需要连续跑几小时的采集任务 |
| 固定 IP 代理 | 长期不变 | 固定 | 要写死进配置文件的长期项目 |
鉴权信息核对:出问题八成在这
地址端口抄对了,还是连不上,那就去查鉴权。这里分两种情况。
账密模式。检查三点。第一,用户名密码有没有多空格,从聊天工具里复制经常带不可见字符。第二,密码里如果有 @、:、/、#、? 这些符号,写进 URL 时必须做百分号编码,@ 要写成 %40,否则解析器会把密码从中间切断,变成"用户名对了密码错了"。第三,大小写,很多后台生成的密码是大小写混排的,手动敲一遍就容易翻车。
白名单模式。这时候报错的典型表现是 407 认证失败,或者直接被拒绝。原因是你的请求是从本机发出的,而本机的公网出口 IP 没加进白名单。做法很简单:先查一下自己当前的出口 IP,把这个 IP 加到后台白名单里,再重试。注意公司网络、手机热点、家宽出口 IP 各不相同,换一个网络环境就要重新加一次。
还有一个隐蔽的问题:白名单和账密同时开启。有的服务商两者都支持,有的只认一种。翻一下后台说明,确认你当前这条 IP 走的是哪种,别自己脑补。
连通性自测:按顺序一步一步来
不要一上来就跑完整业务代码,那样报错信息全混在一起,根本不知道错在哪。按下面四步走,每步都是独立的小验证。
第一步,只看端口通不通。这一步不涉及账号密码,纯粹测网络能不能到达那个端口。
# Windows PowerShell
Test-NetConnection 123.45.67.89 -Port 8080
# macOS / Linux
nc -vz 123.45.67.89 8080
返回成功说明地址、端口、网络链路都没问题,问题在鉴权。返回拒绝或者超时,先回去核对地址端口有没有抄错,再确认这条 IP 是不是已经过期。
第二步,走代理发一次真实请求。用 curl 最省事,加上 -v 能看到完整的握手过程。
# 账密模式
curl -x http://user123:pwd456@123.45.67.89:8080 https://你的IP查询接口 -v
# 白名单模式,不写账密
curl -x http://123.45.67.89:8080 https://你的IP查询接口 -v
第三步,比对出口 IP。把上面请求的返回结果,和你本机的真实公网 IP 放在一起看。如果返回的 IP 跟本机不一样,而且正好是代理列表里那个地址,说明代理已经生效,配对了。如果返回的还是本机 IP,多半是代码里代理参数没真正传下去。
第四步,读报错码。把 -v 输出往上翻,找状态码。这一步能省掉大量瞎猜的时间。
Python 里怎么把这段写对
浏览器或 curl 通了,代码却不通,八成是参数写法的问题。requests 的写法要留意 http 和 https 两个键都得给,只写一个有时会绕过代理。
import requests
proxy = "http://user123:pwd456@123.45.67.89:8080"
proxies = {
"http": proxy,
"https": proxy,
}
resp = requests.get("https://你的IP查询接口", proxies=proxies, timeout=10)
print(resp.status_code, resp.text)
第一次跑建议把 timeout 设小一点,比如 10 秒。代理不通的时候它会一直卡着,不设超时会让你误以为是程序死循环。跑通之后再把超时和重试逻辑按实际需求调。
报错现象对照表,照着查就行
把常见的几种情况整理在一起,遇到问题直接对号入座,比重头排查快得多。
| 现象 | 大概率原因 | 怎么处理 |
|---|---|---|
| 407 需要认证 | 账密写错,或白名单没加当前出口 IP | 重新复制账密;把本机出口 IP 加入白名单 |
| 端口直接不通 | 地址或端口抄错,或 IP 已过期 | 回后台重新提取一条最新的 |
| 连接超时 | 本地网络到该节点链路不稳 | 换一个城市节点重试,或缩短超时时间 |
| 返回 502 | 代理侧上游临时异常 | 等几秒重新提取,或切到其他线路 |
| 返回的还是本机 IP | 代理参数没传进真实请求 | 检查代码里 proxies 是否同时写了 http 和 https |
做到这一步,地址、端口、鉴权、连通性四件事基本就闭环了。剩下的是选对产品线:如果只是偶尔跑一次公开数据采集,短效动态 IP 就够用,反正每次提取都是新的一批;如果任务要连跑好几个小时,中途换地址会让程序断掉,那就上长效静态 IP;要是配置文件写死了不方便改,固定 IP 代理最省心。
神龙HTTP 这边有几个现成的便利:后台按钮直接复制完整地址端口,不用手动拼;API 兼容主流爬虫编程语言,官方文档里带着可运行的示例代码,把上面的 curl 换成代码里的几行就行;个人中心还有可视化的用量统计和实时监控,能看出某条 IP 是不是一直在报错,异常的时候比对着日志翻要快得多。技术上卡住了,7×24 小时的技术支持也能接住。
常见问题
Q:代理地址能 ping 通,是不是就代表能用了?
不一定。ping 走的是 ICMP,代理服务开的是 TCP 端口,两件事互不相干。有些节点为了安全直接屏蔽了 ICMP,ping 不通但代理照样能用;反过来 ping 通、端口没开的情况也很常见。判断能不能用,认准端口连通测试加一次真实请求,别用 ping 下结论。
Q:报 407 到底是密码错还是白名单没加?
两种都可能。先把用户名密码原样复制粘贴一遍,注意别带多余空格,密码里的特殊符号做百分号编码;如果确认账密没问题,那就去看后台白名单里有没有你当前的公网出口 IP。最快的验证办法是切一下网络环境(比如从公司网切到手机热点),如果报错内容变了,基本就是白名单的问题。
Q:同一个账号,我在自己电脑上能用,换台机器就连不上?
多半是白名单模式在起作用。白名单绑的是出口 IP,不同机器的出口 IP 不一样,没加进去的自然被拒。把新机器的公网出口 IP 加进白名单就行,或者干脆切到账号密码鉴权,就不受这个限制了。
Q:提取出来的地址端口几分钟就失效,正常吗?
短效动态 IP 本身就是这个特性,有效期一到就换新的一批,这是正常的。如果你的业务流程来不及在有效期内跑完,别硬扛着重试,换成长效静态 IP 或固定 IP 代理更合适,地址端口在一段时间内保持不变,代码里也不用反复改写配置。






