{"id":39826,"date":"2026-07-24T11:54:28","date_gmt":"2026-07-24T11:54:28","guid":{"rendered":"https:\/\/nodemaven.com\/?p=39826"},"modified":"2026-07-24T12:00:30","modified_gmt":"2026-07-24T12:00:30","slug":"amazon-price-tracker-python","status":"publish","type":"post","link":"https:\/\/nodemaven.com\/ru\/blog\/amazon-price-tracker-python\/","title":{"rendered":"How to Build an Amazon Price Tracker With Python"},"content":{"rendered":"<p><a href=\"https:\/\/nodemaven.com\/ru\/blog\/the-best-ai-web-scraping-stack-in-2026\/\">\u0412\u0435\u0431-\u0441\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433<\/a> can help you monitor Amazon prices without checking the same product page manually every day. In this tutorial, you will build a simple <strong>Amazon price tracker with Python<\/strong> that collects a product title, price, availability status, and page URL, then saves the results to a CSV file.<\/p>\n\n\n\n<p>The example uses Python, Requests, BeautifulSoup, and a real Amazon product page structure. You will also see why Amazon price tracking often needs extra checks: prices can vary by location, pages can show CAPTCHAs, and selectors can change across product layouts.<\/p>\n\n\n\n<p>For small tests, a basic script is enough. For higher-volume or location-sensitive tracking, <strong>clean residential proxies, sticky sessions, and ZIP-level targeting<\/strong> can make results more reliable because Amazon may return different prices, shipping details, and availability by region.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-this-amazon-price-tracker-will-do\">What this Amazon price tracker will do<\/h2>\n\n\n\n<p>The tracker in this guide will collect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Product title<\/li>\n\n\n\n<li>Current visible price<\/li>\n\n\n\n<li>Availability text<\/li>\n\n\n\n<li>Product URL<\/li>\n\n\n\n<li>Timestamp<\/li>\n\n\n\n<li>Price history in a CSV file<\/li>\n\n\n\n<li>Basic price-drop alert in the terminal<\/li>\n<\/ul>\n\n\n\n<p>This is a beginner-friendly scraper, but it follows habits that matter in real price monitoring projects. It checks whether the expected data exists, avoids saving CAPTCHA pages as product data, and keeps the code easy to extend.<\/p>\n\n\n\n<p>For a broader view of price tracking tools and workflows, NodeMaven also has a guide to <a href=\"https:\/\/nodemaven.com\/ru\/blog\/price-monitoring-tools\/\">price monitoring tools<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-before-you-start-amazon-scraping-limitations\">Before you start: Amazon scraping limitations<\/h2>\n\n\n\n<p>Amazon pages are more complex than a practice website. A product page can change depending on marketplace, ZIP code, shipping address, cookies, login state, deal status, and product type. <\/p>\n\n\n\n<p>Before collecting data at scale, review Amazon\u2019s <a href=\"https:\/\/www.amazon.com\/gp\/help\/customer\/display.html?nodeId=508088\">Conditions of Use<\/a>. For approved product-data use cases, also check Amazon\u2019s <a href=\"https:\/\/webservices.amazon.com\/paapi5\/documentation\/\">Product Advertising API documentation<\/a>.<\/p>\n\n\n\n<p>This tutorial is for learning how price tracking works. If you plan to run a production scraper, also read NodeMaven\u2019s guide on <a href=\"https:\/\/nodemaven.com\/ru\/blog\/is-web-scraping-legal\/\">whether web scraping is legal<\/a>.<\/p>\n\n\n\n<p>Amazon price tracking usually becomes difficult because of:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CAPTCHA pages<\/strong> instead of product pages<\/li>\n\n\n\n<li><strong>403 or 503 errors<\/strong><\/li>\n\n\n\n<li><strong>Prices split across several HTML elements<\/strong><\/li>\n\n\n\n<li><strong>Different prices by region or ZIP code<\/strong><\/li>\n\n\n\n<li><strong>Selectors changing between product layouts<\/strong><\/li>\n\n\n\n<li><strong>Requests returning different content than the browser<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Developers run into these issues often. For example, this Stack Overflow discussion about <a href=\"https:\/\/stackoverflow.com\/questions\/61978456\/trying-to-webscrape-the-price-from-an-amazon-page-using-the-css-selector-and-pyt\">Amazon CAPTCHA and price selector issues<\/a> shows why fallback selectors and response validation matter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-1-set-up-the-python-project\">Step 1: Set up the Python project<\/h2>\n\n\n\n<p>Create a new folder for the project and open it in your editor.<\/p>\n\n\n\n<p>If you use macOS or Linux, run:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"mkdir%20amazon-price-tracker%0Acd%20amazon-price-tracker%0Apython3%20-m%20venv%20venv%0Asource%20venv%2Fbin%2Factivate%0Apip%20install%20requests%20beautifulsoup4%20lxml\"><\/code><\/pre><\/figure>\n\n\n<p>If you use Windows, run:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"mkdir%20amazon-price-tracker%0Acd%20amazon-price-tracker%0Apython%20-m%20venv%20venv%0Avenv%5CScripts%5Cactivate%0Apip%20install%20requests%20beautifulsoup4%20lxml\"><\/code><\/pre><\/figure>\n\n\n<p>Now create a file named:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"plaintext\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-plaintext\" data-rhino-code=\"amazon_price_tracker.py\"><\/code><\/pre><\/figure>\n\n\n<p>You can create it in VS Code, PyCharm, or any text editor. Keep this file open, because the next steps build the script piece by piece.<\/p>\n\n\n\n<p>If this is your first scraper, the <a href=\"https:\/\/nodemaven.com\/ru\/blog\/python-web-scraping\/\">Python web scraping<\/a> guide explains Requests, BeautifulSoup, selectors, and CSV export in more detail.<\/p>\n\n\n\n<p><strong>Tested setup:<\/strong> Python 3.12, Requests, BeautifulSoup4, and lxml. The script can run on macOS, Windows, or Linux after the environment is ready.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-2-inspect-an-amazon-product-page\">Step 2: Inspect an Amazon product page<\/h2>\n\n\n\n<p>Open the Amazon product page you want to track. Right-click the product title and select <strong>Inspect<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"555\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30-1024x555.png\" alt=\"Amazon Price Tracker | Copy selectors from product page\" class=\"wp-image-39828\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30-1024x555.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30-300x163.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30-768x416.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30-1536x833.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30-18x10.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/image-30.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>On the product page used for this test, the title was inside:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"%22%23productTitle%22\"><\/code><\/pre><\/figure>\n\n\n<p>Then inspect the price. Amazon often stores the full price in an offscreen element, but on some pages the visible price is split into separate parts:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"%22.a-price-symbol%22%0A%22.a-price-whole%22%0A%22.a-price-fraction%22\"><\/code><\/pre><\/figure>\n\n\n<p>That is why the script uses fallback selectors instead of depending on one price element.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"TITLE_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23productTitle%22%2C%0A%5D%0A%0APRICE_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23corePrice_feature_div%20.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22%23apex_desktop%20.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22%23priceblock_ourprice%22%2C%0A%20%20%20%20%22%23priceblock_dealprice%22%2C%0A%5D%0A%0AAVAILABILITY_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23availability%22%2C%0A%5D\"><\/code><\/pre><\/figure>\n\n\n<p>These selectors are examples to test, not guaranteed Amazon-wide selectors. Amazon pages can vary by marketplace, product category, deal layout, and availability status. Always inspect the exact page you plan to track.<\/p>\n\n\n\n<p>Developers run into Amazon selector and CAPTCHA problems often. This Stack Overflow discussion about <a href=\"https:\/\/stackoverflow.com\/questions\/61978456\/trying-to-webscrape-the-price-from-an-amazon-page-using-the-css-selector-and-pyt\">Amazon CAPTCHA and price selector issues<\/a> is a useful example of why a scraper needs fallback selectors and response validation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-3-fetch-the-amazon-page-with-requests\">Step 3: Fetch the Amazon page with Requests<\/h2>\n\n\n\n<p>Now add a function that downloads the page HTML.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20requests%0A%0AHEADERS%20%3D%20%7B%0A%20%20%20%20%22User-Agent%22%3A%20%28%0A%20%20%20%20%20%20%20%20%22Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20%22%0A%20%20%20%20%20%20%20%20%22AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20%22%0A%20%20%20%20%20%20%20%20%22Chrome%2F126.0.0.0%20Safari%2F537.36%22%0A%20%20%20%20%29%2C%0A%20%20%20%20%22Accept-Language%22%3A%20%22en-US%2Cen%3Bq%3D0.9%22%2C%0A%7D%0A%0A%0Adef%20fetch_page%28url%2C%20proxies%3DNone%29%3A%0A%20%20%20%20response%20%3D%20requests.get%28%0A%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20headers%3DHEADERS%2C%0A%20%20%20%20%20%20%20%20proxies%3Dproxies%2C%0A%20%20%20%20%20%20%20%20timeout%3D30%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20response.raise_for_status%28%29%0A%0A%20%20%20%20html%20%3D%20response.text.lower%28%29%0A%20%20%20%20captcha_markers%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22captcha%22%2C%0A%20%20%20%20%20%20%20%20%22sorry%2C%20we%20just%20need%20to%20make%20sure%22%2C%0A%20%20%20%20%20%20%20%20%22robot%20check%22%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20if%20any%28marker%20in%20html%20for%20marker%20in%20captcha_markers%29%3A%0A%20%20%20%20%20%20%20%20raise%20RuntimeError%28%22Amazon%20returned%20a%20CAPTCHA%20or%20verification%20page.%22%29%0A%0A%20%20%20%20return%20response.text\"><\/code><\/pre><\/figure>\n\n\n<p>The custom headers make the request look closer to a normal browser request. This does not guarantee access, but it avoids sending the default Python Requests user agent.<\/p>\n\n\n\n<p>The CAPTCHA check is also important. A request can return a successful <code>200 OK<\/code> response and still contain a verification page instead of product data. <strong>Never treat a successful status code as proof that the scraper collected the right page.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-4-extract-title-price-and-availability\">Step 4: Extract title, price, and availability<\/h2>\n\n\n\n<p>Next, add BeautifulSoup and a few helper functions.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20re%0Afrom%20bs4%20import%20BeautifulSoup%0A%0A%0Adef%20first_text%28soup%2C%20selectors%29%3A%0A%20%20%20%20for%20selector%20in%20selectors%3A%0A%20%20%20%20%20%20%20%20element%20%3D%20soup.select_one%28selector%29%0A%20%20%20%20%20%20%20%20if%20element%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20text%20%3D%20element.get_text%28%22%20%22%2C%20strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20text%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20text%0A%0A%20%20%20%20return%20None%0A%0A%0Adef%20split_price_text%28soup%29%3A%0A%20%20%20%20price%20%3D%20%28%0A%20%20%20%20%20%20%20%20soup.select_one%28%22%23corePrice_feature_div%20.a-price%22%29%0A%20%20%20%20%20%20%20%20or%20soup.select_one%28%22%23apex_desktop%20.a-price%22%29%0A%20%20%20%20%20%20%20%20or%20soup.select_one%28%22.a-price%22%29%0A%20%20%20%20%29%0A%0A%20%20%20%20if%20not%20price%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20symbol%20%3D%20price.select_one%28%22.a-price-symbol%22%29%0A%20%20%20%20whole%20%3D%20price.select_one%28%22.a-price-whole%22%29%0A%20%20%20%20fraction%20%3D%20price.select_one%28%22.a-price-fraction%22%29%0A%0A%20%20%20%20if%20not%20whole%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20symbol_text%20%3D%20symbol.get_text%28strip%3DTrue%29%20if%20symbol%20else%20%22%22%0A%20%20%20%20whole_text%20%3D%20whole.get_text%28strip%3DTrue%29.replace%28%22.%22%2C%20%22%22%29%0A%20%20%20%20fraction_text%20%3D%20fraction.get_text%28strip%3DTrue%29%20if%20fraction%20else%20%2200%22%0A%0A%20%20%20%20return%20f%22%7Bsymbol_text%7D%7Bwhole_text%7D.%7Bfraction_text%7D%22%0A%0A%0Adef%20parse_price%28price_text%29%3A%0A%20%20%20%20if%20not%20price_text%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20match%20%3D%20re.search%28r%22%28%5Cd%2B%5B%5Cd%2C%5D%2A%5C.%3F%5Cd%2A%29%22%2C%20price_text.replace%28%22%2C%22%2C%20%22%22%29%29%0A%0A%20%20%20%20if%20not%20match%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20return%20float%28match.group%281%29%29\"><\/code><\/pre><\/figure>\n\n\n<p>\u0417\u043e\u043d\u0430 <code>first_text()<\/code> function tries several selectors and returns the first value it finds. This is useful because Amazon can place the price in different parts of the page.<\/p>\n\n\n\n<p>\u0417\u043e\u043d\u0430 <code>split_price_text()<\/code> function handles pages where the price is displayed as separate symbol, whole-number, and fraction elements. For example, <code>$23.99<\/code> may appear in the HTML as <code>$<\/code>, <code>23<\/code>, \u0438 <code>99<\/code>.<\/p>\n\n\n\n<p>\u0417\u043e\u043d\u0430 <code>parse_price()<\/code> function extracts a numeric value from the visible price text. This version assumes US-style prices such as <code>$49.99<\/code>. If you track another Amazon marketplace, adjust it for local currency and decimal formats.<\/p>\n\n\n\n<p>Now add the product scraping function:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"from%20datetime%20import%20datetime%0A%0A%0ATITLE_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23productTitle%22%2C%0A%5D%0A%0APRICE_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23corePrice_feature_div%20.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22%23apex_desktop%20.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22%23priceblock_ourprice%22%2C%0A%20%20%20%20%22%23priceblock_dealprice%22%2C%0A%5D%0A%0AAVAILABILITY_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23availability%22%2C%0A%5D%0A%0A%0Adef%20scrape_product%28url%2C%20proxies%3DNone%29%3A%0A%20%20%20%20html%20%3D%20fetch_page%28url%2C%20proxies%3Dproxies%29%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22lxml%22%29%0A%0A%20%20%20%20title%20%3D%20first_text%28soup%2C%20TITLE_SELECTORS%29%0A%20%20%20%20price_text%20%3D%20first_text%28soup%2C%20PRICE_SELECTORS%29%20or%20split_price_text%28soup%29%0A%20%20%20%20availability%20%3D%20first_text%28soup%2C%20AVAILABILITY_SELECTORS%29%0A%20%20%20%20price%20%3D%20parse_price%28price_text%29%0A%0A%20%20%20%20if%20not%20title%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22Product%20title%20was%20not%20found.%20Check%20the%20selector%20or%20page%20HTML.%22%29%0A%0A%20%20%20%20if%20price%20is%20None%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22Product%20price%20was%20not%20found.%20Check%20the%20selector%20or%20page%20HTML.%22%29%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22timestamp%22%3A%20datetime.utcnow%28%29.isoformat%28timespec%3D%22seconds%22%29%2C%0A%20%20%20%20%20%20%20%20%22title%22%3A%20title%2C%0A%20%20%20%20%20%20%20%20%22price_text%22%3A%20price_text%2C%0A%20%20%20%20%20%20%20%20%22price%22%3A%20price%2C%0A%20%20%20%20%20%20%20%20%22availability%22%3A%20availability%20or%20%22Unknown%22%2C%0A%20%20%20%20%20%20%20%20%22url%22%3A%20url%2C%0A%20%20%20%20%7D\"><\/code><\/pre><\/figure>\n\n\n<p>This function does one useful thing for reliability: it fails loudly when the title or price is missing. That is better than saving an empty value and discovering later that the CSV is full of broken rows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-5-save-amazon-price-history-to-csv\">Step 5: Save Amazon price history to CSV<\/h2>\n\n\n\n<p>A price tracker becomes more useful when every check is saved. Add this CSV function:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20csv%0Afrom%20pathlib%20import%20Path%0A%0A%0ACSV_FILE%20%3D%20Path%28%22amazon_price_history.csv%22%29%0A%0AFIELDNAMES%20%3D%20%5B%0A%20%20%20%20%22timestamp%22%2C%0A%20%20%20%20%22title%22%2C%0A%20%20%20%20%22price_text%22%2C%0A%20%20%20%20%22price%22%2C%0A%20%20%20%20%22availability%22%2C%0A%20%20%20%20%22url%22%2C%0A%5D%0A%0A%0Adef%20save_to_csv%28record%29%3A%0A%20%20%20%20file_exists%20%3D%20CSV_FILE.exists%28%29%0A%0A%20%20%20%20with%20CSV_FILE.open%28%22a%22%2C%20newline%3D%22%22%2C%20encoding%3D%22utf-8%22%29%20as%20file%3A%0A%20%20%20%20%20%20%20%20writer%20%3D%20csv.DictWriter%28file%2C%20fieldnames%3DFIELDNAMES%29%0A%0A%20%20%20%20%20%20%20%20if%20not%20file_exists%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20writer.writeheader%28%29%0A%0A%20%20%20%20%20%20%20%20writer.writerow%28record%29\"><\/code><\/pre><\/figure>\n\n\n<p>\u0417\u043e\u043d\u0430 <code>newline=\"\"<\/code> setting follows Python\u2019s <a href=\"https:\/\/docs.python.org\/3\/library\/csv.html\">CSV documentation<\/a> and helps avoid extra blank lines on some systems.<\/p>\n\n\n\n<p>After the script runs, the CSV file will look like this:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>timestamp<\/th><th>title<\/th><th>price_text<\/th><th>\u0446\u0435\u043d\u0430<\/th><th>\u043d\u0430\u043b\u0438\u0447\u0438\u0435<\/th><th>url<\/th><\/tr><tr><td>2026-07-24T10:15:30<\/td><td>Owala FreeSip Insulated Stainless Steel Water Bottle<\/td><td>$23.99<\/td><td>23.99<\/td><td>In Stock<\/td><td>Amazon product URL<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>This simple history file is enough for a first version. Later, you can move the data into Google Sheets, a database, or a dashboard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-6-track-multiple-amazon-products\">Step 6: Track multiple Amazon products<\/h2>\n\n\n\n<p>Now add a list of product URLs. Replace the example URLs with real Amazon product pages.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"PRODUCT_URLS%20%3D%20%5B%0A%20%20%20%20%22https%3A%2F%2Fwww.amazon.com%2Fdp%2FASIN1%22%2C%0A%20%20%20%20%22https%3A%2F%2Fwww.amazon.com%2Fdp%2FASIN2%22%2C%0A%5D\"><\/code><\/pre><\/figure>\n\n\n<p>Then add a main function that loops through each product.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"from%20time%20import%20sleep%0A%0A%0Adef%20main%28%29%3A%0A%20%20%20%20for%20url%20in%20PRODUCT_URLS%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20record%20%3D%20scrape_product%28url%29%0A%20%20%20%20%20%20%20%20%20%20%20%20save_to_csv%28record%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Brecord%5B%27title%27%5D%7D%20%7C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Brecord%5B%27price_text%27%5D%7D%20%7C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Brecord%5B%27availability%27%5D%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20sleep%2810%29%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20error%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Failed%20to%20track%20%7Burl%7D%3A%20%7Berror%7D%22%29%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20main%28%29\"><\/code><\/pre><\/figure>\n\n\n<p>\u0417\u043e\u043d\u0430 <code>sleep(10)<\/code> delay keeps the script from requesting pages too quickly. For real tracking, avoid aggressive request rates. A price tracker usually does not need to check the same product every few seconds.<\/p>\n\n\n\n<p>If you want more general scraping examples, NodeMaven has a guide to <a href=\"https:\/\/nodemaven.com\/ru\/blog\/python-web-scraping\/\">Python web scraping<\/a> and a separate comparison of <a href=\"https:\/\/nodemaven.com\/ru\/blog\/web-scraping-tools\/\">\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u0435\u0431-\u0441\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433\u0430<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-7-add-price-drop-alerts-and-scheduling\">Step 7: Add price drop alerts and scheduling<\/h2>\n\n\n\n<p>A basic alert can run directly in the terminal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-add-a-target-price\">Add a target price<\/h3>\n\n\n\n<p>Add this near the top of your script:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"TARGET_PRICE%20%3D%2050.00\"><\/code><\/pre><\/figure>\n\n\n<p>Then update the loop inside <code>\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f()<\/code>:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"if%20record%5B%22price%22%5D%20%3C%3D%20TARGET_PRICE%3A%0A%20%20%20%20print%28f%22Price%20alert%3A%20%7Brecord%5B%27title%27%5D%7D%20is%20now%20%7Brecord%5B%27price_text%27%5D%7D%22%29\"><\/code><\/pre><\/figure>\n\n\n<p>This does not send an email or Telegram message yet. It simply prints a message when the price is below your target.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-schedule-the-tracker\">Schedule the tracker<\/h3>\n\n\n\n<p>For a simple setup, you can run the script manually once a day.<\/p>\n\n\n\n<p>On macOS or Linux, you can later use cron. On Windows, you can use Task Scheduler. If you prefer a no-code setup, start with manual runs first and only automate once the script returns clean data.<\/p>\n\n\n\n<p>For a real price monitoring workflow, store:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041c\u0430\u0440\u043a\u0435\u0442\u043f\u043b\u0435\u0439\u0441<\/li>\n\n\n\n<li>Region or ZIP code<\/li>\n\n\n\n<li>Timestamp<\/li>\n\n\n\n<li>\u0426\u0435\u043d\u0430<\/li>\n\n\n\n<li>\u043d\u0430\u043b\u0438\u0447\u0438\u0435<\/li>\n\n\n\n<li>Product URL<\/li>\n\n\n\n<li>Error status, if the request failed<\/li>\n<\/ul>\n\n\n\n<p>That extra context helps explain why a price changed. A lower price may come from a real discount, but it may also come from a different region, seller, coupon, or shipping setup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-8-add-proxies-for-more-reliable-amazon-tracking\">Step 8: Add proxies for more reliable Amazon tracking<\/h2>\n\n\n\n<p>For a few manual tests, you may not need proxies. Once the tracker runs more often, checks several products, or compares prices by location, one local IP becomes a weak point.<\/p>\n\n\n\n<p>Amazon may show different product data depending on the visible location. It can also return CAPTCHAs, unavailable pages, or inconsistent shipping details when the request pattern looks unusual.<\/p>\n\n\n\n<p>\u0412\u043e\u0442 \u0433\u0434\u0435 <strong><a href=\"https:\/\/nodemaven.com\/ru\/proxies\/residential-proxies\/\" data-type=\"proxies\" data-id=\"36421\">\u0447\u0438\u0441\u0442\u044b\u0435 \u0436\u0438\u043b\u044b\u0435 \u043f\u0440\u043e\u043a\u0441\u0438<\/a><\/strong> \u0438 <strong>sticky \u0441\u0435\u0441\u0441\u0438\u0438<\/strong> help. They let the tracker keep a stable region and avoid putting every request through the same local IP.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Track local Amazon prices with fewer failed requests<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">NodeMaven residential proxies help Python scrapers collect Amazon pricing data with cleaner IPs, stable sessions, and geo-targeting for regional price checks. Start with <b>750 \u041c\u0411 \u0434\u043b\u044f $3.50<\/b>.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c        <\/a>\n    <\/div>\n<\/div>\n\n\n<p>For Amazon specifically, NodeMaven\u2019s <a href=\"https:\/\/nodemaven.com\/ru\/websites\/amazon-proxy\/\">\u0410\u043c\u0430\u0437\u043e\u043d \u043f\u0440\u043e\u043a\u0441\u0438<\/a> are useful when you need:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Region-specific prices<\/strong><\/li>\n\n\n\n<li><strong>\u0422\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/strong><\/li>\n\n\n\n<li><strong>Stable sessions for repeated checks<\/strong><\/li>\n\n\n\n<li><strong>Cleaner IP quality than public proxies or cheap VPNs<\/strong><\/li>\n\n\n\n<li><strong>Residential IPs that look closer to normal user traffic<\/strong><\/li>\n<\/ul>\n\n\n\n<p>For a deeper proxy setup, read NodeMaven\u2019s guide to building a <a href=\"https:\/\/nodemaven.com\/ru\/blog\/how-to-build-reliable-web-scraping-proxy-pool\/\">reliable web scraping proxy pool<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-add-a-proxy-to-the-script\">Add a proxy to the script<\/h3>\n\n\n\n<p>If you want to use proxies, replace the earlier <code>fetch_page()<\/code> function with this version.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"PROXIES%20%3D%20%7B%0A%20%20%20%20%22http%22%3A%20%22http%3A%2F%2FUSERNAME%3APASSWORD%40gate.nodemaven.com%3A8080%22%2C%0A%20%20%20%20%22https%22%3A%20%22http%3A%2F%2FUSERNAME%3APASSWORD%40gate.nodemaven.com%3A8080%22%2C%0A%7D%0A%0A%0Adef%20fetch_page%28url%2C%20proxies%3DNone%29%3A%0A%20%20%20%20response%20%3D%20requests.get%28%0A%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20headers%3DHEADERS%2C%0A%20%20%20%20%20%20%20%20proxies%3Dproxies%2C%0A%20%20%20%20%20%20%20%20timeout%3D30%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20response.raise_for_status%28%29%0A%0A%20%20%20%20html%20%3D%20response.text.lower%28%29%0A%20%20%20%20captcha_markers%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22captcha%22%2C%0A%20%20%20%20%20%20%20%20%22sorry%2C%20we%20just%20need%20to%20make%20sure%22%2C%0A%20%20%20%20%20%20%20%20%22robot%20check%22%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20if%20any%28marker%20in%20html%20for%20marker%20in%20captcha_markers%29%3A%0A%20%20%20%20%20%20%20%20raise%20RuntimeError%28%22Amazon%20returned%20a%20CAPTCHA%20or%20verification%20page.%22%29%0A%0A%20%20%20%20return%20response.text\"><\/code><\/pre><\/figure>\n\n\n<p>Then pass the proxy into <code>scrape_product()<\/code>:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"record%20%3D%20scrape_product%28url%2C%20proxies%3DPROXIES%29\"><\/code><\/pre><\/figure>\n\n\n<p>Do not hardcode real proxy credentials in a shared file or public repository. Use environment variables if the script will be stored in GitHub or used by a team.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-choose-the-right-proxy-session\">Choose the right proxy session<\/h3>\n\n\n\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>sticky residential session<\/strong> when you want one product or one region to stay consistent during a tracking run. This is useful when Amazon stores location settings, shipping state, or cookies.<\/p>\n\n\n\n<p>Use rotation only when each request is independent. Randomly changing IPs during the same product flow can create mismatched prices, extra verification, or inconsistent results.<\/p>\n\n\n\n<p>NodeMaven\u2019s guide to <a href=\"https:\/\/nodemaven.com\/ru\/blog\/mobile-vs-residential-vs-datacenter-proxies-whats-the-difference\/\">residential, mobile, and datacenter proxies<\/a> explains which proxy type fits different scraping workflows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-common-amazon-price-tracker-errors-and-fixes\">Common Amazon price tracker errors and fixes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-amazon-returns-a-503-or-403-error\">Amazon returns a 503 or 403 error<\/h3>\n\n\n\n<p>Amazon may reject a request when it does not like the request pattern, IP reputation, headers, or traffic source. Developers also discuss this in Stack Overflow threads about <a href=\"https:\/\/stackoverflow.com\/questions\/48992650\/amazon-price-web-scraping-with-python-requests-and-bs4\">Amazon 503 errors with Requests and BeautifulSoup<\/a>.<\/p>\n\n\n\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Slow down the request rate.<\/li>\n\n\n\n<li>Check that your headers are set.<\/li>\n\n\n\n<li>Save the returned HTML and inspect it.<\/li>\n\n\n\n<li>Avoid running repeated requests from weak or overused IPs.<\/li>\n\n\n\n<li>Use clean residential proxies if the tracker runs at higher volume.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-amazon-shows-a-captcha-page\">Amazon shows a CAPTCHA page<\/h3>\n\n\n\n<p>If Amazon returns a CAPTCHA page, the scraper received verification HTML instead of product HTML. The script in this tutorial checks for common CAPTCHA text and raises an error.<\/p>\n\n\n\n<p>When this happens, reduce request frequency and check whether your headers, session behavior, and proxy quality make sense for the volume you are running. <strong>Clean residential proxies can help reduce CAPTCHA triggers caused by poor IP reputation<\/strong>, but they do not replace sensible request timing or response validation.<\/p>\n\n\n\n<p>Do not save CAPTCHA pages as product data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-the-title-is-missing\">The title is missing<\/h3>\n\n\n\n<p>If the script cannot find the title, inspect the product page again.<\/p>\n\n\n\n<p>The common selector is:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"%22%23productTitle%22\"><\/code><\/pre><\/figure>\n\n\n<p>If the page uses a different layout, add another selector to <code>TITLE_SELECTORS<\/code>.<\/p>\n\n\n\n<p>Also check whether the returned HTML is actually the product page. Sometimes the script receives a consent page, redirect page, or verification page instead.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-the-price-is-missing\">The price is missing<\/h3>\n\n\n\n<p>Amazon prices can appear in different parts of the page. Some pages use offscreen price text, while others split the visible price into symbol, whole number, and fraction.<\/p>\n\n\n\n<p>This is why the script uses both:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"PRICE_SELECTORS\"><\/code><\/pre><\/figure>\n\n\n<p>and:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"split_price_text%28%29\"><\/code><\/pre><\/figure>\n\n\n<p>If both fail, save the HTML and inspect the price section manually.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-the-price-is-different-from-your-browser\">The price is different from your browser<\/h3>\n\n\n\n<p>Amazon prices may vary by country, ZIP code, shipping location, marketplace, cookies, and logged-in state. A product may also show coupons, limited-time discounts, or different buying options.<\/p>\n\n\n\n<p>To reduce mismatches:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Keep the region consistent.<\/strong><\/li>\n\n\n\n<li>Store the marketplace and region in your CSV.<\/li>\n\n\n\n<li>Use a sticky session if location consistency matters.<\/li>\n\n\n\n<li>Compare the visible IP and location before comparing prices.<\/li>\n\n\n\n<li>Use ZIP-level targeting when shipping location affects the result.<\/li>\n<\/ul>\n\n\n\n<p>NodeMaven supports precise geo-targeting, including <a href=\"https:\/\/nodemaven.com\/ru\/features\/zip-level-targeting\/\">\u0422\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/a>, which is useful when a tracker needs to compare Amazon prices, availability, and delivery options from a specific buyer location.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Track local Amazon prices with fewer failed requests<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">NodeMaven residential proxies help Python scrapers collect Amazon pricing data with cleaner IPs, stable sessions, and geo-targeting for regional price checks. Start with <b>750 \u041c\u0411 \u0434\u043b\u044f $3.50<\/b>.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c        <\/a>\n    <\/div>\n<\/div>\n\n\n<p>If Requests cannot access the visible page content, <a href=\"https:\/\/nodemaven.com\/ru\/blog\/selenium-scraping\/\">\u0421\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433 \u0441 Selenium<\/a> may be a better option because it opens a browser and works with rendered pages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-full-amazon-price-tracker-code\">Full Amazon price tracker code<\/h2>\n\n\n\n<p>Here is the complete script.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20csv%0Aimport%20re%0Afrom%20datetime%20import%20datetime%0Afrom%20pathlib%20import%20Path%0Afrom%20time%20import%20sleep%0A%0Aimport%20requests%0Afrom%20bs4%20import%20BeautifulSoup%0A%0A%0APRODUCT_URLS%20%3D%20%5B%0A%20%20%20%20%22https%3A%2F%2Fwww.amazon.com%2Fdp%2FASIN1%22%2C%0A%20%20%20%20%22https%3A%2F%2Fwww.amazon.com%2Fdp%2FASIN2%22%2C%0A%5D%0A%0ATARGET_PRICE%20%3D%2050.00%0ACSV_FILE%20%3D%20Path%28%22amazon_price_history.csv%22%29%0A%0AHEADERS%20%3D%20%7B%0A%20%20%20%20%22User-Agent%22%3A%20%28%0A%20%20%20%20%20%20%20%20%22Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20%22%0A%20%20%20%20%20%20%20%20%22AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20%22%0A%20%20%20%20%20%20%20%20%22Chrome%2F126.0.0.0%20Safari%2F537.36%22%0A%20%20%20%20%29%2C%0A%20%20%20%20%22Accept-Language%22%3A%20%22en-US%2Cen%3Bq%3D0.9%22%2C%0A%7D%0A%0ATITLE_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23productTitle%22%2C%0A%5D%0A%0APRICE_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23corePrice_feature_div%20.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22%23apex_desktop%20.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22.a-price%20.a-offscreen%22%2C%0A%20%20%20%20%22%23priceblock_ourprice%22%2C%0A%20%20%20%20%22%23priceblock_dealprice%22%2C%0A%5D%0A%0AAVAILABILITY_SELECTORS%20%3D%20%5B%0A%20%20%20%20%22%23availability%22%2C%0A%5D%0A%0AFIELDNAMES%20%3D%20%5B%0A%20%20%20%20%22timestamp%22%2C%0A%20%20%20%20%22title%22%2C%0A%20%20%20%20%22price_text%22%2C%0A%20%20%20%20%22price%22%2C%0A%20%20%20%20%22availability%22%2C%0A%20%20%20%20%22url%22%2C%0A%5D%0A%0APROXIES%20%3D%20None%0A%0A%23%20To%20use%20a%20proxy%2C%20replace%20None%20above%20with%20this%20structure%3A%0A%23%20PROXIES%20%3D%20%7B%0A%23%20%20%20%20%20%22http%22%3A%20%22http%3A%2F%2FUSERNAME%3APASSWORD%40gate.nodemaven.com%3A8080%22%2C%0A%23%20%20%20%20%20%22https%22%3A%20%22http%3A%2F%2FUSERNAME%3APASSWORD%40gate.nodemaven.com%3A8080%22%2C%0A%23%20%7D%0A%0A%0Adef%20fetch_page%28url%2C%20proxies%3DNone%29%3A%0A%20%20%20%20response%20%3D%20requests.get%28%0A%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20headers%3DHEADERS%2C%0A%20%20%20%20%20%20%20%20proxies%3Dproxies%2C%0A%20%20%20%20%20%20%20%20timeout%3D30%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20response.raise_for_status%28%29%0A%0A%20%20%20%20html%20%3D%20response.text.lower%28%29%0A%20%20%20%20captcha_markers%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22captcha%22%2C%0A%20%20%20%20%20%20%20%20%22sorry%2C%20we%20just%20need%20to%20make%20sure%22%2C%0A%20%20%20%20%20%20%20%20%22robot%20check%22%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20if%20any%28marker%20in%20html%20for%20marker%20in%20captcha_markers%29%3A%0A%20%20%20%20%20%20%20%20raise%20RuntimeError%28%22Amazon%20returned%20a%20CAPTCHA%20or%20verification%20page.%22%29%0A%0A%20%20%20%20return%20response.text%0A%0A%0Adef%20save_debug_html%28html%2C%20filename%3D%22debug_amazon_page.html%22%29%3A%0A%20%20%20%20Path%28filename%29.write_text%28html%2C%20encoding%3D%22utf-8%22%29%0A%0A%0Adef%20first_text%28soup%2C%20selectors%29%3A%0A%20%20%20%20for%20selector%20in%20selectors%3A%0A%20%20%20%20%20%20%20%20element%20%3D%20soup.select_one%28selector%29%0A%20%20%20%20%20%20%20%20if%20element%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20text%20%3D%20element.get_text%28%22%20%22%2C%20strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20text%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20text%0A%0A%20%20%20%20return%20None%0A%0A%0Adef%20split_price_text%28soup%29%3A%0A%20%20%20%20price%20%3D%20%28%0A%20%20%20%20%20%20%20%20soup.select_one%28%22%23corePrice_feature_div%20.a-price%22%29%0A%20%20%20%20%20%20%20%20or%20soup.select_one%28%22%23apex_desktop%20.a-price%22%29%0A%20%20%20%20%20%20%20%20or%20soup.select_one%28%22.a-price%22%29%0A%20%20%20%20%29%0A%0A%20%20%20%20if%20not%20price%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20symbol%20%3D%20price.select_one%28%22.a-price-symbol%22%29%0A%20%20%20%20whole%20%3D%20price.select_one%28%22.a-price-whole%22%29%0A%20%20%20%20fraction%20%3D%20price.select_one%28%22.a-price-fraction%22%29%0A%0A%20%20%20%20if%20not%20whole%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20symbol_text%20%3D%20symbol.get_text%28strip%3DTrue%29%20if%20symbol%20else%20%22%22%0A%20%20%20%20whole_text%20%3D%20whole.get_text%28strip%3DTrue%29.replace%28%22.%22%2C%20%22%22%29%0A%20%20%20%20fraction_text%20%3D%20fraction.get_text%28strip%3DTrue%29%20if%20fraction%20else%20%2200%22%0A%0A%20%20%20%20return%20f%22%7Bsymbol_text%7D%7Bwhole_text%7D.%7Bfraction_text%7D%22%0A%0A%0Adef%20parse_price%28price_text%29%3A%0A%20%20%20%20if%20not%20price_text%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20match%20%3D%20re.search%28r%22%28%5Cd%2B%5B%5Cd%2C%5D%2A%5C.%3F%5Cd%2A%29%22%2C%20price_text.replace%28%22%2C%22%2C%20%22%22%29%29%0A%0A%20%20%20%20if%20not%20match%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20return%20float%28match.group%281%29%29%0A%0A%0Adef%20scrape_product%28url%2C%20proxies%3DNone%29%3A%0A%20%20%20%20html%20%3D%20fetch_page%28url%2C%20proxies%3Dproxies%29%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22lxml%22%29%0A%0A%20%20%20%20title%20%3D%20first_text%28soup%2C%20TITLE_SELECTORS%29%0A%20%20%20%20price_text%20%3D%20first_text%28soup%2C%20PRICE_SELECTORS%29%20or%20split_price_text%28soup%29%0A%20%20%20%20availability%20%3D%20first_text%28soup%2C%20AVAILABILITY_SELECTORS%29%0A%20%20%20%20price%20%3D%20parse_price%28price_text%29%0A%0A%20%20%20%20if%20not%20title%3A%0A%20%20%20%20%20%20%20%20save_debug_html%28html%29%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22Product%20title%20was%20not%20found.%20Check%20debug_amazon_page.html.%22%29%0A%0A%20%20%20%20if%20price%20is%20None%3A%0A%20%20%20%20%20%20%20%20save_debug_html%28html%29%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22Product%20price%20was%20not%20found.%20Check%20debug_amazon_page.html.%22%29%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22timestamp%22%3A%20datetime.utcnow%28%29.isoformat%28timespec%3D%22seconds%22%29%2C%0A%20%20%20%20%20%20%20%20%22title%22%3A%20title%2C%0A%20%20%20%20%20%20%20%20%22price_text%22%3A%20price_text%2C%0A%20%20%20%20%20%20%20%20%22price%22%3A%20price%2C%0A%20%20%20%20%20%20%20%20%22availability%22%3A%20availability%20or%20%22Unknown%22%2C%0A%20%20%20%20%20%20%20%20%22url%22%3A%20url%2C%0A%20%20%20%20%7D%0A%0A%0Adef%20save_to_csv%28record%29%3A%0A%20%20%20%20file_exists%20%3D%20CSV_FILE.exists%28%29%0A%0A%20%20%20%20with%20CSV_FILE.open%28%22a%22%2C%20newline%3D%22%22%2C%20encoding%3D%22utf-8%22%29%20as%20file%3A%0A%20%20%20%20%20%20%20%20writer%20%3D%20csv.DictWriter%28file%2C%20fieldnames%3DFIELDNAMES%29%0A%0A%20%20%20%20%20%20%20%20if%20not%20file_exists%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20writer.writeheader%28%29%0A%0A%20%20%20%20%20%20%20%20writer.writerow%28record%29%0A%0A%0Adef%20main%28%29%3A%0A%20%20%20%20for%20url%20in%20PRODUCT_URLS%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20record%20%3D%20scrape_product%28url%2C%20proxies%3DPROXIES%29%0A%20%20%20%20%20%20%20%20%20%20%20%20save_to_csv%28record%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Brecord%5B%27title%27%5D%7D%20%7C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Brecord%5B%27price_text%27%5D%7D%20%7C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Brecord%5B%27availability%27%5D%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20record%5B%22price%22%5D%20%3C%3D%20TARGET_PRICE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Price%20alert%3A%20%7Brecord%5B%27title%27%5D%7D%20is%20now%20%7Brecord%5B%27price_text%27%5D%7D%22%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20sleep%2810%29%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20error%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Failed%20to%20track%20%7Burl%7D%3A%20%7Berror%7D%22%29%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20main%28%29\"><\/code><\/pre><\/figure>\n\n\n<h2 class=\"wp-block-heading\">How NodeMaven improves Amazon price tracking<\/h2>\n\n\n\n<p>Amazon price tracking is more reliable when the scraper keeps a <strong>consistent location, clean IP reputation, and stable session behavior<\/strong>.<\/p>\n\n\n\n<p>NodeMaven helps with the parts that usually break price trackers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0420\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438:<\/strong> use real-user IPs instead of noisy VPN or datacenter addresses.<\/li>\n\n\n\n<li><strong>Sticky sessions<\/strong> keep the same IP while checking a product, category, or regional flow.<\/li>\n\n\n\n<li><strong>\u0422\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433 \u043f\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443<\/strong> compare prices, delivery options, and availability from specific buyer locations.<\/li>\n\n\n\n<li><strong>Clean IP quality:<\/strong> reduce failed requests, CAPTCHA triggers, and unreliable page responses.<\/li>\n\n\n\n<li><strong>\u0413\u0438\u0431\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430:<\/strong> use HTTP or SOCKS5 proxies with Python, browser automation tools, or scraping stacks.<\/li>\n<\/ul>\n\n\n\n<p>For Amazon monitoring, this means fewer mismatched regional results and cleaner price history.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Track local Amazon prices with fewer failed requests<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">NodeMaven residential proxies help Python scrapers collect Amazon pricing data with cleaner IPs, stable sessions, and geo-targeting for regional price checks. Start with <b>750 \u041c\u0411 \u0434\u043b\u044f $3.50<\/b>.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n\n\n\n<p>A simple Amazon price tracker is a useful first scraping project because it shows the full workflow: fetching the page, checking selectors, extracting values, validating the response, and saving price history. Start with one or two products first, then add scheduling, alerts, and browser rendering only when the tracker needs them. For Amazon, <strong>clean proxies matter once you move beyond testing<\/strong>, because price, stock, delivery dates, and CAPTCHA frequency can all change depending on IP quality and location. NodeMaven residential proxies help keep tracking sessions cleaner and more consistent with sticky sessions and ZIP-level targeting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-faq\">FAQ<\/h2>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-faq so-widget-rhinocore-addons-faq-default-d75171398898\"\n\t\t\t\n\t\t>    <div class=\"rhino-widget rhino-widget--rhinocore-addons-faq section-faq\">\n        <div class=\"section-faq__list section-faq__list--columns-1\" role=\"list\" aria-label=\"\u0427\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0432 Telegram\">\n                            <div class=\"section-faq__column\">\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can I build an Amazon price tracker with Python?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">Yes. You can build an Amazon price tracker with Python using Requests, BeautifulSoup, and CSV storage. The script should also check for missing selectors, CAPTCHA pages, and regional price differences before saving data.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Is scraping Amazon prices legal?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">It depends on what you collect, how you collect it, and how you use the data. Review Amazon\u2019s <a href=\"https:\/\/www.amazon.com\/gp\/help\/customer\/display.html?nodeId=508088\">Conditions of Use<\/a>, consider the <a href=\"https:\/\/webservices.amazon.com\/paapi5\/documentation\/\">Product Advertising API<\/a> for approved use cases, and read a broader guide on <a href=\"https:\/\/nodemaven.com\/ru\/blog\/is-web-scraping-legal\/\">whether web scraping is legal<\/a>.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Why does my Amazon scraper get a CAPTCHA?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">Amazon may show a CAPTCHA when the request pattern, IP reputation, headers, or session behavior looks suspicious. Slow down requests, inspect the returned HTML, use realistic headers, and consider clean residential proxies if the tracker runs at higher volume.<\/p>\n<h3>\u00a0<\/h3>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Why is the Amazon price different in my scraper?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">Amazon prices can vary by marketplace, ZIP code, shipping location, cookies, login state, coupons, and seller availability. <a href=\"https:\/\/nodemaven.com\/ru\/proxies\/residential-proxies\/\">\u0420\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438<\/a> help you check local prices with IPs in 190+ countries with region, city and ZIP-level targeting options.<\/p>\n<h3>\u00a0<\/h3>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Should I use proxies for an Amazon price tracker?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">For a small manual test, proxies may not be necessary. For repeated checks, regional price tracking, or higher-volume monitoring, proxies help keep access more consistent. Residential proxies with sticky sessions are usually the best starting point for Amazon price monitoring.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">What is the best proxy type for Amazon price tracking?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">Residential proxies are usually the best fit for Amazon price tracking because they use real consumer-network IPs. Sticky sessions help keep the same IP during related requests, while ZIP-level targeting helps when prices and shipping options depend on buyer location.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can this script track multiple Amazon products?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p data-pm-slice=\"1 1 []\">Yes. Add more product URLs to the <code>PRODUCT_URLS<\/code> list. Start with a small list first, confirm that the CSV output is correct, then increase the number of products slowly.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                    <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking","protected":false},"author":68,"featured_media":39835,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[213,205],"class_list":["post-39826","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guides-tutorials","tag-web-scraping"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.1 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Build an Amazon Price Tracker With Python | NodeMaven<\/title>\n<meta name=\"description\" content=\"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nodemaven.com\/ru\/blog\/amazon-price-tracker-python\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Build an Amazon Price Tracker With Python\" \/>\n<meta property=\"og:description\" content=\"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nodemaven.com\/ru\/blog\/amazon-price-tracker-python\/\" \/>\n<meta property=\"og:site_name\" content=\"NodeMaven\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-24T11:54:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-24T12:00:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/amazon-price-tracking.png\" \/>\n\t<meta property=\"og:image:width\" content=\"870\" \/>\n\t<meta property=\"og:image:height\" content=\"490\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Anna\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anna\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 \u043c\u0438\u043d\u0443\u0442\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/\"},\"author\":{\"name\":\"Anna\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/f3bc93327b3582e735259d2a98f7a7ff\"},\"headline\":\"How to Build an Amazon Price Tracker With Python\",\"datePublished\":\"2026-07-24T11:54:28+00:00\",\"dateModified\":\"2026-07-24T12:00:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/\"},\"wordCount\":2110,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/amazon-price-tracking.png\",\"keywords\":[\"Guides &amp; Tutorials\",\"Web Scraping\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/\",\"name\":\"How to Build an Amazon Price Tracker With Python | NodeMaven\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/amazon-price-tracking.png\",\"datePublished\":\"2026-07-24T11:54:28+00:00\",\"dateModified\":\"2026-07-24T12:00:30+00:00\",\"description\":\"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/amazon-price-tracking.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/amazon-price-tracking.png\",\"width\":870,\"height\":490,\"caption\":\"Amazon Price Tracker Tutorial | NodeMaven\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nodemaven.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Build an Amazon Price Tracker With Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"name\":\"NodeMaven\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nodemaven.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ru-RU\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\",\"name\":\"NodeMaven\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/people\\\/NodeMaven\\\/100095402507825\\\/\",\"https:\\\/\\\/t.me\\\/NodeMavenTG\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nodemaven\\\/\"],\"telephone\":[],\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"23:59\"}],\"legalName\":\"NodeMaven FZ LLC\",\"email\":\"support@nodemaven.com\",\"description\":\"NodeMaven is a proxy infrastructure provider offering residential, mobile, and ISP proxies with IP quality filtering, precise geo-targeting, HTTPS and SOCKS5 support, and developer APIs.\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@nodemaven.com\"},{\"@type\":\"ContactPoint\",\"contactType\":\"legal\",\"email\":\"legal.public@nodemaven.com\"}],\"award\":[\"People Love Us, awarded by Trustpilot (2025)\",\"Top Rated, awarded by Top Business Software (2025)\",\"Customers Love Us, awarded by Sourceforge (2025)\",\"Users Love Us, awarded by G2 (2025)\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/f3bc93327b3582e735259d2a98f7a7ff\",\"name\":\"Anna\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"caption\":\"Anna\"},\"description\":\"Anna is a content manager at NodeMaven, and she specialises in turning complex technical topics into clear, practical guides backed by industry research, hands-on testing, and popular use cases.\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/author\\\/anna-radziuk\\\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/amazon-price-tracker-python\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"width\":512,\"height\":512,\"caption\":\"NodeMaven\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Build an Amazon Price Tracker With Python | NodeMaven","description":"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nodemaven.com\/ru\/blog\/amazon-price-tracker-python\/","og_locale":"ru_RU","og_type":"article","og_title":"How to Build an Amazon Price Tracker With Python","og_description":"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking","og_url":"https:\/\/nodemaven.com\/ru\/blog\/amazon-price-tracker-python\/","og_site_name":"NodeMaven","article_publisher":"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","article_published_time":"2026-07-24T11:54:28+00:00","article_modified_time":"2026-07-24T12:00:30+00:00","og_image":[{"width":870,"height":490,"url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/amazon-price-tracking.png","type":"image\/png"}],"author":"Anna","twitter_card":"summary_large_image","twitter_misc":{"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c":"Anna","\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f":"10 \u043c\u0438\u043d\u0443\u0442"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#article","isPartOf":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/"},"author":{"name":"Anna","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/f3bc93327b3582e735259d2a98f7a7ff"},"headline":"How to Build an Amazon Price Tracker With Python","datePublished":"2026-07-24T11:54:28+00:00","dateModified":"2026-07-24T12:00:30+00:00","mainEntityOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/"},"wordCount":2110,"commentCount":0,"publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/amazon-price-tracking.png","keywords":["Guides &amp; Tutorials","Web Scraping"],"articleSection":["Uncategorized"],"inLanguage":"ru-RU","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/nodemaven.com\/ru\/#organization"}},{"@type":"WebPage","@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/","url":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/","name":"How to Build an Amazon Price Tracker With Python | NodeMaven","isPartOf":{"@id":"https:\/\/nodemaven.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#primaryimage"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/amazon-price-tracking.png","datePublished":"2026-07-24T11:54:28+00:00","dateModified":"2026-07-24T12:00:30+00:00","description":"Build an Amazon price tracker with Python. Scrape prices, save history, add alerts, handle Amazon blocks, and use proxies for reliable tracking","breadcrumb":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/"]}]},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#primaryimage","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/amazon-price-tracking.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/amazon-price-tracking.png","width":870,"height":490,"caption":"Amazon Price Tracker Tutorial | NodeMaven"},{"@type":"BreadcrumbList","@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nodemaven.com\/"},{"@type":"ListItem","position":2,"name":"How to Build an Amazon Price Tracker With Python"}]},{"@type":"WebSite","@id":"https:\/\/nodemaven.com\/#website","url":"https:\/\/nodemaven.com\/","name":"NodeMaven","description":"","publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nodemaven.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ru-RU"},{"@type":["Organization","Place"],"@id":"https:\/\/nodemaven.com\/#organization","name":"NodeMaven","url":"https:\/\/nodemaven.com\/","logo":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#local-main-organization-logo"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","https:\/\/t.me\/NodeMavenTG","https:\/\/www.linkedin.com\/company\/nodemaven\/"],"telephone":[],"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"opens":"00:00","closes":"23:59"}],"legalName":"NodeMaven FZ LLC","email":"support@nodemaven.com","description":"NodeMaven \u2014 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043f\u0440\u043e\u043a\u0441\u0438-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u043d\u044b\u0435, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 ISP-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 IP, \u0442\u043e\u0447\u043d\u044b\u043c \u0433\u0435\u043e-\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 HTTPS \u0438 SOCKS5, \u0430 \u0442\u0430\u043a\u0436\u0435 API \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.","contactPoint":[{"@type":"ContactPoint","contactType":"customer support","email":"support@nodemaven.com"},{"@type":"ContactPoint","contactType":"legal","email":"legal.public@nodemaven.com"}],"award":["People Love Us, awarded by Trustpilot (2025)","Top Rated, awarded by Top Business Software (2025)","Customers Love Us, awarded by Sourceforge (2025)","Users Love Us, awarded by G2 (2025)"]},{"@type":"Person","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/f3bc93327b3582e735259d2a98f7a7ff","name":"\u0410\u043d\u043d\u0430","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","caption":"Anna"},"description":"\u0410\u043d\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u0432 NodeMaven \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u043c\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0438\u0445 \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0442\u0440\u0430\u0441\u043b\u0435\u0432\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f","url":"https:\/\/nodemaven.com\/ru\/author\/anna-radziuk\/"},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/amazon-price-tracker-python\/#local-main-organization-logo","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","width":512,"height":512,"caption":"NodeMaven"}]}},"_links":{"self":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/users\/68"}],"replies":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/comments?post=39826"}],"version-history":[{"count":8,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39826\/revisions"}],"predecessor-version":[{"id":39843,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39826\/revisions\/39843"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media\/39835"}],"wp:attachment":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media?parent=39826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/categories?post=39826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/tags?post=39826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}