凌晨两点,脚本卡在第一步
跑采集的都有过这种时刻:任务挂着,日志里一行行往下刷,突然蹦出一句“获取IP失败”,后面全跟红。第一反应一般是“服务商挂了”,然后去群里问、准备换一家。
但真正排查下来,十次里有八九次不是对方的问题——请求里某个参数名拼错了一个字母,机器出口地址变了没进白名单,或者额度早就用完了只是没人点开那个后台页面看一眼。
这篇就把这三类原因摊开讲。顺序是:先看报错 → 再查出口IP → 最后看用量,不用懂太多底层原理,照着对一遍基本能定位。
第一步:别猜,先看返回的到底是什么
很多人一看到失败就去改代码,其实最该做的是把原始返回打印出来。提取接口失败几乎不会“一声不吭”,它通常给你三种东西之一:一个 HTTP 状态码、一段带错误字段的 JSON、或者干脆一个空数组 []。
| 你看到的现象 | 大概率是 | 去哪儿确认 |
|---|---|---|
| 返回 401 / 403 | 白名单没加,或密钥没复制全 | 后台白名单列表 + 密钥完整值 |
| 返回 429 或提示频率超限 | 提取太急,被限流 | 文档里的并发与频率说明 |
| 返回空数组 [] | 额度用完,或数量参数写成 0 | 个人中心的用量统计 |
| 一直转圈、连接超时 | 本机网络问题,或接口地址写错 | 核对域名、端口、协议头 |
| 一串看不懂的报错文本 | 参数名拼错、编码不对 | 拿文档示例代码原样跑一次 |
这张表可以存下来。下次报错先对一眼,比在群里问一轮快得多,也不会把“额度用完”误判成“服务崩了”。
接口异常:多半是复制粘贴时留下的坑
接口调不通,最典型的情况是地址里少个斜杠、参数名大小写不一致,或者把 num 写成了 count。文档示例能跑通、自己写的跑不通,差别往往就在这几处。
我习惯的做法是:先把文档示例原封不动复制过来跑一次,确认通了,再一个参数一个参数改回去。哪一步断了,问题就在哪一步,比对着代码干瞪眼快。
还有几个高频的:
该用 POST 的地方写了 GET,参数塞在 URL 里,服务端读不到;提取数量填了 0 或者超过单次上限,直接返回空;请求头少了 Content-Type,参数解析不出来;本机开着别的代理工具,请求根本没走到你以为的地方;提取太密,一秒十几次,被限流了还以为是账号被封。
代码层面,别把“拿到响应”当成“拿到IP”。加一层判断,失败就退一步重试,比重跑整个任务划算得多:
import time, requests
def fetch_ips(api, retries=3):
for i in range(retries):
try:
r = requests.get(api, timeout=10)
if r.status_code != 200:
print("状态码异常:", r.status_code, r.text[:200])
time.sleep(2 ** i) # 1s, 2s, 4s 退避
continue
data = r.json()
ips = data.get("data") or []
if not ips:
print("返回为空,先查额度与白名单:", data)
return []
return ips
except Exception as e:
print("请求异常:", e)
time.sleep(2 ** i)
return []
ips = fetch_ips("你的提取链接")
print("本次拿到", len(ips), "个IP")
这段没什么花活,但把状态码异常、空返回、网络异常三种情况都拦住了,日志里一眼能看出断在哪一环。神龙HTTP 的接口对主流爬虫语言都做了兼容,文档里配了各语言的示例代码,拿来改比重头拼要省事不少。
白名单:换台机器就取不到,问题常在这
白名单绑的是发起请求那台机器的出口地址,不是你电脑的局域网 IP,也不是你脑子里以为的那个。所以“昨天还好好的,今天不行了”这种情况,八成是出口地址变了。
常见的变动来源有这么几个:家庭宽带重启光猫、路由器重新拨号,公网地址就换了;云服务器做了弹性 IP 的绑定或解绑;换了个办公网络,或者临时连了手机热点;本机同时开着别的代理工具,请求从另一条路出去;项目迁到了新机器上,白名单还留着老的那台。
确认方法很简单:在跑代码的那台机器上,用命令行查一下自己对外看到的地址,再和白名单里填的比一比。
# Linux / macOS
curl -s https://你的地址查询接口
# Windows PowerShell
(Invoke-WebRequest -Uri "你的地址查询接口").Content
两个数字不一样,把它加上就行。还有个容易忽略的点:白名单生效通常有几十秒到几分钟的延迟,改完立刻跑大概率还是失败,等一会儿再试一次。如果出口是多台机器共用一个网关,最好把整段地址都加进去,别只加单个。
额度:不是没有,是用完了没人告诉你
额度这块最隐蔽。它不一定弹一句“余额不足”,很多时候只是安静地返回空列表,脚本拿不到 IP,就以为接口挂了。
提取次数是第一个消耗点。有的套餐按“提取次数”计,不按 IP 个数算。你一次提 1 个 IP、调了 500 次,和一次提 500 个,消耗完全不是一回事。那行提取代码要是写在循环最内层,跑一晚上能烧掉不少。
并发上限是第二个。同时开太多线程去提取,超出部分直接被拒。这不是额度没了,是挤不进去,把并发压到文档写的数值以内就好。
密钥共用是第三个,也是最容易吵架的。几个项目、几个同事共用一个密钥,谁都觉得自己没用多少,加起来就超了。给每个项目单独分一个,出问题一眼能看出是谁。
神龙HTTP 的个人中心里有可视化的用量统计和实时监控,能看消耗趋势,也能识别异常调用。养成每周扫一眼的习惯,比月底发现额度见底要从容得多。
把排查固化成三步,别每次靠猜
上面这些零零散散,其实可以收成三个动作,顺序别乱。
先看返回体:状态码是多少、body 里写了什么,复制下来对表。再查出口地址:跑代码那台机器对外的地址,和白名单比一比。最后看用量:提取次数、并发、剩余额度,后台一页能看完。三步走完还没头绪,再带着这三项信息去找技术支持,对方也不用从头问你一遍。
日常再补两个小习惯:给提取失败单独打日志,别和业务日志混在一起;加个简单告警,连续失败超过几次就发条消息,别等任务跑完才发现一个 IP 都没拿到。
选服务的时候,把这几个问题先问清楚
有些坑在选服务时就能避开。比如白名单能不能加多段地址、生效要多久、额度计费是按次还是按量、超限会不会给明确的错误码——这些都属于能提前问清楚的事,问明白了,后面少熬几个夜。
神龙HTTP 这边,3000万+正规授权代理IP储备,可用率 99.9%、IP 纯度 99.8%,300+ 城市级定位,短效动态、长效静态、固定IP 几条产品线都有,HTTP/HTTPS/SOCKS5 都支持。接口对主流爬虫语言做了兼容,文档和示例代码齐全,后台的用量统计和实时监控能直接看到消耗与异常;真遇到卡住的地方,技术团队 7×24 小时在线。
常见问题
Q:接口返回 200,但 IP 列表是空的,是怎么回事?
优先查两处:一是额度是否用完,包括提取次数和并发有没有超限;二是白名单里有没有当前机器的出口地址。这两项都正常,再看请求参数里的提取数量是不是填了 0、或者超过了单次上限。
Q:昨天还能取,今天突然 403,代码一行没改。
九成是出口地址变了。宽带重新拨号、云主机弹性 IP 调整、换了办公网络都会造成这个结果。在跑代码的机器上查一下当前对外地址,和白名单一比就清楚了,加上之后等一两分钟再试。
Q:本地调试正常,部署到服务器就失败。
服务器是另一台机器,出口地址和你本地完全不同,白名单里没有它自然取不到。顺手再确认一下服务器上有没有别的代理配置,请求可能根本没走你以为的那条路。
Q:并发开高一点就大面积失败,是服务不行吗?
先翻文档里的并发上限。超过上限的请求会被直接拒掉,表现就是成片失败而不是变慢。把线程数压到上限以内,配合失败重试和退避间隔,稳定性会明显好很多。






