快速回答
代理中的502 Bad Gateway是什么意思?
502 Bad Gateway 表示链中的某个网关或代理未从下游服务器获得有效响应或无响应。通过 CrawlRelay 住宅代理,502 通常表示出口连接或目标在请求中途失败。更换连接重试一次。若单一网站持续 502,是网站问题;若多网站都出现,则检查你的设置。
502 Bad Gateway一览
| 错误 | 502 Bad Gateway |
|---|---|
| 类型 | HTTP 状态码(5xx,服务器错误) |
| 发送方 | 代理网关或目标前面的反向代理 |
| 定义于 | RFC 9110, section 15.6.3 |
| 要重试吗? | 是的,在新连接或新会话时 |
| 先检查 | 在新 IP 上重试一次;若仍存在,尝试无代理直连目标 |
502 Bad Gateway是什么意思?
RFC 9110 描述 502 表示网关发现后端服务器响应异常。抓取链中至少有两个网关:代理和网站前经常存在的 CDN 或负载均衡器。任何一个都可能产生 502,且响应体通常会告诉你具体是哪一个。
住宅网络多出一环,出口是真实家庭连接,设备可能在请求中断开。此时网关无效数据返回。
在Python、curl、Node.js和浏览器中a 502是什么样?
每个工具中相同的失败会有不同的提示信息。请在日志中搜索以下信息:
- Python requests:
status_code == 502,HTTPS 目标用ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 502 Bad Gateway')) - curl:
curl: (56) CONNECT tunnel failed, response 502 - 浏览器: HTTPS 页面返回
net::ERR_TUNNEL_CONNECTION_FAILED,HTTP 页面是普通错误页 - Scrapy: 502 默认重试,因 502 包含于
RETRY_HTTP_CODES
导致a 502的原因是什么?
最可能的首要原因:
- 请求期间出口退出连接池, 住宅网络常见。
- 目标关闭连接、崩溃或返回格式错误数据。
- 目标的 CDN 连接其源服务器失败。
- 出口处目标 DNS 解析失败, 如主机名拼写错误。
- 目标定位非常窄, 导致少数出口失败频繁重现。
如何一步步诊断a 502?
- 在新连接上重试请求。消失的单次 502 是出口中断所致。
- 查看响应体和头:CDN 错误页面会指出 CDN 名称;简短代理消息会指示网关。
- 用无代理的自身网络测试目标。
- 扩大定位范围(城市到国家),对比失败率。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL如何修复a 502?
- 用新会话 ID 重试或不带会话 ID,请求改通过其他出口。
- 设定合理超时, 使死连接迅速失败而非挂起。
- 记录各主机的 502, 若率激增暂停访问,说明目标可能故障。
import random
import time
import requests
PROXY = "http://USERNAME:[email protected]:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}
def fetch(url, attempts=5, timeout=(10, 30)):
for attempt in range(attempts):
try:
r = requests.get(url, proxies=PROXIES, timeout=timeout)
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
r = None # dropped exit, reset or timeout: a new connection gets a new exit
if r is not None and r.status_code not in RETRY_STATUSES:
return r
retry_after = r.headers.get("Retry-After", "") if r is not None else ""
if retry_after.isdigit():
wait = int(retry_after)
else:
wait = min(60, 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))遇到a 502后要重试吗?
是的,502 应该重试,但需更换出口并有限制。两到三次短暂退避重试足够。多出口反复 502 一般是目标故障,再多重试无益。按主机跟踪失败率,避免单一站点填满重试队列。
502 Bad Gateway如何应用于CrawlRelay?
使用 CrawlRelay 时,丢弃或生成新会话 ID,通常会使用不同住宅 IP 出口。粘性会话绑定特定出口,粘性会话中遇到 502 应结束该会话,代码中应实现。 会话指南 讲解如何干净地轮换会话。
网关:gw.crawlrelay.com,端口7777(通过CONNECT的HTTP、HTTPS)和端口7778(SOCKS5)。用户名格式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。相关内容:504 Gateway Timeout · Connection reset · 503 Service Unavailable。
502 Bad Gateway:开发者常问的问题
502是代理的问题还是网站的问题?
两者皆有可能。查看响应体:CDN错误页面会显示CDN名称,指向网站。如果每个尝试的网站都出现502,说明是代理或你的设置问题;如果仅某个网站出现502,则是该网站的问题。无代理测试同一URL以确保。
为什么502错误在住宅代理中更常见?
住宅出口是实际家庭连接,设备可能离线、更换网络或信号中断。请求进行中时发生这类情况,会返回502或重置。良好的爬虫应将此视为正常,并在新出口重试,且重试次数有限。
为了减少502错误,我应该切换到粘性会话吗?
不行。粘性会话将你固定在一个出口,如果该出口失败,该会话中所有请求也都会失败。独立页面使用轮换连接,多步骤流程才用粘性会话。遇到502后结束粘性会话并重新开始。
本参考中的其他代理错误
HTTP 状态码
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
浏览器和客户端错误
连接和 TLS 错误
带有涵盖失败案例文档的住宅代理
来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。