Geo-zielgerichtete Preisüberwachung: Preise über Märkte hinweg verfolgen

Überwachen Sie die Produktpreise auf den globalen Märkten mithilfe von geo-targeted proxies. Python und Node.js-Code für Multi-Market-Preisvergleich, Währungsnormalisierung und Wettbewerber-Preisstrategie-Erkennung.

Geo-zielgerichtete Preisüberwachung: Preise über Märkte hinweg verfolgen

Warum Preise Differ by Location

E-Commerce-Unternehmen regeln die Preise auf Basis des geografischen Standorts des Kunden routinemäßig. Ein Produkt, das 49,99 $ in den Vereinigten Staaten kostet, könnte zu 59,99 EUR in Deutschland, 5,499 JPY in Japan oder 39,99 $ in Indien. Diese Unterschiede gehen über die Währungsumrechnung hinaus — sie reflektieren regionale Kaufkraft, wettbewerbsfähige Landschaften, Steuern, Versandkosten und vorsätzliche Preisstrategien.

Für wettbewerbsfähige Intelligenz ist das Verständnis dieser regionalen Preisschwankungen entscheidend. Ein Konkurrent kann Sie auf einem Markt aggressiv unterbieten und gleichzeitig Premiumpreise in einem anderen Markt berechnen. Ohne geo-targetierte Überwachung sind Sie blind auf die Hälfte des Wettbewerbs Bild. Dieser Leitfaden deckt den Aufbau eines Multimarkt-Preisüberwachungssystems unter Verwendung von Geo-Ziel-Proxies ab. Für die grundlegende Monitoring-Architektur, siehe unsere Anleitung auf die Konkurrenzpreise automatisch überwachen.

Wie Geo-Pricing funktioniert

Webseiten bestimmen Ihren Standort durch mehrere Signale und passen Inhalte entsprechend an.

Wie Geo-Pricing funktioniert
SignalWie es funktioniertAuswirkungen auf die Preise
IP GeolocationIP-Adresse auf Land/Stadt über Datenbanken abgebildetPrimärfaktor — bestimmt, welche regionalen Filialen/Preise Sie sehen
Währung/SpracheBrowser Accept-Sprache und vorherige AuswahlKann gebietsspezifische Kataloge und Preise auslösen
CookiesVorherige Regionenauswahlen in der Sitzung gespeichertÜberschreibt IP-basierte Erkennung bei späteren Besuchen
Seite nicht gefundenLandspezifische Domänen (amazon.de) oder Pfade (/de/)Direkt bestimmt regionalen Katalog
GPS/Gerät StandortMobile Geräte-StandortdiensteVerwendet für hyperlokale Preise (Lieferzonen)

Gemeinsame Geodruckmuster

  • Marktplatzlokalisierung: Amazon, eBay und ähnliche Plattformen arbeiten separate regionale Filialen mit unabhängigen Preisen.
  • Dynamisches Geo-Pricing: SaaS-Unternehmen und Reise-Websites anpassen Preise basierend auf dem Herkunftsland des Besuchers.
  • Versandkostenbereinigte Preise: Produkte umfassen verschiedene Versandkosten basierend auf Standort, ändern den effektiven Preis.
  • Steuerinklusivpreise: Die europäischen Preise beinhalten in der Regel die Mehrwertsteuer, während die US-Preise Vorsteuerbeträge zeigen.
  • Kaufkraftparität: Einige Unternehmen bieten niedrigere Preise in der Entwicklung von Märkten, um die Zugänglichkeit zu maximieren.

Proxy Konfiguration für Multi-Market Monitoring

Die Grundvoraussetzung ist das Wohnen von jedem Zielland. Mit dem Geotargeting von ProxyHat können Sie das genaue Land für jede Anfrage angeben.

ProxyHat Setup

# US pricing
http://USERNAME-country-US:PASSWORD@gate.proxyhat.com:8080
# German pricing
http://USERNAME-country-DE:PASSWORD@gate.proxyhat.com:8080
# UK pricing
http://USERNAME-country-GB:PASSWORD@gate.proxyhat.com:8080
# Japanese pricing
http://USERNAME-country-JP:PASSWORD@gate.proxyhat.com:8080
# Brazilian pricing
http://USERNAME-country-BR:PASSWORD@gate.proxyhat.com:8080
# City-level targeting for hyperlocal pricing
http://USERNAME-country-US-city-newyork:PASSWORD@gate.proxyhat.com:8080
http://USERNAME-country-DE-city-berlin:PASSWORD@gate.proxyhat.com:8080

Für die Preisüberwachung in den Regionen nutzen Sie die per-Request-Rotation in jedem Land, um die Erkennung zu vermeiden, aber immer konstante Geo-Targeting pro Marktplatz. Überprüfung ProxyHat's vollständige Standortliste für 195+ unterstützte Länder.

Implementierung von Python

Hier ist ein Mehrmarktpreisüberwachungssystem mit ProxyHat's Python SDK.

Geo-Target Preis Scraper

import requests
from bs4 import BeautifulSoup
import json
import time
import random
from dataclasses import dataclass, asdict
from datetime import datetime
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
]
PROXY_TEMPLATE = "http://USERNAME-country-{country}:PASSWORD@gate.proxyhat.com:8080"
@dataclass
class GeoPrice:
    product_id: str
    country: str
    price: float | None
    currency: str
    url: str
    in_stock: bool
    scraped_at: str
def get_geo_proxy(country_code: str) -> dict:
    """Get proxy configured for a specific country."""
    proxy = PROXY_TEMPLATE.format(country=country_code)
    return {"http": proxy, "https": proxy}
def scrape_price_for_region(product_url: str, country_code: str,
                             price_selector: str, currency: str) -> GeoPrice:
    """Scrape a product price from a specific geographic region."""
    headers = {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": get_accept_language(country_code),
    }
    proxies = get_geo_proxy(country_code)
    try:
        response = requests.get(product_url, headers=headers,
                                proxies=proxies, timeout=30)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, "html.parser")
        price_el = soup.select_one(price_selector)
        price = None
        if price_el:
            price_text = price_el.get_text(strip=True)
            cleaned = "".join(c for c in price_text if c.isdigit() or c in ".,")
            # Handle European comma as decimal separator
            if "," in cleaned and "." in cleaned:
                cleaned = cleaned.replace(".", "").replace(",", ".")
            elif "," in cleaned:
                cleaned = cleaned.replace(",", ".")
            price = float(cleaned) if cleaned else None
        return GeoPrice(
            product_id=product_url,
            country=country_code,
            price=price,
            currency=currency,
            url=product_url,
            in_stock=True,
            scraped_at=datetime.utcnow().isoformat(),
        )
    except Exception as e:
        return GeoPrice(
            product_id=product_url,
            country=country_code,
            price=None,
            currency=currency,
            url=product_url,
            in_stock=False,
            scraped_at=datetime.utcnow().isoformat(),
        )
def get_accept_language(country_code: str) -> str:
    """Return appropriate Accept-Language for a country."""
    lang_map = {
        "US": "en-US,en;q=0.9",
        "GB": "en-GB,en;q=0.9",
        "DE": "de-DE,de;q=0.9,en;q=0.5",
        "FR": "fr-FR,fr;q=0.9,en;q=0.5",
        "JP": "ja-JP,ja;q=0.9,en;q=0.5",
        "BR": "pt-BR,pt;q=0.9,en;q=0.5",
        "IN": "en-IN,hi;q=0.9,en;q=0.5",
        "IT": "it-IT,it;q=0.9,en;q=0.5",
        "ES": "es-ES,es;q=0.9,en;q=0.5",
    }
    return lang_map.get(country_code, "en-US,en;q=0.9")

Multi-Market Monitor

class MultiMarketMonitor:
    """Monitor prices across multiple geographic markets."""
    def __init__(self):
        self.markets = {}
        self.results = []
    def add_market(self, country_code: str, marketplace_url: str,
                   price_selector: str, currency: str):
        """Register a market for monitoring."""
        self.markets[country_code] = {
            "url": marketplace_url,
            "selector": price_selector,
            "currency": currency,
        }
    def monitor_product(self, product_urls: dict[str, str]) -> list[GeoPrice]:
        """
        Monitor a product across all configured markets.
        product_urls: {"US": "https://amazon.com/dp/...", "DE": "https://amazon.de/dp/..."}
        """
        prices = []
        for country, url in product_urls.items():
            market = self.markets.get(country)
            if not market:
                continue
            price = scrape_price_for_region(
                url, country,
                market["selector"],
                market["currency"]
            )
            prices.append(price)
            print(f"  {country}: {price.currency} {price.price}")
            time.sleep(random.uniform(2, 5))
        return prices
    def compare_prices(self, prices: list[GeoPrice], base_currency_rates: dict) -> dict:
        """Compare prices across markets normalized to USD."""
        normalized = {}
        for p in prices:
            if p.price:
                rate = base_currency_rates.get(p.currency, 1.0)
                normalized[p.country] = {
                    "local_price": p.price,
                    "currency": p.currency,
                    "usd_equivalent": round(p.price / rate, 2),
                }
        if not normalized:
            return {}
        usd_prices = [v["usd_equivalent"] for v in normalized.values()]
        cheapest = min(usd_prices)
        most_expensive = max(usd_prices)
        return {
            "prices": normalized,
            "cheapest_market": [k for k, v in normalized.items()
                                if v["usd_equivalent"] == cheapest][0],
            "most_expensive_market": [k for k, v in normalized.items()
                                      if v["usd_equivalent"] == most_expensive][0],
            "price_spread_pct": round(
                (most_expensive - cheapest) / cheapest * 100, 1
            ) if cheapest > 0 else 0,
        }
# Example: Monitor a product across Amazon marketplaces
monitor = MultiMarketMonitor()
# Configure markets
monitor.add_market("US", "amazon.com", "span.a-price-whole", "USD")
monitor.add_market("DE", "amazon.de", "span.a-price-whole", "EUR")
monitor.add_market("GB", "amazon.co.uk", "span.a-price-whole", "GBP")
monitor.add_market("JP", "amazon.co.jp", "span.a-price-whole", "JPY")
# Monitor a specific product
prices = monitor.monitor_product({
    "US": "https://www.amazon.com/dp/B0CHX3QBCH",
    "DE": "https://www.amazon.de/dp/B0CHX3QBCH",
    "GB": "https://www.amazon.co.uk/dp/B0CHX3QBCH",
    "JP": "https://www.amazon.co.jp/dp/B0CHX3QBCH",
})
# Compare prices in USD
comparison = monitor.compare_prices(prices, {
    "USD": 1.0, "EUR": 0.92, "GBP": 0.79, "JPY": 149.5,
})
print(json.dumps(comparison, indent=2))

Node.js Implementierung

Ein Node.js Multimarket Monitor mit ProxyHat's Node SDK.

const axios = require("axios");
const cheerio = require("cheerio");
const { HttpsProxyAgent } = require("https-proxy-agent");
function getGeoProxy(countryCode) {
  return `http://USERNAME-country-${countryCode}:PASSWORD@gate.proxyhat.com:8080`;
}
const LANG_MAP = {
  US: "en-US,en;q=0.9",
  GB: "en-GB,en;q=0.9",
  DE: "de-DE,de;q=0.9,en;q=0.5",
  FR: "fr-FR,fr;q=0.9,en;q=0.5",
  JP: "ja-JP,ja;q=0.9,en;q=0.5",
};
async function scrapeGeoPrice(url, countryCode, priceSelector, currency) {
  const agent = new HttpsProxyAgent(getGeoProxy(countryCode));
  try {
    const { data } = await axios.get(url, {
      httpsAgent: agent,
      headers: {
        "User-Agent":
          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
        "Accept-Language": LANG_MAP[countryCode] || "en-US,en;q=0.9",
      },
      timeout: 30000,
    });
    const $ = cheerio.load(data);
    let priceText = $(priceSelector).first().text().trim();
    let price = parseFloat(priceText.replace(/[^0-9.,]/g, "").replace(",", ".")) || null;
    return {
      country: countryCode,
      price,
      currency,
      url,
      inStock: true,
      scrapedAt: new Date().toISOString(),
    };
  } catch (err) {
    return { country: countryCode, price: null, currency, url, inStock: false, scrapedAt: new Date().toISOString() };
  }
}
async function monitorMultiMarket(productUrls, markets) {
  const results = [];
  for (const [country, url] of Object.entries(productUrls)) {
    const market = markets[country];
    if (!market) continue;
    const result = await scrapeGeoPrice(url, country, market.selector, market.currency);
    results.push(result);
    console.log(`${country}: ${result.currency} ${result.price}`);
    await new Promise((r) => setTimeout(r, 2000 + Math.random() * 3000));
  }
  return results;
}
function comparePrices(results, rates) {
  const normalized = {};
  for (const r of results) {
    if (r.price) {
      const rate = rates[r.currency] || 1;
      normalized[r.country] = {
        localPrice: r.price,
        currency: r.currency,
        usdEquivalent: Math.round((r.price / rate) * 100) / 100,
      };
    }
  }
  const usdPrices = Object.values(normalized).map((v) => v.usdEquivalent);
  const cheapest = Math.min(...usdPrices);
  const mostExpensive = Math.max(...usdPrices);
  return {
    prices: normalized,
    cheapestMarket: Object.keys(normalized).find((k) => normalized[k].usdEquivalent === cheapest),
    mostExpensiveMarket: Object.keys(normalized).find(
      (k) => normalized[k].usdEquivalent === mostExpensive
    ),
    priceSpreadPct: cheapest > 0 ? Math.round(((mostExpensive - cheapest) / cheapest) * 1000) / 10 : 0,
  };
}
// Usage
const markets = {
  US: { selector: "span.a-price-whole", currency: "USD" },
  DE: { selector: "span.a-price-whole", currency: "EUR" },
  GB: { selector: "span.a-price-whole", currency: "GBP" },
  JP: { selector: "span.a-price-whole", currency: "JPY" },
};
monitorMultiMarket(
  {
    US: "https://www.amazon.com/dp/B0CHX3QBCH",
    DE: "https://www.amazon.de/dp/B0CHX3QBCH",
    GB: "https://www.amazon.co.uk/dp/B0CHX3QBCH",
    JP: "https://www.amazon.co.jp/dp/B0CHX3QBCH",
  },
  markets
).then((results) => {
  const comparison = comparePrices(results, { USD: 1.0, EUR: 0.92, GBP: 0.79, JPY: 149.5 });
  console.log(JSON.stringify(comparison, null, 2));
});

Multi-Market Monitoring Strategien

Währung Normalisierung

Um die Preise sinnvoll zu vergleichen, normalisieren Sie alle Preise auf eine Basiswährung. Verwenden Sie eine zuverlässige Wechselkurs-API (Open Exchange Tarife, EZB-Raten) und aktualisieren Sie die Kurse täglich. Speichern Sie sowohl lokale als auch normalisierte Preise für genaue historische Analyse.

Steuerabwicklung

Die Preise in verschiedenen Märkten umfassen unterschiedliche Steuersätze:

Steuerabwicklung
MarktTypische SteuerbehandlungÜberlegung
Vereinigte StaatenVorsteuerpreiseDie tatsächlichen Kosten variieren je nach Staat (0-10,25%)
Europäische UnionPreise inkl. MwSt. (19-27%)MwSt. für gleichartige Vergleiche
Vereinigtes KönigreichPreise inkl. 20% MwStSubtrahierte MwSt. für Nettovergleich
JapanPreise sind 10% VerbrauchsteuerSubtraktsteuer für Nettovergleich

Überwachungsplan

Nicht alle Märkte brauchen die gleiche Prüffrequenz. Prioritäten basierend auf Geschäftswirkung:

  • Primärmärkte: Ihre wichtigsten Verkaufsregionen — überprüfen Sie alle 1-2 Stunden.
  • Erweiterungsziele: Märkte, die Sie eingeben – überprüfen Sie alle 4-6 Stunden.
  • Referenzmärkte: Märkte nur für Benchmarking — täglich überprüfen.

Geodruckstrategien erkennen

Mit Multimarket-Daten können Sie die Wettbewerber-Preisstrategien identifizieren:

  • Einheitliche globale Preisgestaltung: Der gleiche Preis (nach Währungsumrechnung) überall. Gebräuchlich für digitale Produkte.
  • PPP-bereinigte Preise: Niedrigere Preise in Niedrigeinkommensmärkten. Gemeinsam für SaaS und Software.
  • Wettbewerbsorientierte Preise: Die Preise variieren je nach Markt aufgrund des lokalen Wettbewerbsdrucks.
  • Kosten-plus-Preis: Verschiedene Preise, die unterschiedliche Versandkosten, Lagerhaltung und Steuerkosten widerspiegeln.
Key Takeaway: Multi-Marke-Monitoring zeigt Preisstrategien, die für eine einheitliche Marktanalyse unsichtbar sind. Ein Wettbewerber mit 30% niedrigeren Preisen in einem Markt signalisiert entweder aggressive Expansion oder eine andere Kostenstruktur, die eine Untersuchung wert ist.

Umgang mit gemeinsamen Herausforderungen

Regionale Umleitungen

Einige Websites leiten Benutzer auf regionale Versionen basierend auf IP um. Mit geo-targeted proxies, Sie wollen diese Umleitung - es führt Sie zu den richtigen regionalen Preisen. Folgen Sie nicht cross-region-Umleitungen, da sie angeben, dass der IP-Standort nicht dem Zielmarkt entspricht.

Inhalt Unterschiede

Die Produktverfügbarkeit variiert je nach Region. Ein auf amazon.com verkauftes Produkt kann auf amazon.de nicht existieren. Handle 404 Antworten und nicht verfügbare Produkte anmutig in Ihrer Monitoring-Pipeline.

Schrott Etikette

Wenn Sie mehrere Regionen überwachen, kratzen Sie effektiv mehrere separate Websites. Anwendung Best Practices zur Vermeidung von Blöcken unabhängig pro Marktplatz. Was für amazon.com funktioniert, kann verschiedene Tuning für amazon.co.jp benötigen.

Datenspeicher für Multi-Market-Daten

CREATE TABLE geo_price_history (
    id SERIAL PRIMARY KEY,
    product_id VARCHAR(100) NOT NULL,
    country_code VARCHAR(2) NOT NULL,
    local_price DECIMAL(12, 2),
    currency VARCHAR(3),
    usd_equivalent DECIMAL(12, 2),
    exchange_rate DECIMAL(10, 6),
    in_stock BOOLEAN,
    scraped_at TIMESTAMPTZ NOT NULL,
    created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_geo_price_product_country
    ON geo_price_history (product_id, country_code, scraped_at DESC);
-- Query: Price spread across markets for a product
SELECT
    country_code,
    AVG(usd_equivalent) AS avg_usd_price,
    MIN(usd_equivalent) AS min_usd_price,
    MAX(usd_equivalent) AS max_usd_price
FROM geo_price_history
WHERE product_id = 'B0CHX3QBCH'
  AND scraped_at >= now() - INTERVAL '7 days'
GROUP BY country_code
ORDER BY avg_usd_price;

Schlüsselanhänger

  • Die E-Commerce-Preise variieren erheblich von der Geographie — die Überwachung eines Marktes gibt ein unvollständiges Wettbewerbsbild.
  • Geo-targeted Wohn-Proxies sind essentiell: Verwenden Sie ProxyHats Land-Ebene, um auf authentische regionale Preise zuzugreifen.
  • Normalisieren Sie die Preise auf eine Basiswährung für sinnvolle Cross-Marke-Vergleiche.
  • Steuerdifferenzen (VAT-inclusive vs pre-tax) bei einem Preisvergleich.
  • Passen Sie Accept-Language Header auf das Zielland für genaue Ergebnisse.
  • Priorisieren Sie die Überwachungsfrequenz durch Marktwert, um die Proxynutzung zu optimieren.

Bereit, die Preise auf den Märkten zu überwachen? Beginnen Sie mit ProxyHat's Wohn-Proxies mit 195+ Land Optionen und lesen Sie unsere E-Commerce-Schrottführer für die volle Strategie. Für Echtzeit-Fähigkeiten, siehe unsere Anleitung auf Infrastruktur zur Echtzeit-Preisüberwachung.

Bereit loszulegen?

Zugang zu über 50 Mio. Residential-IPs in über 148 Ländern mit KI-gesteuerter Filterung.

Preise ansehenResidential Proxies
← Zurück zum Blog