مراقبة الأسعار المستهدفة جغرافيًا: تتبع الأسعار عبر الأسواق

رصد أسعار المنتجات عبر الأسواق العالمية باستخدام البرافات ذات الأهداف الجغرافية. Python and Node.js code for multi-market price comparison, currency normalization, and competitor pricing strategy detection.

مراقبة الأسعار المستهدفة جغرافيًا: تتبع الأسعار عبر الأسواق

لماذا تتفاهم الأسعار بالمكان

شركات التجارة الإلكترونية تُعدّل الأسعار بشكل روتيني بناءً على موقع العميل الجغرافي A product that costs $49.99 in the United States might be priced at 59.99 EUR in Germany, 5,499 JPY in Japan, or $39.99 in India. وتتجاوز هذه الاختلافات تحويل العملات - فهي تعكس القوة الشرائية الإقليمية، والمناظر الطبيعية التنافسية، والضرائب، وتكاليف الشحن، واستراتيجيات التسعير المتعمدة.

وبالنسبة للاستخبارات التنافسية، فإن فهم هذه التباينات في الأسعار الإقليمية أمر حاسم. المنافس قد يخفضك بشدة في سوق ما بينما يشحن أسعار أقساط أخرى بدون رصد الهدف الأرضي، أنت أعمى إلى نصف الصورة التنافسية. ويغطي هذا الدليل كيفية بناء نظام متعدد الأسواق لرصد الأسعار باستخدام البرافات ذات الأهداف الجغرافية. من أجل هيكل الرصد الأساسي، انظر دليلنا رصد أسعار المنافسين آليا.

How Geo-Pricing Works

المواقع الشبكية تحدد موقعك من خلال عدة إشارات وتعديل المحتوى تبعاً لذلك

How Geo-Pricing Works
الإشارةكيف يعملالأثر على الخصخصة
IP GeolocationIP address mapped to country/city via databaseالعامل الرئيسي - يحدد أي متجر إقليمي/الحجز الذي تراه
العملة/اللغةقبول الحشد واختياراته السابقةيمكن أن يحفز على إعداد كتالوج وتسعير خاصين بكل منطقة
بسكويتالاختيارات السابقة للمنطقة المخزنة في الدورةتجاوز الاكتشاف القائم على شركاء التنفيذ في الزيارات اللاحقة
هيكل URLالمجالات الخاصة بكل بلد (المازون - دي) أو المسارات (/دي/):: تحديد الكتالوج الإقليمي بصورة مباشرة
GPS/Device Locationخدمات مواقع الأجهزة المحمولةمستعملة للتسعير فوق الصوتي (مناطق التسليم)

أنماط التسعير الجغرافي المشترك

  • التسويق: وتدير الأمازون والإيباي والمنابر المماثلة واجهات مخزن إقليمية منفصلة بالتسعير المستقل.
  • Dynamic geo-pricing: شركات (سااس) ومواقع السفر تُعدّل الأسعار على أساس بلد منشأ الزائر
  • التسعير المعدل للشحن: وتشمل المنتجات مختلف تكاليف الشحن على أساس الموقع، مما يغير السعر الفعال.
  • تسعير يشمل الضرائب: وعادة ما تشمل الأسعار الأوروبية ضريبة القيمة المضافة، بينما تظهر أسعار الولايات المتحدة مبالغ ما قبل الضرائب.
  • تعادل القوة الشرائية: وتقدم بعض الشركات أسعاراً أقل في الأسواق النامية لتعظيم إمكانية الوصول إليها.

Proxy Configuration for Multi-Market Monitoring

والمطلوب الأساسي هو وجود كتائب سكنية من كل بلد مستهدف. الهدف الأرضي لـ(بروكسي هات) يجعلك تحدد البلد المحدد لكل طلب

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

وفيما يتعلق برصد الأسعار في جميع المناطق، استخدام التناوب في كل طلب داخل كل بلد لتجنب الكشف، ولكنه يحافظ دائما على وجود أهداف جغرافية متسقة في كل سوق. تحقق قائمة موقع (بروكسي ها) الكاملة بالنسبة للبلدان المدعومة وعددها 195 بلدا.

Python Implementation

هنا نظام رصد الأسعار متعدد الأسواق باستخدام (بروكسي هات) (بايتون).

Geo-Targeted Price 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")

مرصد المريخ المتعدد

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 Implementation

A Node.js multi-market monitor using العميل (س.د.ك).

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 Strategies

تطبيع العملات

ولمقارنة الأسعار بصورة مجدية، تطبيع جميع الأسعار بعملة أساسية. Use a reliable exchange rate API (Open Exchange Rates, ECB rates) and update rates daily. تخزين كل من الأسعار المحلية والمعدلة للتحليل التاريخي الدقيق.

معالجة الضرائب

وتشمل الأسعار في مختلف الأسواق مستويات ضريبية مختلفة:

معالجة الضرائب
السوقالمعاملة الضريبية النموذجيةالنظر في المسألة
الولايات المتحدةالأسعار المبينة قبل الضرائبالتكلفة الفعلية تختلف حسب الدولة (0-10.2 في المائة)
الاتحاد الأوروبيالأسعار تشمل ضريبة القيمة المضافة (19-27 في المائة)ضريبة القيمة المضافة من الباطن للمقارنة المماثلة
المملكة المتحدةتشمل الأسعار 20 في المائة من ضريبة القيمة المضافةضريبة القيمة المضافة للمقارنات الصافية
اليابانتشمل الأسعار ضريبة الاستهلاك 10 في المائةضريبة من الباطن على المقارنة الصافية

الجدول الزمني للرصد

ليس كل الأسواق بحاجة إلى نفس التردد الأولويات على أساس تأثير الأعمال:

  • الأسواق الرئيسية: مناطق مبيعاتك الرئيسية تحقق من كل ساعة
  • أهداف التوسع: الأسواق التي تدخلينها تفقد كل 4-6 ساعات
  • الأسواق المرجعية: أسواق القياس فقط - التحقق يوميا.

Detecting Geo-Pricing Strategies

مع بيانات السوق المتعددة، يمكنك تحديد استراتيجيات التسعير المنافس:

  • التسعير العالمي الموحد: نفس السعر (بعد تحويل العملة) في كل مكان. مشترك في المنتجات الرقمية.
  • تسعير PPP-adjusted: انخفاض الأسعار في الأسواق ذات الدخل المنخفض. مُشتركة في برنامج (سايس) و البرمجيات.
  • التسعير القائم على المنافسة: وتتباين الأسعار حسب السوق على أساس الضغط التنافسي المحلي.
  • تسعير التكاليف زائدا: أسعار مختلفة تعكس شحنات مختلفة، تخزين، وتكاليف ضريبية.
المنافذ الرئيسية: يكشف الرصد المتعدد الأسواق عن استراتيجيات تسعير غير مرئية لتحليل السوق الواحدة. A competitor offering 30% lower prices in one market signals either aggressive expansion or a different cost structure worth investigating.

التصدي للتحديات المشتركة

إعادة التوجيه على الصعيد الإقليمي

Some sites redirect users to regional versions based on IP. مع المحترفين المتجهين جغرافياً، تريد إعادة توجيه هذا الأمر... لا تتبع إعادة التوجيه عبر الحدود، لأنها تشير إلى أن موقع IP لا يطابق السوق المستهدف.

الاختلافات في المحتوى

ويتباين توافر المنتجات حسب المنطقة. منتج يباع على الأمازون معالجة 404 ردود ومنتجات غير متوافرة بشكل جيد في خط المراقبة الخاص بك.

Scraping Etiquette

عندما تراقب مناطق متعددة، أنت فعلياً تخريد مواقع متعددة منفصلة التطبيق أفضل الممارسات لتجنب العوائق بشكل مستقل في السوق ما يعمل في "الأمازون" قد يحتاج إلى تلميح مختلف للأمازون

تخزين البيانات المتعلقة ببيانات المريخ المتعدد

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;

المداخل الرئيسية

  • وتتفاوت أسعار التجارة الإلكترونية تفاوتا كبيرا حسب الجغرافيا - فرصد سوق ما يعطي صورة تنافسية غير كاملة.
  • الوكيلات السكنية المتجهة جغرافيا ضرورية: استخدام هدف بروكسي هات على الصعيد القطري للوصول إلى تسعير إقليمي حقيقي.
  • تطبيع الأسعار إلى عملة أساسية لإجراء مقارنات مجدية بين الأسواق.
  • (ب) حساب الفروق الضريبية (التفاوتات المالية الشاملة ضد الضرائب المسبقة عن علم) عند مقارنة الأسعار.
  • Match Accept-Language headers to the target country for accurate results.
  • :: إعطاء الأولوية لتواتر الرصد حسب أهمية السوق لتحقيق الاستخدام الأمثل.

مستعد لرصد الأسعار عبر الأسواق؟ ابدأ وكيلات النيابة السكنية مع 195+ خيارات قطرية وقراءة دليل خردة التجارة الإلكترونية من أجل الاستراتيجية الكاملة من أجل قدرات الزمن الحقيقي، انظر دليلنا الهياكل الأساسية لرصد الأسعار في الوقت الحقيقي.

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog