快速解答
如何让多个请求保持同一个城市 IP?
EuroCity Proxies 粘性会话保持一个出口 IP 最长 30 分钟(IP 可能提前更换,例如住宅设备离线时)。在城市用户名后加 -session-<id>-ttl-<minutes>,例如 USERNAME-country-fr-city-lyon-session-lyon1-ttl-10。截至 2026 年 10 月,ttl 最高可设为 30。每个城市、每个任务用一个会话 ID。
轮换用户名和粘性用户名有什么区别?
| 模式 | 用户名示例 | 出口 IP 行为 | 适用场景 |
|---|---|---|---|
| 轮换 | USERNAME-country-pl-city-krakow | 新连接通常会获得该城市中的不同 IP | 相互独立的页面加载,每个连接一个 |
| 粘性,10 分钟 | USERNAME-country-pl-city-krakow-session-krk1-ttl-10 | 同一 IP 保持最多 10 分钟,即使跨新连接 | 短时核查:一个页面、两次点击、一张截图 |
| 粘性,30 分钟 | USERNAME-country-pl-city-krakow-session-krk2-ttl-30 | 同一 IP 保持最多 30 分钟 | 对自有网站进行更长时间的测试,例如测试模式下的结账流程 |
粘性会话有什么用?
粘性会话会在设定时间内把会话 ID 绑定到一个出口 IP。所有使用相同用户名(包括相同 ID)的连接都会通过该 IP 发出,直到 TTL 到期。IP 也可能提前变化,例如其背后的家庭设备离线时。
没有会话 ID 时,网关以轮换模式工作。每个新连接都会从 IP 池分配一个 IP,通常是不同的 IP;如需每个请求都使用新 IP,请每个连接只发送一个请求(关闭 keep-alive)。轮换适合独立请求。粘性会话适合被视为来自同一地点的同一访客的一系列请求。例如,商店把你的配送区域保存在 cookie 中。
为什么每个城市、每个任务使用一个会话?
因为这样每个任务都有明确的开始、已知的出口和干净的结束。用城市和任务来命名 ID:lyon1 用于第一次 Lyon 检查,krk2 用于第二次 Kraków 检查。会话 ID 接受 1 到 32 个字母或数字。
这样结果更易读。当 Lyon 页面看起来不对时,你知道是哪个出口提供的,并能检查该 IP。它还能防止一个长期会话在同一地址上混合多个检查、cookie 和购物车。任务结束时,关闭其客户端,并用新 ID 开始下一个任务。
我应该选 ttl-10 还是 ttl-30?
选择覆盖任务的最短 TTL:大多数检查用 ttl-10,只有长时间流程用 ttl-30。对城市页面、产品和配送时段的检查通常十分钟内完成。对自有结账流程(含表单和测试模式支付步骤)的测试可能需要三十分钟。
不要按完整 TTL 来规划。在任务开始和结束时读取出口 IP。如果它变了,说明设备离线;用新 ID 重试一次任务。最长为 30 分钟,所以把更长的工作拆成多个任务。
keep-alive 如何改变出口 IP?
Keep-alive 保持一个连接打开,而一个连接保持一个出口。根据 RFC 9112,HTTP/1.1 连接默认是持久的,所以客户端会复用它们,除非被告知关闭。
- requests:
Session会复用其连接池中的连接。Requests 文档将 keep-alive 描述为会话内自动进行。 - httpx:
Client以同样方式保持连接打开。 - undici (Node.js):空闲套接字默认保持打开 4 秒(
keepAliveTimeout),如果服务器发送 keep-alive 提示则更长。
使用粘性会话时这无关紧要:ID 即使在新连接上也能保持 IP。使用轮换用户名时则有影响。通过一个打开的连接发送的请求共享一个出口。要每个请求一个新 IP,请关闭连接或每次打开新客户端。
# pip install requests
from urllib.parse import quote
import requests
HOST = "gw.eurocityproxies.com"
PORT = 7777
PASSWORD = quote("PASSWORD", safe="")
def session_for(country: str, city: str, task: str, ttl: int = 10) -> requests.Session:
user = f"USERNAME-country-{country}-city-{city}-session-{task}-ttl-{ttl}"
proxy = f"http://{user}:{PASSWORD}@{HOST}:{PORT}"
s = requests.Session()
s.trust_env = False # ignore HTTP_PROXY / HTTPS_PROXY set on your machine
s.proxies = {"http": proxy, "https": proxy}
return s
def exit_ip(s: requests.Session) -> str:
return s.get("https://ipinfo.io/json", timeout=30).json()["ip"]
tasks = [("fr", "lyon", "lyon1"), ("pl", "krakow", "krk1"), ("nl", "the_hague", "hag1")]
for country, city, task in tasks:
with session_for(country, city, task) as s:
start = exit_ip(s)
page = s.get("https://YOUR-SITE.example/", timeout=30)
end = exit_ip(s)
note = "same exit" if start == end else "exit changed: repeat once with a new id"
print(city, start, page.status_code, note)会话能绕过网站的速率限制吗?
不能。会话和轮换决定你的请求来自哪里;它们不改变网站允许的内容。每个城市、每次运行使用一个会话,速率适中。轮换不是绕过网站速率限制的方法。
如果页面失败,等待并稍后重试一次。如果网站持续拒绝,请停止并使用其官方途径,例如 API 或数据合作伙伴。可接受使用政策列出了该服务不得用于的用途。
粘性会话消耗多少流量?
会话本身不产生费用:你只为发送和接收的数据付费。用量统计通过代理发送和接收的所有数据(上传和下载,包括标头)。1 GB = 1,000,000,000 字节。在到达目标之前失败的连接尝试不计入。用一个页面和两次 IP 查询进行的简短城市检查通常消耗几兆字节或更少,取决于页面。
流量在你的账户的所有城市和会话之间共享。预付费住宅代理和轮换移动代理流量永不过期:未使用的 GB 会保留在您的账户中,直到您使用。套餐起价为 US$0.95 1 GB,见定价页面。
粘性会话:常见问题
最长的粘性会话是多久?
三十分钟。在用户名中设置 -ttl-30。如果其背后的家庭设备离线,IP 仍可能提前变化。在每个任务开始和结束时读取出口 IP。
如何在同一城市获得新 IP?
更改会话 ID,例如从 lyon1 改为 lyon2,并保持用户名其余部分不变。使用轮换用户名时,改为打开新连接。
两个脚本能共享一个会话吗?
会话由用户名、ID 和 TTL 标识,因此发送完全相同值的两个脚本请求的是同一个粘性会话。在每个脚本中依赖它之前检查出口 IP,并为不同任务使用单独的 ID。
粘性会话会保持同一城市吗?
会。城市是用户名的一部分,会话会保持来自该城市定向的一个出口 IP。城市可用性各不相同;结账页面会显示哪些在线。
为什么使用 ttl-10 时我的 IP 两分钟后就变了?
家庭连接会离线:路由器重启、设备休眠、提供商重新分配地址。会话随后会获得新的出口。用新 ID 重试一次任务;如果每个任务都发生,请写信给支持并附上时间和 IP。
粘性会话比轮换会话更贵吗?
不贵。两者使用相同的每 GB 流量计费。所有套餐均可按国家/城市定向;美国还支持州和 ZIP 邮编定向;ASN 定向不额外收费。可用城市会有变化。
来源 (5)
- RFC 9112 HTTP/1.1,第 9.3 节 持久性 — IETF (June 2022, checked 2026-10-18)
- Requests:高级用法、Session 对象与 Keep-Alive — Requests (checked 2026-10-18)
- undici Client:keepAliveTimeout(默认 4e3 毫秒) — Node.js project (checked 2026-10-18)
- HTTPX:代理 — Encode (checked 2026-10-18)
- IPinfo JSON 端点 — IPinfo (checked 2026-10-18)