The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →You can monitor competitor prices without a price-tracking SaaS subscription by scheduling a Python job that retrieves permitted product pages, extracts and validates price and stock data, saves observations to SQLite, compares them with the last valid observation, and sends meaningful changes to a Discord webhook. Use HTTP requests first and Playwright only for pages that need browser rendering; neither tool makes it acceptable to bypass a site’s access controls or terms.
How the price-monitoring pipeline works
A dependable monitor is more than a scraper that reads a number. It needs to distinguish a real price change from a broken selector, an error page, or an ambiguous value. The run should follow this sequence:
As an Amazon Associate I earn from qualifying purchases.
- Schedule: start a run at a site-appropriate interval.
- Retrieve: request the page or a permitted, stable data endpoint.
- Render when needed: use Playwright when the content depends on JavaScript or browser interaction.
- Extract: find the price, currency, and availability using configured selectors or structured page data.
- Validate: reject missing, ambiguous, or implausible observations rather than recording guesses.
- Persist: store each valid observation and operational diagnostics in SQLite.
- Compare: check price and stock against the preceding valid observation.
- Alert: notify Discord about meaningful changes and report repeated collection failures separately.
This design keeps routine, lightweight retrieval separate from browser rendering, and makes the history useful for debugging as well as comparison.
Choose HTTP or Playwright for each product page
| Method | Use it when | Trade-off |
|---|---|---|
| HTTPX request | The page HTML or an allowed, stable endpoint already contains the needed product data. | Usually simpler and lighter than launching a browser, but it cannot execute page JavaScript. |
| Playwright browser | Price or stock appears only after JavaScript runs, a client-side request completes, or a permitted browser interaction is needed. | Can cover dynamic pages, but uses more CPU and memory and adds browser and selector maintenance. |
Start with a direct request. Escalate individual products to Playwright only when the simpler route does not provide reliable data. Playwright’s Python API can observe and modify HTTP and HTTPS traffic, including XHR and fetch requests, and supports routing and mocking. Network observation can help diagnose where a page gets its displayed value; it does not authorize access to an endpoint that the target site does not permit.
#1 Best Overall
- Includes Raspberry Pi 5 with 2.4Ghz 64-bit quad-core CPU (8GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
When diagnosing browser traffic, distinguish transport failures from HTTP responses. Playwright documents request, response, requestfinished, and requestfailed lifecycle events. An HTTP 404 or 503 is still a completed HTTP response, not automatically a transport failure. Treat those statuses as unsuccessful product observations rather than as a price of zero or as evidence that the product is out of stock.
Set up the Python project and monitoring configuration
Install the retrieval tools
Use a Python environment for the monitor and install HTTPX and Playwright. Playwright also needs its browser installed:
python -m venv .venv
. .venv/bin/activate
python -m pip install httpx playwright
playwright install chromium
On Windows, activate the environment with .venvScriptsactivate. Keep the runtime environment and browser available on whichever machine runs the scheduled job.
Keep each product’s settings in configuration
For each monitored item, store its product URL, store name, SKU or your own stable identifier, currency, selectors or extraction strategy, and polling policy. A configuration entry might look like this:
Rank #2
- Includes Raspberry Pi 5 16GB with 2.4Ghz 64-bit quad-core CPU (16GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
{
"store": "Example Store",
"sku": "ITEM-42",
"url": "https://store.example/product/your-item",
"currency": "USD",
"retrieval": "http",
"price_selectors": ["[data-testid='price']", ".product-price"],
"availability_selectors": ["[data-testid='availability']"],
"poll_interval_hours": 12
}
The example domain and selectors are placeholders: replace them with a permitted target URL and selectors you have verified for that page. Make configuration flexible enough to designate a browser fallback for pages that require rendering. Keep credentials out of this file.
Retrieve and extract without turning errors into prices
Prefer stable page data and selectors
Inspect the page’s permitted HTML and product data to identify a stable price source. Prefer structured product data or stable attributes over fragile selectors tied to layout or styling. Keep selectors in configuration so a site redesign can be corrected without rewriting comparison logic. If one selector fails, try a configured fallback; if the page still has no unambiguous price, fail closed and record an extraction error.
For dynamic pages, Playwright can wait for the relevant content to appear and then read it from the rendered page. Avoid fixed short sleeps as a substitute for a meaningful readiness condition: network and rendering times vary. If a page requires interaction, use only ordinary access the site permits; do not evade a challenge, login restriction, rate control, or other security measure.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Normalize and validate the result
Price text is not automatically a number. Normalize whitespace and currency formatting according to the product’s configured locale, then validate the currency and numeric range. Thousands and decimal separators differ between locales, so do not blindly strip punctuation or assume that a comma always means a decimal. If the result is ambiguous—such as multiple prices with no reliable way to identify the current selling price—record a failure instead of selecting a convenient value.
Rank #3
- CanaKit Raspberry Pi 5 Essentials Starter Kit
Capture availability as a defined state, such as in_stock, out_of_stock, or unknown. A missing availability selector means unknown, not out of stock. Keep the retrieval status and diagnostic details alongside the observation so a broken selector, timeout, or error page cannot masquerade as a competitor price movement.
Store an auditable price and availability history in SQLite
SQLite is a practical local database for a small, single-process monitor: it needs no separate database service and keeps a queryable history on disk. A useful observations table records one row per successful product observation, while a separate run-status record or log captures failures that did not yield a valid price.
CREATE TABLE IF NOT EXISTS observations (
id INTEGER PRIMARY KEY,
sku TEXT NOT NULL,
store TEXT NOT NULL,
url TEXT NOT NULL,
observed_at TEXT NOT NULL,
currency TEXT NOT NULL,
price_minor_units INTEGER NOT NULL,
availability TEXT NOT NULL,
retrieval_method TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS observations_sku_store_time
ON observations (sku, store, observed_at);
Storing money in integer minor units avoids many floating-point rounding surprises, provided the configured currency’s scale is handled correctly. If you store decimal values instead, use a decimal-safe representation rather than binary floating-point for financial comparisons. Record timestamps consistently, preferably in UTC, and retain the source URL and retrieval method so an alert can be traced to its observation.
Do not overwrite the prior row when a price changes. The sequence of observations is what lets you calculate changes, distinguish a transient error from a trend, and investigate later whether the page or selector changed.
Rank #4
- All-in-One Complete Kit: This SANOOV RPi 5 bundle comes with Raspberry Pi 5 4GB RAM single board, active cooler, durable ABS case and screwdriver. No extra parts needed, ready to use right out of the box for beginners and hobbyists
- Powerful Single Board Computer: Equipped with 4GB RAM and high-performance processor, delivers fast running speed for 4K playback, AI projects, programming and daily computing tasks. SANOOV for raspberry pi 5 4GB is equipped with broadcom 64 quad-core Arm Cortex A76 processor with gigabit ethernet and upgraded with IEEE 802.11ac Wi-Fi, Bluetooth 5.0 dual-band 2.4Ghz and 5Ghz and Power Over Ethernet (POE). Upgrading delivers 2-3 x speed vs Pi 4, redefining the experience
- Efficient Active Cooler: Effectively lowers operating temperature and prevents performance throttling. Runs quietly even under long-time heavy load, ensures stable operation all day long. SANOOV RPi 5 4GB kit offer an active cooler, which combines an aluminium heatsink with a high-performance PWM fan. Active cooler is fully compatible with the Pi OS, which can effectively reduce the temperature of RPi5 and ensure its good performance during long-term high load operation
- Sturdy ABS Protective Case: Well-fitted for Raspberry Pi 5 board, can be secured with 4 screws to effectively protect the Pi 5 motherboard from damage, reserves full access to all ports and buttons. SANOOV uses ABS material to produce the case, which has a softer texture and feel. Meanwhile, SANOOV case adopts a layered design for easy disassembly and installation. (Tip: The Case cannot install M.2 HAT Add on Board and Solid State Drive!)
- Wide Application & Full Compatibility: Seamlessly compatible with official OS and mainstream peripheral accessories for Raspberry Pi 5. Whether you are a beginner, student, electronics hobbyist or professional developer, this all-in-one kit meets your diverse needs. It excels in IoT projects, robotics design, retro gaming devices, home media servers and other DIY creations. Backed by a large global community, you can easily find guides, technical support and shared projects online
Compare only valid observations and detect meaningful changes
For each SKU and store, compare the newest valid observation with the preceding valid one. Calculate both absolute and percentage price change, and check whether availability changed. Do not compare an error response or failed extraction with a valid price.
- First valid observation: create a baseline; do not report it as a price drop or increase.
- Price change: compute the new price minus the old price in the configured currency, and calculate the percentage against the old price when that value is nonzero.
- Availability transition: alert when a known state changes, such as in stock to out of stock. Do not treat unknown as a known stock transition.
- Stale observation: track time since the last successful observation. A long gap should be visible to operators rather than silently presented as fresh data.
- Repeated collection failure: create an operational warning distinct from business alerts, so selector breakage does not look like a competitor event.
Set any notification threshold to fit the products and business use. A small threshold can produce noise from rounding or routine repricing; a large one can hide changes that matter. The stored history makes it possible to adjust policy without pretending the underlying observations were different.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Send useful, controlled alerts to Discord
Create a Discord webhook for the channel that should receive monitor notifications, then have the job send a message when a configured price or availability event occurs. Keep the webhook URL in an environment variable or secret store, not in source code, committed configuration, or logs. Rotate it if it is exposed.
An actionable alert should include the store, SKU, source product URL, currency, previous and current price, absolute or percentage delta, availability state, and observation time. For example, a price-change message can follow this shape:
Best Value
- 【What you Get】You will get 1*Pi 5 8GB Single Board,1*RasTech Case,1*Active Cooler,1*Screwdriver,1*Installation instructions,12-month free warranty, lifetime service, 24-hour prompt and friendly response.
- 【More Connectors】There are two USB 3.0 ports(5Gbps simultaneously) and two USB 2.0 ports, which triple total bandwidth ,support any combination of up to two cameras or displays. Peak SD card performance is doubled through support for the SDR104 high-speed mode. It provides a smooth desktop experience for you. Offer Gigabit Ethernet and a PCIe interface, along with dual-band Wi-Fi and Bluetooth 5.0/BLE wireless capability. The RasTech Pi 5 Kit use the new 27W 5.1V 5A USB-C power connector.
- 【 Support Dual 4Kp60 Display 】Each of the two microHDMI sockets can control a 4K display at 60 Hertz, now support HDR, offering super HD video for media streaming projects. RPi 5 is the first RPi model that comes with a PCI Express port (PCIe 2.0 x1 with 500 MB/s) to attach SSDs (requires separate M.2 HAT).
- 【 Excellent Chips And Applications】Pi 5 is a full-size Pi computer using silicon built in-house at Pi. The RP1 “southbridge” provides the bulk of the I/O capabilities for Pi 5. Pi 5 is more friendly and convenient in the development of Internet of Things, Web development, machine identification, automatic control and other electronic equipment applications and network.
- 【 Faster CPU, Better GPU 】 Pi 5 features a Broadcom BCM2712 64-bit quad-core Arm Cortex-A76 processor running at 2.4GHz, it delivers a 2–3× increase in CPU performance relative to RaspberryPi 4. The 800MHz VideoCore VII GPU is compatible to OpenGL ES 3.1 and Vulkan 1.2, substantial uplift in graphics performance. Pi 5 Offers lightning-fast CPU speed, a PCI Express interface, a Real Time Clock (RTC) and a power button and runs significantly cooler than Pi 4.
Price changed — Example Store (ITEM-42)
USD 49.99 → USD 44.99 (−USD 5.00; −10.0%)
Availability: in_stock
Product: https://store.example/product/your-item
Observed: 2026-10-02 12:00 UTC
The values above illustrate message formatting only; they are not a reported price or a test result. Use Discord’s webhook or API response to detect rejected or rate-limited delivery, and follow the applicable retry guidance rather than sending repeated requests in a tight loop. Discord’s Developer Terms prohibit circumventing technical processes or security measures and prohibit exceeding API rate, call, or usage limits. Discord’s Developer Policy also restricts mining or scraping data available through Discord services. In this design, Discord is only the destination for notifications about data collected from permitted target sites; do not scrape Discord or automate around its security controls.
Schedule runs while limiting load and alert noise
Set a cadence for each site
Choose polling intervals based on how often the information is useful, the target site’s terms and guidance, and the load your requests create. Check robots.txt and applicable site rules, use respectful delays, and avoid rapid polling. There is no universally safe interval for every store. A product-level or site-level polling policy lets you collect less often where pages are sensitive or changes are infrequent.
Use cron for a small self-hosted monitor
On a Unix-like always-on machine, an illustrative cron entry for a six-hour schedule is:
Recommended Free Tools
0 */6 * * * cd /path/to/monitor && /path/to/monitor/.venv/bin/python monitor.py
This is an example schedule, not a recommendation for every target. Replace both paths with the actual project and interpreter paths. Cron uses the machine’s configured timezone and a limited environment, so use absolute paths and make sure the job can access its configuration, database, and webhook secret. A workstation, home server, or managed VPS can host the job; the monitor itself does not require a price-tracking SaaS service, though hosting, hardware, and connectivity may still have costs.
Make failures recoverable
Add request timeouts, per-site cadence, jitter so multiple products do not all fire at once, and bounded retries with exponential backoff for transient errors. Set a maximum error budget or failure threshold, persist last-success and last-error metadata, and alert separately when extraction keeps failing. A single retry should not turn into a burst of requests, and a repeated failure should not produce a stream of duplicate Discord messages.
Quick Recap
Keep the monitor reliable as stores change
- Selector maintenance: keep selectors out of comparison code, retain fallbacks where justified, and treat missing or changed page structure as an error that needs review.
- Data-quality checks: validate currency, ranges, timestamps, availability state, and whether the page was a product page rather than an error response.
- Operational diagnostics: preserve status code, retrieval method, failure reason, and enough page or response diagnostics to identify why extraction failed. Avoid logging secrets or collecting unnecessary personal data.
- Cadence and policy: revisit intervals when site terms or page behavior change; reduce request volume rather than attempting to overcome access limits.
- Storage choice: SQLite is simple for a modest local monitor. If several workers need concurrent shared access or multiple hosts must write to one dataset, a client-server database may be more appropriate, with additional administration.
- Alert quality: notify on state changes that matter, and deduplicate repeated failures or unchanged values to prevent webhook noise.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




