DEV Community

Xavier Fok
Xavier Fok

Posted on

E-Commerce Price Monitoring with Proxies: A Complete Guide

Competitive pricing is the backbone of e-commerce success. Monitoring competitor prices across thousands of products requires proxy infrastructure that can handle scale without getting blocked. Here is how to build it.

Why Price Monitoring Needs Proxies

E-commerce platforms actively block price scrapers because:

  • Competitor intelligence — They do not want rivals tracking their pricing strategies
  • MAP enforcement — Minimum Advertised Price agreements require monitoring
  • Dynamic pricing — Sites show different prices based on location, device, and browsing history
  • Server protection — High-volume scraping strains their infrastructure

Without proxies, you will get blocked within minutes on major platforms.

Architecture for Price Monitoring

Product URL Database
        |
        v
Scheduler (cron/Celery)
        |
        v
Scraper Workers (parallel)
        |
        v
Proxy Pool (rotating residential)
        |
        v
Target E-Commerce Sites
        |
        v
Price Parser
        |
        v
Price Database (PostgreSQL/MongoDB)
        |
        v
Alert System (price changes)
Enter fullscreen mode Exit fullscreen mode

Platform-Specific Proxy Requirements

Platform Proxy Type Difficulty Notes
Amazon Residential High Heavy bot detection, geo-specific pricing
eBay Residential Medium Rate limiting focused
Walmart Residential High Akamai Bot Manager
Shopify stores Datacenter Low Basic rate limiting
AliExpress Residential Medium Cloudflare protected
Target Residential Medium PerimeterX protection

Building the Scraper

import requests
from bs4 import BeautifulSoup
import json
import time
import random

class PriceMonitor:
    def __init__(self, proxy_manager):
        self.proxy_manager = proxy_manager
        self.session = requests.Session()

    def get_price(self, url, selectors):
        proxy = self.proxy_manager.get_proxy()
        headers = self.get_headers()

        try:
            time.sleep(random.uniform(1, 3))
            response = self.session.get(
                url,
                proxies={"http": proxy, "https": proxy},
                headers=headers,
                timeout=15
            )

            if response.status_code == 200:
                return self.extract_price(response.text, selectors)
            else:
                self.proxy_manager.report_failure(proxy)
                return None

        except Exception as e:
            self.proxy_manager.report_failure(proxy)
            return None

    def extract_price(self, html, selectors):
        soup = BeautifulSoup(html, "html.parser")

        for selector in selectors:
            element = soup.select_one(selector)
            if element:
                price_text = element.get_text(strip=True)
                # Extract numeric price
                price = float(
                    price_text.replace("$", "")
                    .replace(",", "")
                    .strip()
                )
                return price
        return None

    def get_headers(self):
        user_agents = [
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
        ]
        return {
            "User-Agent": random.choice(user_agents),
            "Accept": "text/html,application/xhtml+xml",
            "Accept-Language": "en-US,en;q=0.9",
            "Accept-Encoding": "gzip, deflate, br",
        }
Enter fullscreen mode Exit fullscreen mode

Handling Dynamic Pricing

Many sites show different prices based on:

Location

Use geo-targeted proxies to see prices in different regions:

# Check price from US
us_price = monitor.get_price(url, proxy_geo="US")
# Check price from UK  
uk_price = monitor.get_price(url, proxy_geo="UK")
Enter fullscreen mode Exit fullscreen mode

Device Type

Mobile vs desktop can show different prices. Set appropriate User-Agent headers.

Browsing History

Use clean proxy sessions without cookies to get baseline prices.

Price Change Alerts

def check_price_change(product_id, new_price, db):
    old_price = db.get_latest_price(product_id)

    if old_price is None:
        db.save_price(product_id, new_price)
        return

    change_pct = ((new_price - old_price) / old_price) * 100

    if abs(change_pct) > 5:  # 5% threshold
        send_alert(
            f"Price change detected for {product_id}: "
            f"${old_price} -> ${new_price} ({change_pct:+.1f}%)"
        )

    db.save_price(product_id, new_price)
Enter fullscreen mode Exit fullscreen mode

Scaling Tips

  1. Schedule intelligently — Check prices 2-4 times daily, not every hour
  2. Prioritize products — High-value products get checked more frequently
  3. Use appropriate proxies — Datacenter for easy targets, residential for Amazon/Walmart
  4. Cache product pages — Extract multiple data points per request
  5. Respect rate limits — 1-2 requests per second per target domain

For e-commerce proxy guides and price monitoring tutorials, visit DataResearchTools.

Top comments (0)