跳至正文
中文
立即开始

城市与 ASN 精准定位:掌握电商动态价格采集

深入解析本地差异化定价、航空收益管理算法,以及如何通过住宅代理池实施城市级和 ASN 定向采集。

MV

Marcus Vance

发布于 •更新于 •约 8 分钟

教程与指南
文章目录(14 个章节)

现代数字商业不再在各地保持一致。大型航空公司、酒店预订聚合平台、跨国电商和本地即时配送平台,都会根据访客所在城市动态调整商品价格、库存、运费附加项和促销组合。

对价格情报团队和竞争对标流程来说,只使用国家级代理,例如随机选择任意美国 IP,会得到不完整或存在偏差的数据。

要比较真实的本地价格,自动采集器需要通过 城市级节点和指定 ISP/ASN 运营商地址段 发送请求,同时处理 GDS 销售地(POS)分区和 GeoIP 数据库差异等不易察觉的问题。

本文将介绍边缘 CDN 如何判断用户位置、动态收益管理机制、GeoIP 数据库差异,以及生产环境中的城市与运营商定向配置。


1. 边缘 CDN 与平台如何检测位置

HTTP 客户端连接到电商或航空网站时,Cloudflare、Fastly 或 Akamai 等边缘 CDN 会先实时查询 IP 位置,再将请求路由到源站:

客户端请求(IP:72.14.x.x)
        ↓
边缘 CDN 入口节点
1. 查询 GeoIP 数据库(MaxMind / Digital Element)
2. 提取城市、都市区代码、州、经纬度与 ASN
3. 注入下游请求头
        ↓
源站收益管理引擎(RMS / GDS)
• CF-IPCity: "London"
• CF-IPCountry: "GB"
• X-Carrier-ASN: "AS2856"(British Telecommunications)
→ 动态选择地区价格表与库存

边缘代理将专有地理信息请求头注入下游请求:

  • CF-IPCity / CF-RegionCode:Cloudflare 用于表示城市与行政区。
  • Fastly-Geo-City / Fastly-Geo-Metro-Code:Fastly 用于传递城市与尼尔森 DMA 都市区代码。
  • X-Forwarded-For 和客户端套接字 IP:源站应用中间件可直接检查。

如果采集流程使用从弗吉尼亚州阿什本 AWS 数据中心出网的通用代理,目标平台可能返回默认国家级价格或通用国际价格,无法体现城市之间的定价差异。


2. 地区动态定价与 GDS 销售地机制

企业使用自动化收益管理系统(RMS),依据三类主要经济信号调整价格。

1. 全球分销系统(GDS)与销售地(POS)

航空公司及 Skyscanner、Kayak、Google Flights 等在线旅游服务,依赖 Amadeus、Sabre 和 Travelport 等后台全球分销系统。

机票库存按 销售地(POS) 分区:

  • 查询伦敦 LHR 飞往纽约 JFK 的航班时,英国销售地会访问为英国市场登记的预订舱位和票价。
  • 同一航班从美国或德国 IP 查询时,会进入国际销售地票价池,机票可售情况、汇率附加费与当地旅客税费都可能形成不同总价。

2. 购买力平价与地区消费水平

相比较小的地方市场,零售商常向伦敦、旧金山、苏黎世等高消费城市的用户展示更高基础价格。地区可支配收入指标会直接进入算法竞价引擎。

3. 本地供给与履约物流

Walmart、Target 或 Home Depot 等全渠道零售商,将商品定价和送达预估与地区配送中心(RDC)关联。芝加哥某商品需求高、库存少时,可能比达拉斯库存充足的同款 SKU 价格更高,或交付时间更长。


3. GeoIP 数据库不一致的问题

城市级采集常见的误区,是认为所有系统都会对 IP 的实际位置给出相同结论。

实际服务使用不同的商业 GeoIP 数据库:

  • MaxMind GeoIP2 / GeoLite: 广泛用于开源库与独立 Web 应用。
  • Digital Element(NetAcuity): 常用于大型航空公司、流媒体网络和高端 CDN 边缘节点。
  • DB-IP / IP2Location: 常用于中型地区平台。
差异示例:代理节点 IP 82.165.x.x
├─ MaxMind GeoIP2:英国,大伦敦,伦敦
├─ Digital Element:英国,伯克郡,斯劳(郊区交换节点)
└─ 结果:采集器请求“伦敦”,但目标航空公司使用 Digital Element,
         将该请求识别为不在核心城区。

工程应对方式

避免价格情报流程得出错误结论:

  1. 不要只依赖代理服务商提供的城市标签。
  2. 大批量执行前,先向与目标网站使用相同数据库供应商的公开 GeoIP 回显端点发起轻量探测。
  3. 优先选择住宅节点覆盖密集的核心都市区,减少郊区边界差异。

4. FlashIP 地理定位语法与配置

FlashIP 无需为每个城市管理不同的网关域名,而是通过代理认证字符串配置精细地理定位:

user-{CUSTOMER_ID}-country-{CC}-state-{STATE}-city-{CITY}-asn-{ASN}

参数说明

  • country-{ISO}:两位 ISO 国家代码,例如 country-us、country-gb、country-jp。
  • state-{STATE}:州或省代码,例如 state-ca、state-ny。
  • city-{CITY}:小写形式的目标城市名称,通过连字符接入参数,例如 city-losangeles、city-london、city-frankfurt。
  • asn-{ASN}:可选,限制自治系统编号,例如 AT&T 的 asn-7018、Comcast 的 asn-7922。
  • session-{ID} 与 lifetime-{MIN}:可选,控制 30–120 分钟粘性会话。

命令行示例

# Query pricing from an exit node in Los Angeles, California
curl -x http://user-fl_live_9481a-country-us-city-losangeles:SECRET_KEY@gate.flaship.net:7000 \
     https://ipinfo.io/json

# Query flight fares from an exit node in London, United Kingdom
curl -x http://user-fl_live_9481a-country-gb-city-london:SECRET_KEY@gate.flaship.net:7000 \
     https://ipinfo.io/json

# Query Tokyo e-commerce from a specific Japanese consumer ASN (SoftBank AS17676)
curl -x http://user-fl_live_9481a-country-jp-city-tokyo-asn-17676:SECRET_KEY@gate.flaship.net:7000 \
     https://ipinfo.io/json

通过本地城市住宅 IP 发出请求是必要条件,但如果 HTTP 请求头与位置冲突,仅有 IP 仍不够。

现代平台通常按以下优先级处理:

  1. 明确的客户端 Cookie: 如果历史会话保存了 currency=USD 或 selected_store=US_ORD,源站会优先采用 Cookie,而非实际 IP。
  2. Accept-Language 请求头: 从德国法兰克福 IP(city-frankfurt)出网,却发送 Accept-Language: en-US,en;q=0.9,可能让国际电商自动展示英语和美元的通用国际页面。
  3. 客户端时区信号: 无头浏览器采集时,JavaScript 可读取 Intl.DateTimeFormat().resolvedOptions().timeZone。东京代理出口与 UTC 本机时区不一致,会暴露自动化环境。

工程规则: 遵循 三要素一致原则:代理出口 IP、HTTP Accept-Language 和会话 Cookie 状态,都应对应同一目标城市市场。


6. 生产代码:使用 Python 采集多城市价格

以下脚本使用 concurrent.futures 与 FlashIP 城市级住宅代理网关,并行采集多个目标城市的本地价格:

import json
import logging
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")

PROXY_HOST = "gate.flaship.net"
PROXY_PORT = "7000"
CUSTOMER_ID = "fl_live_9481a"
CUSTOMER_KEY = "SECRET_API_KEY"

CITIES_TO_MONITOR = [
    {"country": "us", "city": "newyork", "name": "New York", "lang": "en-US,en;q=0.9"},
    {"country": "us", "city": "losangeles", "name": "Los Angeles", "lang": "en-US,en;q=0.9"},
    {"country": "us", "city": "chicago", "name": "Chicago", "lang": "en-US,en;q=0.9"},
    {"country": "gb", "city": "london", "name": "London", "lang": "en-GB,en;q=0.9"},
    {"country": "de", "city": "frankfurt", "name": "Frankfurt", "lang": "de-DE,de;q=0.9,en;q=0.8"},
]

def fetch_localized_quote(target_url, geo_profile):
    """
    Executes a price extraction request through FlashIP residential infrastructure
    strictly bound to the specified metropolitan city with synchronized headers.
    """
    country = geo_profile["country"]
    city = geo_profile["city"]
    city_name = geo_profile["name"]
    lang = geo_profile["lang"]

    # Build city-targeted proxy authentication credentials
    username = f"user-{CUSTOMER_ID}-country-{country}-city-{city}"
    proxy_url = f"http://{username}:{CUSTOMER_KEY}@{PROXY_HOST}:{PROXY_PORT}"
    proxies = {"http": proxy_url, "https": proxy_url}

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
        "Accept": "application/json, text/plain, */*",
        "Accept-Language": lang,
    }

    try:
        logging.info(f"Extracting data for market: {city_name} ({country.upper()})...")
        response = requests.get(target_url, proxies=proxies, headers=headers, timeout=20)

        if response.status_code == 200:
            return {
                "city": city_name,
                "status": "success",
                "data": response.json()
            }
        else:
            return {
                "city": city_name,
                "status": "failed",
                "code": response.status_code
            }
    except Exception as err:
        return {
            "city": city_name,
            "status": "error",
            "error": str(err)
        }

def run_price_parity_audit(endpoint):
    results = {}
    with ThreadPoolExecutor(max_workers=5) as executor:
        futures = {
            executor.submit(fetch_localized_quote, endpoint, geo): geo["name"]
            for geo in CITIES_TO_MONITOR
        }

        for future in as_completed(futures):
            city_name = futures[future]
            try:
                res = future.result()
                results[city_name] = res
                logging.info(f"Received results from {city_name}.")
            except Exception as exc:
                logging.error(f"{city_name} generated an exception: {exc}")

    return results

if __name__ == "__main__":
    # Test with public IP geolocation echo service
    audit_target = "https://ipinfo.io/json"
    audit_data = run_price_parity_audit(audit_target)
    print("\n--- AUDIT SUMMARY ---")
    for city, res in audit_data.items():
        if res.get("status") == "success":
            ip_info = res["data"]
            print(f"[{city}] Egress IP: {ip_info.get('ip')} | Detected City: {ip_info.get('city')}")
        else:
            print(f"[{city}] Failed: {res.get('error') or res.get('code')}")

7. 地理定向采集的运行前检查

部署多市场价格情报自动化流程前,应完成以下检查:

  • ASN 与城市验证: 通过 ipinfo.io 或 ipapi.co 检查出口是否解析到目标城市与消费级 ASN。
  • 地区与货币请求头: 使用匹配的 Accept-Language,例如法兰克福使用 de-DE、东京使用 ja-JP,避免源站兜底覆盖。
  • Cookie 隔离: 城市之间清空 Cookie 或使用独立会话上下文,避免跨地区跟踪 Cookie 覆盖实际 IP 位置。
  • 注意 GDS 销售地: 确认目标航班或旅游预订端点没有固定为某个国家销售区域,例如 .co.uk 与 .de。
  • 分配并发负载: 避免向较小城市代理池突发大量并发;必要时将负载分散到相邻都市区。

8. 使用 FlashIP 支持精准地理定位

获取准确、减少偏差的竞品价格,需要具有深度本地节点覆盖的全球代理基础设施:

  • FlashIP 住宅代理: 覆盖 195+ 个国家,支持州、城市和 ASN 精细定位。按用量计费,流量套餐从 $2.80/GB 到企业大流量档位的 $1.00/GB。
  • FlashIP 静态 ISP 代理: 专用消费级线路静态住宅 IP,$7.99/月起,固定城市部署适合长期地区对标。
  • FlashIP 数据中心代理: 高速专用数据中心 IP,$4.99/月起,适合控制国家级采集成本。

前往 FlashIP 价格页面 查看方案,或通过 Telegram 联系解决方案工程团队,讨论定制企业城市测试池。

MV
Marcus Vance数据解决方案专家

FlashIP 电商数据顾问,专注于全球价格情报管道、机票价格采集与地理代理路由。

相关文章

查看全部文章