“提前从别的国家订机票会更便宜”是互联网上被反复重复的旅行建议之一。它也很少被认真测试过,因为一次公平的测试比看起来要难。价格每分钟都在变动,货币随国家而变化,同一网站在搜索页面显示的价格和结账时显示的价格也可能不同。
于是我们做了一次测试。2026年9月24日,我们通过住宅IP地址,从六个国家加载相同的航空公司票价和相同的酒店房源,除了出口所在的国家之外不改变任何其他条件。本文将准确报告我们看到了什么、已发表的研究说了什么,以及同样重要的是,我们无法触及的那部分价格。
关键要点
- 航空公司票价并未随我们的出口国家变化。 在对Ryanair公共票价数据进行的72次请求以及六次对其真实预订页面的加载中,每个国家看到的相同航班价格都一样。
- 货币跟随出发机场,而非我们的身份。 从都柏林出发的航班以欧元定价,从伦敦出发的航班以英镑定价,无论我们身处哪个国家皆是如此。
- Booking.com公开的”起价”价格也没有变化。 十家巴黎酒店在全部六个国家、两轮测试中显示的价格完全相同。显示的货币跟随浏览器语言,而非IP地址。
- 最有可能出现差异的酒店价格恰恰是我们无法触及的部分。 Booking.com允许酒店提供仅对来自指定国家访客可见的”国家价格”(Country Rates)。我们的自动化浏览器无法进入带日期的搜索结果页面,而这些价格正是在那里出现的。
- 这与大多数已发表的研究结果一致。 针对航空公司网站的研究大多没有发现系统性的基于位置的定价,而针对酒店预订平台的研究则发现了真实但有限的差异。
我们如何测试
原则很简单:保持一切不变,只改变请求看起来来自的国家。
| 设置 | 值 |
|---|---|
| 测试日期 | 2026年9月24日,主要运行时段为UTC时间11:29至12:03 |
| 出口国家 | 美国、英国、德国、法国、印度、巴西 |
| 网络 | Shifter住宅网关,每个会话选择国家 |
| 出口检查 | 在每次主要运行中,会话的位置在加载旅行页面之前都得到确认;全部与所请求的国家一致 |
| 航空公司 | Ryanair:2026年11月10日三条航线的公共票价数据,外加从都柏林到伦敦斯坦斯特德的真实航班选择页面 |
| 酒店 | Booking.com:以英式英语显示的公开巴黎城市页面,读取每家上市酒店的”起价”数字 |
| 重复次数 | 两轮,国家顺序随机打乱,请求间隔数秒 |
| 行为 | 未登录,仅公开页面,未进行任何预订,少量请求,节奏缓慢 |
出口都是普通的家庭连接。例如,在美国,会话落在Comcast和Charter上;在英国落在BT上;在德国落在Deutsche Telekom上。在每个国家内部,粘性会话使页面及其加载的所有内容保持在同一个IP地址上,因此网站看到的是一个一致的访问者,而不是一群轮换的访问者。
比较本身就是同一个请求,从不同国家发出:
import json
import urllib.request
URL = ("https://www.ryanair.com/api/farfnd/v4/oneWayFares?departureAirportIataCode=DUB"
"&arrivalAirportIataCode=STN&outboundDepartureDateFrom=2026-11-10"
"&outboundDepartureDateTo=2026-11-10¤cy=EUR")
def price_from(country, username, password):
proxy = f"http://{username}-country-{country}:{password}@p.shifter.io:443"
opener = urllib.request.build_opener(urllib.request.ProxyHandler({"https": proxy}))
with opener.open(URL, timeout=45) as r:
fare = json.loads(r.read())["fares"][0]["outbound"]["price"]
return fare["value"], fare["currencyCode"]
for country in ["us", "gb", "de", "fr", "in", "br"]:
print(country, price_from(country, "customer-USERNAME", "PASSWORD"))
我们的发现:航空公司
Ryanair通过一个公共数据接口发布其最低票价,因此可以进行干净的比较。我们从每个国家请求了2026年11月10日的三条航线,一次将货币固定为欧元,一次不指定货币,共两轮。
| 航线 | 六个国家均看到的价格 | 货币 |
|---|---|---|
| 都柏林到伦敦斯坦斯特德 | €19.99 | EUR |
| 都柏林到巴塞罗那 | €40.99 | EUR |
| 米兰贝加莫到伦敦斯坦斯特德 | €14.99 | EUR |
| 伦敦斯坦斯特德到都柏林,未指定货币 | £17.99 | GBP |
全部72次请求都成功了,且完全没有随国家变化。当我们不指定货币时,货币跟随出发机场:从都柏林和贝加莫出发是欧元,从伦敦出发是英镑,无论我们看起来身处哪个国家。
一个数据接口并非事情的全部,因此我们还使用完整浏览器从每个国家加载了Ryanair真实的航班选择页面。围绕11月10日前后几天的票价条,以及当天每个航班的票价,在全部六个国家中都完全相同。一次英国的试运行加载因连接重置而失败,重试后正常加载;我们没有看到其他错误。
流程下一步背后的Ryanair预订接口对来自各个国家的直接请求一律拒绝,因此我们没有测量结账过程。在付款时增加的费用,例如特定付款方式产生的费用,不在本次测试范围之内。
我们的发现:酒店
我们预期会在Booking.com上看到差异,原因正是Booking.com自己文档中写明的。其合作伙伴页面解释说,酒店可以提供”国家价格”(Country Rates),这些折扣”仅对使用与您所定向国家相匹配的IP地址访问我们平台的客人可见”。换句话说,基于位置的酒店定价是设计使然。
但我们无法触及它。从每个国家出发,我们的自动化浏览器都从带日期的搜索被重定向到Booking.com的巴黎通用页面,该页面搜索框中的日期选择器没有响应。带日期的结果,正是”国家价格”唯一会出现的地方,始终无法触及。这种悄无声息的功能退化在自动化访问受严密保护的网站时很常见,也是静默失败率的一个很好的例子:页面成功加载了,但它并不是真人会看到的那个页面。
巴黎页面确实显示了十家特色酒店各自的”起价”数字。在六个国家、两轮测试中,共十二次加载,列表完全相同:相同的酒店,相同的顺序,相同的价格,从最便宜的£192.72到最贵的£468.82。
货币则讲述了自己的故事。每次加载都显示英镑,因为浏览器设置为英式英语。在同一页面上将浏览器语言切换为美式英语后,则显示美元。显示的货币跟随语言设置,而非IP地址,这一点值得了解,以免在将价格差异归因于位置之前产生误判。不同的货币并不等于不同的价格。
已发表的研究说了什么
我们的结果只是一天、六个国家、两个网站的结果。更广泛的研究范围更大,虽然年代较早,但指向了同样的方向。
| 研究 | 测量对象 | 发现 |
|---|---|---|
| Vissers等人,HotPETs 2014 | 三周内从纽约和鲁汶访问25个航空公司网站 | 没有系统性的价格歧视:“几乎所有航空公司在两个地点显示的价格都相似。“一个网站较高的价格由一项国家税收所解释 |
| Steer Davies Gleave为欧盟委员会所做的研究,2012年 | 100个航空公司和旅行社网站 | 74%的网站不会因居住地不同而改变价格;如有变化,通常来自服务费或付款费用,“通常为€5-15” |
| 欧盟委员会审查,2020年 | 2019年的神秘顾客调查 | 31.9%的航空公司网站对跨境购物者显示不同的价格,比2015年低11.6个百分点 |
| Hupperich等人,CODASPY 2018 | 酒店预订平台,来自多个国家的请求 | 在部分平台上确认存在基于位置的价格调整,“尽管价格似乎只在有限范围内变化”;有一个平台对所有国家一视同仁 |
| Which?,2023年1月 | 消费者测试,从不同国家预订航班 | ”在不同国家预订时,机票价格变化不大” |
这种模式是一致的。航空公司票价很少随访问者的位置变动;如果出现跨境差异,通常源于费用、付款方式、税收和货币。酒店平台则不同,因为酒店本身可以按国家定向折扣,这就表现为真实但有限的差异。
这意味着什么
对旅行者而言,这条流行建议比听起来要弱得多。在航空公司方面,不同的国家不太可能改变票价,而不同的货币或付款方式所带来的额外成本可能超过节省下来的钱。在酒店方面,某个”国家价格”可能同样存在于你自己所在的国家,就像存在于其他任何国家一样。Which?也提醒,通过另一个国家进行预订可能处于法律灰色地带。
对旅游和电商团队而言,这个教训关乎测量设计。如果要跨市场比较价格,在得出与位置有关的任何结论之前,先控制货币、语言、税收和费用变量,并检查每次加载是否返回了真实访问者会看到的页面。这方面的采集工作,从国家和城市定向到粘性会话,在抓取航班和酒店价格和用于旅行票价数据的住宅代理中有所介绍。
对媒体而言,诚实的标题应该比”价格取决于你身处何地”更为局限。基于位置的定价确实存在于旅游行业中,最明显的表现是按国家定向的酒店折扣。而在我们能够触及的航空公司和酒店价格中,我们没有看到任何这样的情况。
本次测试的局限
一次单独的测试应当说明它没有涵盖的内容:
- 只测试了一家航空公司和一个酒店平台,一天时间,六个国家。
- 没有获取带日期的酒店搜索结果,因此没有”国家价格”数据,而这正是酒店基于位置定价最可能的来源。
- 没有测量结账总价,因此没有涉及付款费用、预订时收取的税费,或仅限会员的价格。
- 没有测量移动应用价格,而某些平台会单独设定这些价格。
以上每一点都值得进行后续研究。我们可以说的是,在保持其他一切不变的情况下,我们能够触及的价格数据并未随我们看起来身处的国家而变化。
来源与参考文献
- Booking.com合作伙伴页面,Country Rates。
- Vissers、Nikiforakis、Bielova和Joosen,Crying Wolf? On the Price Discrimination of Online Airline Tickets,HotPETs 2014。
- Steer Davies Gleave为欧盟委员会所做的报告,Price transparency provisions in Regulation 1008/2008,2012年1月。
- 欧盟委员会,Short-term review of the Geo-blocking Regulation, staff working document,2020年11月30日。
- Hupperich、Tatang、Wilkop和Holz,An Empirical Study on Price Differentiation Based on System Fingerprints,ACM CODASPY 2018。
- Which?,Can a VPN get you cheaper flights, hotels and holidays?,2023年1月9日。
- Shifter,Residential Proxies geo-targeting和sessions文档。