لماذا تتفاهم الأسعار بالمكان
شركات التجارة الإلكترونية تُعدّل الأسعار بشكل روتيني بناءً على موقع العميل الجغرافي 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
المواقع الشبكية تحدد موقعك من خلال عدة إشارات وتعديل المحتوى تبعاً لذلك
| الإشارة | كيف يعمل | الأثر على الخصخصة |
|---|---|---|
| IP Geolocation | IP 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+ خيارات قطرية وقراءة دليل خردة التجارة الإلكترونية من أجل الاستراتيجية الكاملة من أجل قدرات الزمن الحقيقي، انظر دليلنا الهياكل الأساسية لرصد الأسعار في الوقت الحقيقي.






