Monitor for Microcenter's Bundles Page
Find a file
2026-09-13 23:03:56 +00:00
.gitignore Implement resilient hybrid scraper for AMD and Intel bundles with SKU tracking (#1) 2026-09-13 21:01:49 +00:00
email_config_sample.json Broke out config and watchlist, fixed searching to work off watchlsit, added db records 2026-04-13 17:32:38 -07:00
microcenter_monitor.py Add --preview and --target CLI options to test search terms (#3) 2026-09-13 23:03:56 +00:00
README.md Add --preview and --target CLI options to test search terms (#3) 2026-09-13 23:03:56 +00:00
watchlist_sample.json Implement resilient hybrid scraper for AMD and Intel bundles with SKU tracking (#1) 2026-09-13 21:01:49 +00:00

Microcenter-Monitor

Automated price tracker and notification bot for Micro Center PC Build Bundles (AMD & Intel). Combines deals from both the Bundle & Save promotional page and the Computer Build Bundles store catalog into a unified, deduplicated price feed.


Features

  • Hybrid Scraper & 100% Coverage: Merges promo deals and catalog listings into a single list of all active bundles (AMD Ryzen, Intel Core Ultra, Xeon, and Threadripper).
  • Layout-Resilient Semantic Parser: Anchors on invariant product URL links (/product/5007xxx/) and DOM containers instead of fragile marketing CSS classes or IDs.
  • SKU-Keyed Alert State: Tracks alerts strictly by unique Micro Center SKU (5007xxx). If Micro Center introduces a new SKU with an identical product description, it will alert as an independent new deal.
  • Directional Price-Drop Protection: Only alerts when a bundle hits a new all-time low price below your target. Ignores upward price rebounds below target to eliminate alert fatigue.
  • Anti-Bot Bypass: Uses curl_cffi with Safari TLS impersonation to bypass Cloudflare Turnstile bot challenges.
  • Multi-Channel Alerts: Sends email alerts via SMTP and/or local desktop notifications via plyer.
  • Store Selection: Supports querying specific local retail stores via --store <id> (defaults to 029 Web/Online).

Installation & Setup

  1. Clone the repository
  2. Set up Python Virtual Environment:
    python3 -m venv .venv
    source .venv/bin/activate
    pip install curl_cffi beautifulsoup4 plyer
    
  3. Initialize Configuration Files:
    cp watchlist_sample.json watchlist.json
    cp email_config_sample.json email_config.json
    
  4. Configure Email Credentials (email_config.json):
    {
      "EMAIL_FROM": "alerts@yourdomain.com",
      "EMAIL_TO": "you@yourdomain.com",
      "SMTP_HOST": "smtp.yourprovider.com",
      "SMTP_PORT": 465,
      "SMTP_USER": "username",
      "SMTP_PASS": "app_password"
    }
    

How to Set Alerts

Alerts are configured in watchlist.json as a simple JSON object mapping search keywords or SKUs to maximum target prices:

{
  "9800X3D": 650.00,
  "285K": 750.00,
  "7800X3D": 550.00,
  "5007509": 850.00
}

Matching Rules

The monitor uses token-normalized matching:

  • CPU Model: Matches exact model tokens (e.g. "9800X3D" matches AMD Ryzen 7 9800X3D, but will not false-match "9800").
  • Specific SKU: You can track an exact bundle by its 7-digit SKU (e.g. "5007509": 850.00).
  • Component / Board Spec: You can match motherboard chipsets or phrases (e.g. "MSI B850": 700.00 or "X870E": 900.00).
  • Case-Insensitive: "9800x3d" and "9800X3D" behave identically.
  • Punctuation & Symbols: Trademark symbols (™, ®), commas, and hyphens are automatically normalized into spaces.

How the Alert System Works

flowchart TD
    A["Scraped Bundle (SKU 5007xxx, Price, Title, Parts)"] --> B{"Matches keyword in watchlist.json?"}
    B -- No --> Z["Skip Alert"]
    B -- Yes --> C{"Is Price <= Target Price?"}
    C -- No --> D{"Was SKU previously alerted?"}
    D -- Yes --> E["Reset Alert State (Price rebounded above target)"]
    D -- No --> Z
    C -- Yes --> F["Check SQLite alert_state for SKU"]
    F --> G{"Never alerted OR Price < Last Alerted Price?"}
    G -- No (Unchanged or higher price) --> H["Suppress Alert (Prevent Spam)"]
    G -- Yes (New deal or deeper discount) --> I["1. Dispatch Email & Desktop Notification<br>2. Save (SKU, Price, Timestamp) to alert_state"]

Key Behaviors

  1. New SKUs Always Alert: Even if a bundle has the exact same components and title as an existing bundle, a new SKU (5007xxx) has no prior alert entry and will trigger a fresh alert.
  2. First Match Only: If a bundle matches multiple keywords in your watchlist (e.g., "9800X3D" and "MSI B850"), only one alert is dispatched.
  3. Downwards-Only Alerts:
    • Price drops from $700 → $580 (target $600): ALERT SENT.
    • Price rebounds from $580 → $595: SUPPRESSED (did not drop lower than $580).
    • Price drops further from $580 → $520: ALERT SENT (new deeper discount!).
  4. Auto-Reset on Price Hikes: If a price goes back above your target (e.g. $520 → $750), the alert state resets. When it drops below $600 again in the future, you receive a fresh notification.

Reviewing & Managing Alerts

1. Preview a Search Term

Test any keyword before adding it to watchlist.json to see which bundles match and whether they would trigger an alert:

# Preview matching bundles and their current prices
python3 microcenter_monitor.py --preview "9800X3D"

# Preview with a target price to see which bundles would alert vs above target
python3 microcenter_monitor.py --preview "9800X3D" --target 900.00

2. View All Current Bundles & Prices

Scrapes live Micro Center deals and prints all bundles, prices, components, and SKUs without altering your database:

python3 microcenter_monitor.py --list

3. Review Triggered Alerts

View all bundles that have currently triggered alerts, the price at which they alerted, and the timestamp:

python3 microcenter_monitor.py --alerts

Example Output:

================================================================================
  ACTIVE RECORDED ALERTS (1 Total)  [2026-09-13 16:00:00]
================================================================================
SKU: 5007509 | Last Alerted: $599.99 | Alerted At: 2026-09-13 14:30:00
Title: AMD Ryzen 7 9800X3D, MSI B850 Gaming Pro WiFi6E AM5, G.Skill Flare X5 Series 32GB DDR5-6000 Kit, Computer Build Bundle
================================================================================

4. Clear / Reset Alert History

To clear all recorded alerts so that all currently qualifying deals re-trigger immediately on the next check:

python3 microcenter_monitor.py --clear-alerts

5. Check a Specific Store

Pass --store with a 3-digit store code (e.g. 141 for Tustin, CA; 191 for Santa Clara, CA; 085 for Fairfax, VA):

python3 microcenter_monitor.py --store 141

6. Generate Historical CSV Reports

Export logged price history to CSV and email it:

# All-time history
python3 microcenter_monitor.py --report all

# Last 30 days
python3 microcenter_monitor.py --report 30d

# Last year
python3 microcenter_monitor.py --report 365d

Automation

To run the monitor continuously in the background, set up a cron job:

crontab -e

Add an entry to check every 30 minutes:

*/30 * * * * /path/to/Microcenter-Monitor/.venv/bin/python3 /path/to/Microcenter-Monitor/microcenter_monitor.py >> ~/mc_monitor.log 2>&1