首次设置代理时,本能反应是选择离自己最近的位置。感觉上这样应该最快,但这往往会让你得到错误的数据。网站并不知道你坐在哪里,它看到的是出口,因此使用住宅代理时,出口国家决定了你看到的是网站的哪个版本。
本指南将说明如何根据你想了解的内容来选择出口国家,如何检查某个网站是否对此有反应,以及什么时候最近的出口才真正是正确的选择。
首先要问的问题
不要问你自己在哪里,要问你需要谁的视角。
| 你在做什么 | 应选择出口位于 |
|---|---|
| 监控竞争对手价格 | 你的客户购买所在的市场 |
| 检查搜索排名 | 搜索者所在的地方,如有需要可精确到城市 |
| 验证广告 | 广告系列目标所在的国家 |
| 测试本地化网站 | 你销售的每个市场,逐一进行 |
| 检查你自己的地理重定向 | 规则覆盖的每个国家,外加一个不覆盖的国家 |
| 收集不随地理位置变化的内容 | 靠近目标,且IP池充足 |
一个在德国追踪美国价格的团队,从德国的出口得不到任何有用的信息:他们会看到欧元,也许还有不同的商品目录,而这些数据看起来却完全正常。
测试网站是否有反应
并非所有网站都会根据IP变化。在围绕某个出口国家制定计划之前,先进行测量。下面的脚本会从多个国家请求一个页面,确认每个请求实际从哪里发出,并记录页面显示的内容。它可在Python 3.9及更高版本上运行,需要requests库。凭证来自环境变量,因此请将它们保存在代码之外。
from __future__ import annotations
import os
import re
import requests
GATEWAY = "p.shifter.io:443"
USER, PASSWORD = os.environ["PROXY_USER"], os.environ["PROXY_PASS"]
def session_for(country):
proxy = f"http://{USER}-country-{country}:{PASSWORD}@{GATEWAY}"
s = requests.Session()
s.proxies = {"http": proxy, "https": proxy}
s.headers["User-Agent"] = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/130.0 Safari/537.36")
return s
def signals(url, country):
"""What this page shows a visitor from one country, and where they really exited."""
s = session_for(country)
try:
exit_country = s.get("https://ip-info.com/json", timeout=30).json().get("country")
r = s.get(url, timeout=30)
except (requests.RequestException, ValueError) as exc:
return {"exit": country.upper(), "error": type(exc).__name__}
lang = re.search(r'<html[^>]*\blang=["\']?([\w-]+)', r.text, re.I)
currency = re.search(r'priceCurrency["\']?\s*(?:content=|:)\s*["\']([A-Z]{3})', r.text)
price = re.search(r'itemprop=["\']price["\']\s+content=["\']([\d.,]+)', r.text)
return {"exit": exit_country, "status": r.status_code, "final_url": r.url,
"lang": lang.group(1) if lang else None,
"currency": currency.group(1) if currency else None,
"price": price.group(1) if price else None}
if __name__ == "__main__":
for url in ("https://www.apple.com/shop/buy-iphone",
"https://store.steampowered.com/app/620/Portal_2/"):
print(url)
for country in ("us", "de", "gb", "br"):
s = signals(url, country)
print(f" exit {s['exit']} {s.get('status')} lang={s.get('lang')} "
f"{s.get('currency')} {s.get('price') or ''}".rstrip())
我们在2026年11月4日使用一个Shifter测试账户运行了这个脚本。以下是结果,价格会随时间变化:
https://www.apple.com/shop/buy-iphone
exit US 200 lang=en-US USD
exit DE 200 lang=en-US USD
exit GB 200 lang=en-US USD
exit BR 200 lang=en-US USD
https://store.steampowered.com/app/620/Portal_2/
exit US 200 lang=en USD 9.99
exit DE 200 lang=en EUR 9,69
exit GB 200 lang=en GBP 8.19
exit BR 200 lang=en BRL 33,99
这两个网站展示了你需要了解的两种情况。
Apple不会对IP作出反应。 每个出口都得到了相同的美国页面,货币为USD。Apple将本地化逻辑保留在URL中:/de/shop/buy-iphone 会提供德国商店。出口国家对这个页面没有任何影响,因此按地理位置选择出口不会有任何作用。
Steam会作出反应。 URL和语言保持不变,但货币和价格随出口变化:USD 9.99、EUR 9,69、GBP 8.19和BRL 33,99。从错误的国家检查价格,会得到一个干净、可信但错误的数字,且不会有任何错误提示你。
像脚本那样,既要检查出口,也要检查页面。在这里发现位置错误,要比之后在数据中发现容易得多。
什么时候最近的出口是错误的选择
- 你的受众在别处。 这是最常见的情况,上面的例子已经说明了原因。
- 你的邻国是一个不同的市场。 德国和奥地利共用一种语言,但价格未必相同,共用货币也不代表共用商品目录。应将它们视为独立市场。
- 市场具有区域性。 有些结果按城市或州变化的程度,不亚于按国家变化。我们关于何时城市级定位很重要的指南介绍了如何判断。
- 请求的其余部分不匹配。 美国出口配上德语浏览器语言,可能会得到两者混杂的奇怪结果。地理位置、时区和语言环境应当保持一致,因此要将它们一起设置。
什么时候最近是正确的,最近于什么
如果一个网站在所有地方提供相同的内容,就像Apple的URL那样,地理位置就不再关乎准确性,而关乎性能。即便如此,真正重要的距离也很少是从你的办公桌算起的距离。一个代理请求从你的客户端发出,经过网关,再到出口,最后到达目标。无论你自己离得多远,靠近目标的出口都能缩短最后一段路程。
因此,如果内容不随地理位置变化,就选择靠近目标且有充足可用IP的出口,并进行测量。较小的国家IP池较薄,因此当位置真的无关紧要时,一个受欢迎的邻近市场可能更为可靠。
常见错误
- 只测试一个国家,就假设其余国家也一样。 一个在某个页面上忽略IP的网站,可能在另一个页面上(例如结账或搜索)作出反应。要测试你真正关心的那个页面。
- 信任一个干净的响应。 货币错误的页面仍然会返回200。要增加对预期货币或语言的检查。
- 假设每一步都跟随出口。 有些网站不仅按IP,还按DNS或账户设置来引导,而DNS可能无法在出口国家解析。如果这很重要,请核实你得到的页面。
- 混淆出口与居住地。 出口是请求离开网络的地方,它并不说明你的数据存储在哪里。
- 把出口当作许可。 为测试或研究向网站展示另一个国家的视角是一回事,利用它来规避许可、制裁或网站条款则是另一回事。请先与你的法务团队确认。
结论
根据你需要谁的视角来选择出口,而不是根据你自己在哪里。要测试网站是否对IP有反应,确认每个请求实际从哪里发出,并增加对预期货币或语言的检查。只有当内容在各地都相同时,距离才会成为考虑因素,而此时重要的是到目标的距离。