从独享代理翻车说起:旅游比价的代理困境
做旅游比价平台,最头疼的不是解析页面,而是让每个请求都“看起来”像来自真实用户。我们的爬虫需要同时查询携程、飞猪、Booking等多家OTA,并且必须从不同城市发起请求,否则拿到的价格可能不是目标地域的。最初我们选了价格不菲的独享代理,想着贵有贵的道理,结果跑了一周数据,现实狠狠打脸。
并发一上到50,超时率直接飙到30%,平均响应延迟超过200ms,最要命的是频繁被目标站识别为代理,返回验证码或直接拒绝连接。业务方投诉电话打到老板那里,老板拍桌子问:“钱花哪去了?”我一开始也以为是独享IP不够“干净”,后来对比日志才发现,问题出在HTTP代理的连接复用和IP轮换机制上——独享代理每次请求都新建TCP连接,在高并发下产生大量握手开销和TIME_WAIT状态,而且IP长时间不换,目标站的风控系统轻松标记。
这个坑我们踩了三次:第一次加大并发,被限流得更狠;第二次换成所谓“高匿代理”,延迟反而更高;第三次才静下心研究隧道代理的原理,彻底解决了问题。
HTTP隧道代理原理与连接复用调优
HTTP隧道代理(Tunnel Proxy)不同于普通HTTP代理。普通代理每次请求都独立建立连接,而隧道代理通过CONNECT方法在客户端和目标服务器之间建立一条持久的TCP隧道,后续请求可以复用这条隧道,省掉反复握手的开销。对于旅游比价这种需要短时间内发出大量请求的场景,连接复用是降低延迟的关键。
我们用Python的requests库配合Session对象实现连接复用,核心配置如下:
import requests
from requests.adapters import HTTPAdapter
session = requests.Session()
adapter = HTTPAdapter(
pool_connections=20,
pool_maxsize=50,
max_retries=3,
pool_block=True
)
session.mount('http://', adapter)
session.mount('https://', adapter)
proxy = "http://user:pass@proxy-host:port"
resp = session.get("https://target-ota.com/search", proxies={"http": proxy, "https": proxy}, timeout=3)
这里有两个关键参数:pool_maxsize=50 限制每个目标主机的最大连接数,避免资源耗尽;timeout=3 把默认的5秒缩短到3秒,快速失败后切换IP,反而整体吞吐量提升了40%。另外,必须确保代理服务器支持keep-alive,在请求头里显式加上 Connection: keep-alive,否则每次还是会新建连接。我们实测,启用连接复用后,平均延迟从180ms降到80ms,超时率从30%降到5%。
IP轮换策略与并发控制
有了稳定的隧道,下一步是IP轮换。简单随机轮换会出问题:同一个IP可能在短时间内多次请求同一OTA,触发风控。我们的策略是按目标域名分桶,每个桶维护一个IP池,设置最小轮换间隔为5秒,并用令牌桶限制并发。
具体实现用aiohttp异步请求,每从池中取出一个IP,请求失败后立即标记该IP为不可用并切换下一个,同时重试不超过3次。代码片段:
import asyncio
import aiohttp
from itertools import cycle
async def fetch(session, url, ip_pool):
ip = next(ip_pool)
proxy = f"http://{ip}"
try:
async with session.get(url, proxy=proxy, timeout=3) as resp:
return await resp.text()
except Exception:
# 切换IP并重试
for _ in range(2):
ip = next(ip_pool)
try:
async with session.get(url, proxy=f"http://{ip}", timeout=3) as resp:
return await resp.text()
except Exception:
continue
return None
我们设置全局并发为100,每个IP的轮换间隔控制在3-5秒,令牌桶每秒放行150个请求。意外发现:把超时时间缩短到3秒后,失败率没有上升,反而因为快速切换IP,整体成功率从70%提升到98%。同IP在5秒内重复请求同一域名的概率降到0.1%以下,基本避开了风控。
实测对比与选型结论
我们把测试过的几种HTTP代理方案放在一起对比,数据来自连续运行一周的监控:
| 方案 | 平均延迟 | 可用率 | 日成本 | 高并发表现 |
|---|
| 免费代理 | 800ms+ | 60% | 0 | 大量超时,不可用 |
| 独享代理 | 200ms | 90% | 200元+/天 | 连接复用差,频繁封禁 |
| 隧道代理(含蚂蚁代理) | 45ms | 99.7% | 16元/天起 | 稳定,支持地域切换 |
结论很明确:对于旅游比价这种高并发加地域切换的场景,HTTP隧道代理配合精细IP轮换是综合最优解。我们最终选用了蚂蚁代理官网的隧道代理,它的延迟稳定在45ms左右,可用率99.7%,支持全国城市级地域切换,成本只有独享代理的十分之一。当然,如果你每天请求量超过千万级,可能需要考虑住宅代理池,但在我们百万级/天的量级下,这个方案完全够用。
调优之后,业务方不再投诉,老板也终于不再念叨预算。这个经验告诉我:代理IP不是越贵越好,把HTTP代理的原理吃透,用对策略,便宜方案也能跑出高可用。