{"id":39924,"date":"2026-07-30T13:40:54","date_gmt":"2026-07-30T13:40:54","guid":{"rendered":"https:\/\/nodemaven.com\/?p=39924"},"modified":"2026-07-30T13:40:55","modified_gmt":"2026-07-30T13:40:55","slug":"how-to-scrape-amazon-reviews-and-prices","status":"publish","type":"post","link":"https:\/\/nodemaven.com\/ru\/blog\/how-to-scrape-amazon-reviews-and-prices\/","title":{"rendered":"How to scrape Amazon product reviews &#038; prices with Python"},"content":{"rendered":"<p>Amazon holds more product data than any single research team could collect by hand. Prices shift by the hour. Reviews pile up by the thousands. If you want to track competitors, feed a sentiment model, or build a price alert tool, you need <strong>a way to pull that data automatically<\/strong>.<\/p>\n\n\n\n<p><strong>This guide covers both sides of the job:<\/strong> scraping current prices and scraping reviews, using nothing but Python, Requests, and BeautifulSoup. No headless browser required for most of it.<\/p>\n\n\n\n<p>By the end, you will have a working scraper that pulls product details and review data, handles pagination, retries failed requests, and exports everything to CSV. We will also cover why raw HTTP requests get blocked on Amazon, and what actually fixes that.<\/p>\n\n\n\n<p><strong>Technologies used:<\/strong> requests for HTTP calls, BeautifulSoup and lxml for parsing, and pandas for exporting clean datasets.<\/p>\n\n\n\n<p>Most Amazon scraping tutorials pick a side. They either focus on prices and treat reviews as an afterthought, or they go deep on review text and skip pricing entirely. That split doesn&#8217;t match how the data actually gets used. A pricing dataset without review context tells you what things cost, not why buyers choose one listing over another. This guide treats both as equally important, <strong>with dedicated steps, dedicated code, and dedicated troubleshooting for each<\/strong>.<\/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            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"186\" data-end=\"296\"><strong>Scrape Amazon with fewer blocks using clean residential and mobile proxies.<\/strong><br data-start=\"219\" data-end=\"222\" \/><strong>Try NodeMaven for $3.50 and get 750 MB included<\/strong><\/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-why-scrape-amazon-product-reviews-and-prices\">Why scrape Amazon product reviews and prices?<\/h2>\n\n\n\n<p>Amazon product pages are one of the richest public data sources on the internet. A single listing tells you the price, the discount history implied by the strike-through, the star rating, and what real buyers think.<\/p>\n\n\n\n<p>Here is where that data actually gets used.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ecommerce pricing.<\/strong> Sellers track competitor prices to stay ranked in the Buy Box.<\/li>\n\n\n\n<li><strong>Competitor monitoring.<\/strong> Brands watch how rivals price and position similar products.<\/li>\n\n\n\n<li><strong>Price tracking tools.<\/strong> Deal sites and browser extensions rely on historical price data.<\/li>\n\n\n\n<li><strong>Sentiment analysis.<\/strong> Reviews reveal what customers actually complain about, not what the marketing copy claims.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/nodemaven.com\/ru\/use-cases\/proxies-for-market-research\/\">Market research.<\/a><\/strong> Category-wide review and price data expose demand trends before they show up in sales reports.<\/li>\n\n\n\n<li><strong>AI training datasets.<\/strong> Structured product and review text is useful for building recommendation models and NLP datasets.<\/li>\n<\/ul>\n\n\n\n<p>Prices and reviews answer different questions. Price data tells you what the market is willing to charge. Review data tells you why customers buy, or why they return the product. You usually need both to draw a full picture.<\/p>\n\n\n\n<p>Take a seller tracking a competitor&#8217;s listing. The price tells them whether they&#8217;re underpriced or overpriced this week. The reviews tell them whether the competitor is winning on quality, shipping speed, or packaging, none of which shows up in a price feed alone.<\/p>\n\n\n\n<p><strong>Pull both datasets, and you get a fuller read on why a listing is outperforming yours.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-amazon-data-can-you-extract\">What Amazon Data Can You Extract?<\/h2>\n\n\n\n<p>Let&#8217;s split this into two datasets. Each one maps to a different part of the product page.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-product-data\">Product data<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Field<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><\/thead><tbody><tr><td>Title<\/td><td>Full product name<\/td><\/tr><tr><td>Current price<\/td><td>The price shown to the buyer right now<\/td><\/tr><tr><td>Original price<\/td><td>List price before discount, if shown<\/td><\/tr><tr><td>Discount<\/td><td>Percentage off, calculated or scraped directly<\/td><\/tr><tr><td>Rating<\/td><td>Average star rating out of 5<\/td><\/tr><tr><td>Review count<\/td><td>Total number of ratings<\/td><\/tr><tr><td>\u043d\u0430\u043b\u0438\u0447\u0438\u0435<\/td><td>In stock, limited stock, or unavailable<\/td><\/tr><tr><td>Brand<\/td><td>Manufacturer or store name<\/td><\/tr><tr><td>ASIN<\/td><td>Amazon&#8217;s unique product identifier<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-review-data\">Review data<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Field<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><\/thead><tbody><tr><td>\u0410\u0432\u0442\u043e\u0440<\/td><td>Display name of the reviewer<\/td><\/tr><tr><td>Review title<\/td><td>The short headline the reviewer wrote<\/td><\/tr><tr><td>Review text<\/td><td>The full body of the review<\/td><\/tr><tr><td>Rating<\/td><td>Star rating the reviewer gave<\/td><\/tr><tr><td>Verified purchase<\/td><td>Whether Amazon confirmed the buyer purchased the item<\/td><\/tr><tr><td>Review date<\/td><td>Date the review was posted<\/td><\/tr><tr><td>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/td><td>URLs of any photos attached to the review<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Both datasets share one key, the <strong>ASIN.<\/strong> That&#8217;s what lets you join product and review data later in pandas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-common-challenges-when-scraping-amazon\">Common challenges when scraping Amazon<\/h2>\n\n\n\n<p><strong>Amazon is one of the hardest sites to scrape reliably<\/strong>, and the difficulty has grown over time. Here is what you will run into.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-changing-html-structure\">Changing HTML structure<\/h3>\n\n\n\n<p>Amazon runs constant A\/B tests on layout. A selector that works today might return nothing next week. Build your scraper to fail loudly, not silently, when a field comes back empty.<\/p>\n\n\n\n<p>A quick sanity check, like confirming the title field isn&#8217;t blank before saving a row, catches most of these breakages before they pollute your dataset.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-captchas-and-robot-checks\">CAPTCHAs and robot checks<\/h3>\n\n\n\n<p>When Amazon flags a request as automated, it swaps the product page for a \u201cRobot Check\u201d page. The tricky part is that this page still returns HTTP 200. Your script will think the request succeeded, then find no title, no price, and no reviews in the HTML. This is why status code checks alone aren&#8217;t enough. <strong>You also need to verify the content actually matches a real product page.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-http-403-and-503-responses\">HTTP 403 and 503 responses<\/h3>\n\n\n\n<p>A 403 usually means your request was rejected outright, often due to a missing or suspicious header. A 503 means the server is refusing to serve the page, sometimes as a soft rate-limit signal rather than a hard block. Treating these two differently in your retry logic, rather than lumping every non-200 response together, gives you a clearer picture of what&#8217;s actually going wrong.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-rate-limits-and-ip-reputation\">Rate limits and IP reputation<\/h3>\n\n\n\n<p>Send too many requests too fast from one IP, and Amazon throttles or blocks you. The IP&#8217;s history matters too. A <a href=\"https:\/\/nodemaven.com\/ru\/proxies\/residential-proxies\/\">residential IP<\/a> that has never made a weird request gets more trust than a datacenter IP with a scraping history.<\/p>\n\n\n\n<p>Amazon&#8217;s systems now weigh several signals together, including request velocity, header consistency, and browsing patterns, rather than relying on any single trigger to flag a session.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dynamic-and-regional-pricing\">Dynamic and regional pricing<\/h3>\n\n\n\n<p>Prices change based on stock levels, time of day, and even the buyer&#8217;s apparent location. A price you scrape from a US-based IP might differ from what a UK-based IP would see on the same listing. If your use case depends on region-accurate pricing, this isn&#8217;t a minor detail. It can quietly skew an entire pricing dataset if you don&#8217;t control where your requests appear to originate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-project-setup\">Project setup<\/h2>\n\n\n\n<p>Let&#8217;s install what we need. <strong>Open a terminal and run:<\/strong><\/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=\"pip%20install%20requests%20beautifulsoup4%20pandas%20lxml\"><\/code><\/pre><\/figure>\n\n\n<p><strong>Here&#8217;s why each one is in the stack:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>requests:<\/strong> sends HTTP requests and handles headers, cookies, and sessions.<\/li>\n\n\n\n<li><strong>beautifulsoup4:<\/strong> parses HTML into a searchable tree so you can pull out specific tags and attributes.<\/li>\n\n\n\n<li><strong>lxml:<\/strong> a fast parser engine that BeautifulSoup uses under the hood. It&#8217;s noticeably quicker than the default Python parser on large pages.<\/li>\n\n\n\n<li><strong>pandas:<\/strong> turns your scraped dictionaries and lists into clean tables, then exports them to CSV.<\/li>\n<\/ul>\n\n\n\n<p>Create a project folder with two files: <strong><em>scraper.py<\/em><\/strong> for the logic, and an empty <strong><em>output\/<\/em><\/strong> folder for your CSV exports.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-1-find-the-product-asin\">Step 1. Find the product ASIN<\/h3>\n\n\n\n<p>Every Amazon product has an ASIN (Amazon Standard Identification Number). It&#8217;s a 10-character code that uniquely identifies the listing, independent of the URL slug or the marketplace domain.<\/p>\n\n\n\n<p>You can spot it in the URL right after <strong><em>\/dp\/<\/em><\/strong> \u0438\u043b\u0438 <strong><em>\/gp\/product\/:<\/em><\/strong><\/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=\"https%3A%2F%2Fwww.amazon.com%2FExample-Product-Name%2Fdp%2FB0C1234XYZ%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%86%91%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ASIN\"><\/code><\/pre><\/figure>\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            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"186\" data-end=\"296\"><strong>Reduce Amazon CAPTCHAs with high-quality residential and mobile proxies.<\/strong><br data-start=\"415\" data-end=\"418\" \/><strong>Start your NodeMaven trial for $3.50 with 750 MB included<\/strong><\/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><strong>A short helper function pulls it out with a regex:<\/strong><\/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%20typing%20import%20Optional%0A%0Adef%20extract_asin%28url%3A%20str%29%20-%3E%20Optional%5Bstr%5D%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Extract%20the%2010-character%20Amazon%20ASIN%20from%20a%20product%20URL.%0A%0A%20%20%20%20Supported%20URL%20formats%3A%0A%20%20%20%20-%20https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0C1234XYZ%0A%20%20%20%20-%20https%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2FB0C1234XYZ%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20match%20%3D%20re.search%28%0A%20%20%20%20%20%20%20%20r%22%2F%28%3F%3Adp%7Cgp%2Fproduct%29%2F%28%5BA-Z0-9%5D%7B10%7D%29%22%2C%0A%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20re.IGNORECASE%0A%20%20%20%20%29%0A%0A%20%20%20%20return%20match.group%281%29.upper%28%29%20if%20match%20else%20None%0A%0A%0Aurl%20%3D%20%22https%3A%2F%2Fwww.amazon.com%2FExample-Product-Name%2Fdp%2FB0C1234XYZ%2F%22%0A%0Aasin%20%3D%20extract_asin%28url%29%0A%0Aprint%28f%22ASIN%3A%20%7Basin%7D%22%29\"><\/code><\/pre><\/figure>\n\n\n<p>Once you have the ASIN, you can rebuild a clean canonical URL for both the product page and the review page, which avoids issues with tracking parameters cluttering your requests.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-2-send-a-request-to-amazon\">Step 2. Send a request to Amazon<\/h3>\n\n\n\n<p>A bare <strong><em>requests.get(url)<\/em><\/strong> call will almost always fail on Amazon. You need headers that resemble a real browser, a timeout so a stuck request doesn&#8217;t hang your script forever, and a retry strategy for the requests that fail anyway.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-headers-that-matter\">Headers that matter<\/h4>\n\n\n\n<p>The most important header is <strong><em>User-Agent<\/em><\/strong>. Without one, Amazon can identify the request as coming from a script in milliseconds. <strong><em>Accept-Language<\/em><\/strong> \u0438 <strong><em>\u041f\u0440\u0438\u043d\u044f\u0442\u044c<\/em><\/strong> round out a header set that looks closer to a real browser tab.<\/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=\"HEADERS%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%2F125.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%20%20%20%20%22Accept%22%3A%20%22text%2Fhtml%2Capplication%2Fxhtml%2Bxml%2Capplication%2Fxml%3Bq%3D0.9%2C%2A%2F%2A%3Bq%3D0.8%22%2C%0A%20%20%20%20%22Connection%22%3A%20%22keep-alive%22%2C%0A%7D\"><\/code><\/pre><\/figure>\n\n\n<h4 class=\"wp-block-heading\" id=\"h-timeouts-and-retry-strategy\">Timeouts and retry strategy<\/h4>\n\n\n\n<p>A request with no timeout can hang indefinitely if the server stalls. A retry loop with backoff handles transient failures like 503s without hammering the server.<\/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%20random%0Aimport%20time%0Afrom%20typing%20import%20Optional%0A%0Aimport%20requests%0A%0A%0Adef%20fetch_page%28%0A%20%20%20%20url%3A%20str%2C%0A%20%20%20%20session%3A%20requests.Session%2C%0A%20%20%20%20max_retries%3A%20int%20%3D%204%2C%0A%29%20-%3E%20Optional%5Brequests.Response%5D%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Download%20an%20Amazon%20product%20page%20with%20retry%20logic%20and%20exponential%20backoff.%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20for%20attempt%20in%20range%281%2C%20max_retries%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20session.get%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20headers%3DHEADERS%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timeout%3D10%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20except%20requests.RequestException%20as%20exc%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Attempt%20%7Battempt%7D%3A%20Connection%20error%20%28%7Bexc%7D%29%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20time.sleep%282%20%2A%2A%20attempt%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20if%20response.status_code%20%3D%3D%20200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20response%0A%0A%20%20%20%20%20%20%20%20if%20response.status_code%20in%20%28403%2C%20503%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20wait%20%3D%20%282%20%2A%2A%20attempt%29%20%2B%20random.uniform%280%2C%201%29%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%22Attempt%20%7Battempt%7D%3A%20Received%20HTTP%20%7Bresponse.status_code%7D.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Retrying%20in%20%7Bwait%3A.1f%7D%20seconds...%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20time.sleep%28wait%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20print%28f%22Unexpected%20HTTP%20status%3A%20%7Bresponse.status_code%7D%22%29%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20print%28%22Maximum%20number%20of%20retries%20reached.%22%29%0A%20%20%20%20return%20None\"><\/code><\/pre><\/figure>\n\n\n<p>Notice the random jitter added to the backoff. A fixed delay pattern is itself a bot signal. Randomizing it a bit makes your traffic harder to fingerprint.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-3-scrape-product-prices-and-information\">Step 3. Scrape product prices and information<\/h3>\n\n\n\n<p>With a valid HTML response in hand, it&#8217;s time to parse it. Amazon wraps most product data in predictable element IDs, though class names shift more often.<\/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%20parse_product%28html%3A%20str%2C%20asin%3A%20str%29%20-%3E%20dict%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Extract%20product%20details%20from%20an%20Amazon%20product%20page.%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22lxml%22%29%0A%0A%20%20%20%20def%20text_or_none%28selector%2C%20attr%3DNone%29%3A%0A%20%20%20%20%20%20%20%20tag%20%3D%20soup.select_one%28selector%29%0A%20%20%20%20%20%20%20%20if%20not%20tag%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20%20%20%20%20if%20attr%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20value%20%3D%20tag.get%28attr%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20value.strip%28%29%20if%20value%20else%20None%0A%0A%20%20%20%20%20%20%20%20return%20tag.get_text%28strip%3DTrue%29%0A%0A%20%20%20%20%23%20Product%20title%0A%20%20%20%20title%20%3D%20text_or_none%28%22%23productTitle%22%29%0A%0A%20%20%20%20%23%20Current%20price%0A%20%20%20%20price_whole%20%3D%20text_or_none%28%22span.a-price-whole%22%29%0A%20%20%20%20price_fraction%20%3D%20text_or_none%28%22span.a-price-fraction%22%29%0A%0A%20%20%20%20current_price%20%3D%20None%0A%0A%20%20%20%20if%20price_whole%3A%0A%20%20%20%20%20%20%20%20current_price%20%3D%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20price_whole.replace%28%22%2C%22%2C%20%22%22%29.rstrip%28%22.%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%22.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%28price_fraction%20or%20%2200%22%29%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%23%20Original%20%28list%29%20price%0A%20%20%20%20original_price%20%3D%20text_or_none%28%0A%20%20%20%20%20%20%20%20%22span.a-price.a-text-price%20span.a-offscreen%22%0A%20%20%20%20%29%0A%0A%20%20%20%20%23%20Currency%0A%20%20%20%20currency%20%3D%20%22%24%22%20if%20current_price%20else%20None%0A%0A%20%20%20%20%23%20Product%20rating%0A%20%20%20%20rating_text%20%3D%20text_or_none%28%22span.a-icon-alt%22%29%0A%20%20%20%20rating%20%3D%20rating_text.split%28%22%20out%20of%22%29%5B0%5D%20if%20rating_text%20else%20None%0A%0A%20%20%20%20%23%20Review%20count%0A%20%20%20%20review_count_text%20%3D%20text_or_none%28%22%23acrCustomerReviewText%22%29%0A%20%20%20%20review_count%20%3D%20None%0A%0A%20%20%20%20if%20review_count_text%3A%0A%20%20%20%20%20%20%20%20review_count%20%3D%20re.sub%28r%22%5CD%22%2C%20%22%22%2C%20review_count_text%29%0A%0A%20%20%20%20%23%20Availability%0A%20%20%20%20availability%20%3D%20text_or_none%28%22%23availability%20span%22%29%0A%0A%20%20%20%20%23%20Brand%0A%20%20%20%20brand%20%3D%20text_or_none%28%22%23bylineInfo%22%29%0A%0A%20%20%20%20if%20brand%3A%0A%20%20%20%20%20%20%20%20brand%20%3D%20brand.replace%28%22Brand%3A%22%2C%20%22%22%29.strip%28%29%0A%0A%20%20%20%20%23%20Calculate%20discount%0A%20%20%20%20discount%20%3D%20None%0A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20if%20current_price%20and%20original_price%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20current%20%3D%20float%28current_price%29%0A%20%20%20%20%20%20%20%20%20%20%20%20original%20%3D%20float%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20re.sub%28r%22%5B%5E%5Cd.%5D%22%2C%20%22%22%2C%20original_price%29%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%20original%20%3E%20current%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20discount%20%3D%20round%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28%28original%20-%20current%29%20%2F%20original%29%20%2A%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20except%20ValueError%3A%0A%20%20%20%20%20%20%20%20pass%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22asin%22%3A%20asin%2C%0A%20%20%20%20%20%20%20%20%22title%22%3A%20title%2C%0A%20%20%20%20%20%20%20%20%22current_price%22%3A%20current_price%2C%0A%20%20%20%20%20%20%20%20%22original_price%22%3A%20original_price%2C%0A%20%20%20%20%20%20%20%20%22currency%22%3A%20currency%2C%0A%20%20%20%20%20%20%20%20%22discount%22%3A%20discount%2C%0A%20%20%20%20%20%20%20%20%22rating%22%3A%20rating%2C%0A%20%20%20%20%20%20%20%20%22review_count%22%3A%20review_count%2C%0A%20%20%20%20%20%20%20%20%22availability%22%3A%20availability%2C%0A%20%20%20%20%20%20%20%20%22brand%22%3A%20brand%2C%0A%20%20%20%20%7D\"><\/code><\/pre><\/figure>\n\n\n<p><strong>A few notes on the selectors:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Price is split across two spans<\/strong>, the whole number and the decimal fraction. Amazon does this so it can style the cents smaller than the dollars.<\/li>\n\n\n\n<li><strong>Original price only appears when there&#8217;s an active discount<\/strong>. If the selector returns nothing, treat it as &#8220;no discount&#8221; rather than an error.<\/li>\n\n\n\n<li><strong>Rating text looks like \u201c4.5 out of 5 stars\u201d.<\/strong> Splitting on \u201cout of\u201d is more reliable than trying to parse the number directly, since spacing varies.<\/li>\n<\/ul>\n\n\n\n<p><strong>Heads up:<\/strong> if <strong><em>text_or_none(\u201c#productTitle\u201d)<\/em><\/strong> comes back empty, you likely hit a Robot Check page, not a missing field. Always check for a null title before trusting the rest of the parsed data.<\/p>\n\n\n\n<p>Scraping the current price is only the first step. To monitor price changes over time, check out our guide on building an <a href=\"https:\/\/nodemaven.com\/ru\/blog\/amazon-price-tracker-python\/\">\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0446\u0435\u043d \u043d\u0430 Amazon <\/a>that stores historical prices and sends price-drop alerts.<\/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            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"186\" data-end=\"296\"><strong>Collect Amazon prices and reviews more reliably with premium residential proxies.<\/strong><br data-start=\"642\" data-end=\"645\" \/><strong>Get started with NodeMaven for $3.50 and receive 750 MB included.<\/strong><\/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<h3 class=\"wp-block-heading\" id=\"h-step-4-scrape-amazon-product-reviews\">Step 4. Scrape Amazon product reviews<\/h3>\n\n\n\n<p>Reviews live on a separate URL pattern, usually <strong><em>\/product-reviews\/{ASIN}<\/em><\/strong>. Each review sits inside a repeating block, which makes it a good candidate for a loop over matched elements.<\/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%20bs4%20import%20BeautifulSoup%0A%0A%0Adef%20parse_reviews%28html%3A%20str%2C%20asin%3A%20str%29%20-%3E%20list%5Bdict%5D%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Extract%20customer%20reviews%20from%20an%20Amazon%20review%20page.%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22lxml%22%29%0A%20%20%20%20review_blocks%20%3D%20soup.select%28%22div%5Bdata-hook%3D%27review%27%5D%22%29%0A%0A%20%20%20%20reviews%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20block%20in%20review_blocks%3A%0A%0A%20%20%20%20%20%20%20%20review_id%20%3D%20block.get%28%22id%22%29%0A%0A%20%20%20%20%20%20%20%20author%20%3D%20block.select_one%28%22span.a-profile-name%22%29%0A%0A%20%20%20%20%20%20%20%20title%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22a%5Bdata-hook%3D%27review-title%27%5D%20span%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20body%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22span%5Bdata-hook%3D%27review-body%27%5D%20span%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20rating_tag%20%3D%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20block.select_one%28%22i%5Bdata-hook%3D%27review-star-rating%27%5D%20span%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20or%20block.select_one%28%22i%5Bdata-hook%3D%27cmps-review-star-rating%27%5D%20span%22%29%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20date_tag%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22span%5Bdata-hook%3D%27review-date%27%5D%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20verified%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22span%5Bdata-hook%3D%27avp-badge%27%5D%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20image_tags%20%3D%20block.select%28%22img.review-image-tile%22%29%0A%0A%20%20%20%20%20%20%20%20rating%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20if%20rating_tag%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20rating%20%3D%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rating_tag.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.split%28%22%20out%20of%22%29%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20image_urls%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20img%20in%20image_tags%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20src%20%3D%20img.get%28%22src%22%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20src%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20image_urls.append%28src%29%0A%0A%20%20%20%20%20%20%20%20reviews.append%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_id%22%3A%20review_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22asin%22%3A%20asin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22author%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20author.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20author%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_title%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20title%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_text%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20body.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20body%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22rating%22%3A%20rating%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22verified_purchase%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20verified%20is%20not%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_date%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date_tag.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20date_tag%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image_urls%22%3A%20image_urls%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20return%20reviews\"><\/code><\/pre><\/figure>\n\n\n<p>\u0417\u043e\u043d\u0430 <strong><em>data-hook<\/em><\/strong> attributes are more stable than class names here. Amazon uses them internally for analytics, so they tend to survive layout changes better than CSS classes do.<\/p>\n\n\n\n<p>Store <strong><em>image_urls<\/em><\/strong> as a list for now. We&#8217;ll flatten it into a comma-separated string right before export, since CSV cells work better with plain strings than nested lists.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-5-handle-multiple-review-pages\">Step 5. Handle multiple review pages<\/h3>\n\n\n\n<p>A popular product can have thousands of reviews spread across dozens of pages. You need pagination logic, a delay between requests, and a clear stopping condition so the scraper doesn&#8217;t run forever.<\/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%20random%0Aimport%20time%0Aimport%20requests%0A%0A%0Adef%20scrape_all_reviews%28%0A%20%20%20%20asin%3A%20str%2C%0A%20%20%20%20session%3A%20requests.Session%2C%0A%20%20%20%20max_pages%3A%20int%20%3D%2020%2C%0A%20%20%20%20sort_by%3A%20str%20%3D%20%22recent%22%2C%0A%29%20-%3E%20list%5Bdict%5D%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Scrape%20reviews%20from%20multiple%20Amazon%20review%20pages.%0A%0A%20%20%20%20Stops%20when%3A%0A%20%20%20%20-%20the%20request%20fails%0A%20%20%20%20-%20no%20reviews%20are%20returned%0A%20%20%20%20-%20max_pages%20is%20reached%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20all_reviews%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20page%20in%20range%281%2C%20max_pages%20%2B%201%29%3A%0A%0A%20%20%20%20%20%20%20%20url%20%3D%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22https%3A%2F%2Fwww.amazon.com%2Fproduct-reviews%2F%7Basin%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%3FpageNumber%3D%7Bpage%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%26sortBy%3D%7Bsort_by%7D%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20response%20%3D%20fetch_page%28url%2C%20session%29%0A%0A%20%20%20%20%20%20%20%20if%20response%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Stopping%20at%20page%20%7Bpage%7D%3A%20Request%20failed.%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20page_reviews%20%3D%20parse_reviews%28response.text%2C%20asin%29%0A%0A%20%20%20%20%20%20%20%20if%20not%20page_reviews%3A%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%22No%20reviews%20found%20on%20page%20%7Bpage%7D.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Reached%20the%20end%20of%20the%20review%20list.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20all_reviews.extend%28page_reviews%29%0A%0A%20%20%20%20%20%20%20%20print%28%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22Page%20%7Bpage%7D%3A%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Blen%28page_reviews%29%7D%20reviews%20collected%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%28%7Blen%28all_reviews%29%7D%20total%29.%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20%23%20Random%20delay%20between%20requests%0A%20%20%20%20%20%20%20%20time.sleep%28random.uniform%282%2C%205%29%29%0A%0A%20%20%20%20return%20all_reviews\"><\/code><\/pre><\/figure>\n\n\n<p><strong>Three things matter here:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stopping condition.<\/strong> An empty page of reviews means you&#8217;ve reached the end, not an error. Stop cleanly instead of looping forever.<\/li>\n\n\n\n<li><strong>Delay between requests.<\/strong> A random 2 to 5 second pause between pages keeps your request pattern from looking mechanical.<\/li>\n\n\n\n<li><strong>Max page cap.<\/strong> Even a wildly popular product doesn&#8217;t need every single review. Capping at a sane number, like 20 pages, keeps runtime predictable.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-6-export-everything-to-csv\">Step 6. Export everything to CSV<\/h3>\n\n\n\n<p>Pandas makes the export step almost trivial. Convert your lists of dictionaries into DataFrames, clean up the review images column, and write to CSV.<\/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%20pathlib%20import%20Path%0A%0Aimport%20pandas%20as%20pd%0A%0A%0Adef%20export_data%28%0A%20%20%20%20product%3A%20dict%2C%0A%20%20%20%20reviews%3A%20list%5Bdict%5D%2C%0A%20%20%20%20output_dir%3A%20str%20%3D%20%22output%22%2C%0A%29%20-%3E%20None%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Export%20product%20data%2C%20review%20data%2C%20and%20a%20combined%20dataset%20to%20CSV%20files.%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20output_path%20%3D%20Path%28output_dir%29%0A%20%20%20%20output_path.mkdir%28parents%3DTrue%2C%20exist_ok%3DTrue%29%0A%0A%20%20%20%20asin%20%3D%20product%5B%22asin%22%5D%0A%0A%20%20%20%20%23%20Export%20product%20data%0A%20%20%20%20product_df%20%3D%20pd.DataFrame%28%5Bproduct%5D%29%0A%0A%20%20%20%20product_file%20%3D%20output_path%20%2F%20f%22product_%7Basin%7D.csv%22%0A%0A%20%20%20%20product_df.to_csv%28%0A%20%20%20%20%20%20%20%20product_file%2C%0A%20%20%20%20%20%20%20%20index%3DFalse%2C%0A%20%20%20%20%20%20%20%20encoding%3D%22utf-8-sig%22%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20%23%20Export%20review%20data%0A%20%20%20%20reviews_df%20%3D%20pd.DataFrame%28reviews%29%0A%0A%20%20%20%20if%20not%20reviews_df.empty%3A%0A%20%20%20%20%20%20%20%20reviews_df%5B%22image_urls%22%5D%20%3D%20reviews_df%5B%22image_urls%22%5D.apply%28%0A%20%20%20%20%20%20%20%20%20%20%20%20lambda%20urls%3A%20%22%2C%20%22.join%28urls%29%20if%20urls%20else%20%22%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20reviews_file%20%3D%20output_path%20%2F%20f%22reviews_%7Basin%7D.csv%22%0A%0A%20%20%20%20reviews_df.to_csv%28%0A%20%20%20%20%20%20%20%20reviews_file%2C%0A%20%20%20%20%20%20%20%20index%3DFalse%2C%0A%20%20%20%20%20%20%20%20encoding%3D%22utf-8-sig%22%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20%23%20Export%20combined%20dataset%0A%20%20%20%20if%20not%20reviews_df.empty%3A%0A%0A%20%20%20%20%20%20%20%20combined_df%20%3D%20reviews_df.copy%28%29%0A%0A%20%20%20%20%20%20%20%20for%20key%2C%20value%20in%20product.items%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20combined_df%5Bf%22product_%7Bkey%7D%22%5D%20%3D%20value%0A%0A%20%20%20%20%20%20%20%20combined_file%20%3D%20output_path%20%2F%20f%22combined_%7Basin%7D.csv%22%0A%0A%20%20%20%20%20%20%20%20combined_df.to_csv%28%0A%20%20%20%20%20%20%20%20%20%20%20%20combined_file%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20index%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20encoding%3D%22utf-8-sig%22%2C%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20print%28f%22Product%20file%3A%20%20%7Bproduct_file%7D%22%29%0A%20%20%20%20print%28f%22Review%20file%3A%20%20%20%7Breviews_file%7D%22%29%0A%0A%20%20%20%20if%20not%20reviews_df.empty%3A%0A%20%20%20%20%20%20%20%20print%28f%22Combined%20file%3A%20%7Bcombined_file%7D%22%29%0A%0A%20%20%20%20print%28%0A%20%20%20%20%20%20%20%20f%22%5CnExport%20complete.%20%22%0A%20%20%20%20%20%20%20%20f%22Saved%201%20product%20and%20%7Blen%28reviews%29%7D%20reviews.%22%0A%20%20%20%20%29\"><\/code><\/pre><\/figure>\n\n\n<p>The combined file is useful when you want product context sitting next to every single review, for example when training a sentiment model that also needs to know the price point of the product being reviewed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-complete-python-scraper\">Complete Python scraper<\/h2>\n\n\n\n<p>Here&#8217;s everything wired together into one script. Save this as <strong><em>scraper.py<\/em><\/strong> and run it directly.<\/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%20os%0Aimport%20re%0Aimport%20time%0Aimport%20random%0Aimport%20requests%0Aimport%20pandas%20as%20pd%0Afrom%20bs4%20import%20BeautifulSoup%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%2F125.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%20%20%20%20%22Accept%22%3A%20%22text%2Fhtml%2Capplication%2Fxhtml%2Bxml%2Capplication%2Fxml%3Bq%3D0.9%2C%2A%2F%2A%3Bq%3D0.8%22%2C%0A%20%20%20%20%22Connection%22%3A%20%22keep-alive%22%2C%0A%7D%0A%0A%0Adef%20extract_asin%28url%3A%20str%29%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%22%22%22Extract%20the%2010-character%20Amazon%20ASIN%20from%20a%20product%20URL.%22%22%22%0A%20%20%20%20match%20%3D%20re.search%28r%22%2F%28%3F%3Adp%7Cgp%2Fproduct%29%2F%28%5BA-Z0-9%5D%7B10%7D%29%22%2C%20url%29%0A%20%20%20%20return%20match.group%281%29%20if%20match%20else%20None%0A%0A%0Adef%20fetch_page%28url%3A%20str%2C%20session%3A%20requests.Session%2C%20max_retries%3A%20int%20%3D%204%29%3A%0A%20%20%20%20%22%22%22Download%20an%20Amazon%20page%20with%20retry%20logic.%22%22%22%0A%20%20%20%20for%20attempt%20in%20range%281%2C%20max_retries%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20session.get%28url%2C%20headers%3DHEADERS%2C%20timeout%3D10%29%0A%0A%20%20%20%20%20%20%20%20except%20requests.RequestException%20as%20exc%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Attempt%20%7Battempt%7D%3A%20connection%20error%20%28%7Bexc%7D%29%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20time.sleep%282%20%2A%2A%20attempt%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20if%20response.status_code%20%3D%3D%20200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20response%0A%0A%20%20%20%20%20%20%20%20if%20response.status_code%20in%20%28403%2C%20503%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20wait%20%3D%20%282%20%2A%2A%20attempt%29%20%2B%20random.uniform%280%2C%201%29%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%22Attempt%20%7Battempt%7D%3A%20got%20%7Bresponse.status_code%7D%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22waiting%20%7Bwait%3A.1f%7Ds%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20time.sleep%28wait%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20print%28f%22Unexpected%20status%20%7Bresponse.status_code%7D%2C%20aborting.%22%29%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20print%28%22Maximum%20retries%20reached.%22%29%0A%20%20%20%20return%20None%0A%0A%0Adef%20parse_product%28html%3A%20str%2C%20asin%3A%20str%29%20-%3E%20dict%3A%0A%20%20%20%20%22%22%22Extract%20product%20details%20from%20an%20Amazon%20product%20page.%22%22%22%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22lxml%22%29%0A%0A%20%20%20%20def%20text_or_none%28selector%29%3A%0A%20%20%20%20%20%20%20%20tag%20%3D%20soup.select_one%28selector%29%0A%20%20%20%20%20%20%20%20return%20tag.get_text%28strip%3DTrue%29%20if%20tag%20else%20None%0A%0A%20%20%20%20title%20%3D%20text_or_none%28%22%23productTitle%22%29%0A%0A%20%20%20%20price_whole%20%3D%20text_or_none%28%22span.a-price-whole%22%29%0A%20%20%20%20price_fraction%20%3D%20text_or_none%28%22span.a-price-fraction%22%29%0A%0A%20%20%20%20current_price%20%3D%20%28%0A%20%20%20%20%20%20%20%20f%22%7Bprice_whole.strip%28%27.%27%29%7D.%7Bprice_fraction%20or%20%2700%27%7D%22%0A%20%20%20%20%20%20%20%20if%20price_whole%0A%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%29%0A%0A%20%20%20%20original_price%20%3D%20text_or_none%28%0A%20%20%20%20%20%20%20%20%22span.a-price.a-text-price%20span.a-offscreen%22%0A%20%20%20%20%29%0A%0A%20%20%20%20rating_text%20%3D%20text_or_none%28%22span.a-icon-alt%22%29%0A%20%20%20%20rating%20%3D%20%28%0A%20%20%20%20%20%20%20%20rating_text.split%28%22%20out%20of%22%29%5B0%5D%0A%20%20%20%20%20%20%20%20if%20rating_text%0A%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%29%0A%0A%20%20%20%20review_count_text%20%3D%20text_or_none%28%22%23acrCustomerReviewText%22%29%0A%20%20%20%20review_count%20%3D%20%28%0A%20%20%20%20%20%20%20%20re.sub%28r%22%5B%5E%5Cd%5D%22%2C%20%22%22%2C%20review_count_text%29%0A%20%20%20%20%20%20%20%20if%20review_count_text%0A%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%29%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22asin%22%3A%20asin%2C%0A%20%20%20%20%20%20%20%20%22title%22%3A%20title%2C%0A%20%20%20%20%20%20%20%20%22current_price%22%3A%20current_price%2C%0A%20%20%20%20%20%20%20%20%22original_price%22%3A%20original_price%2C%0A%20%20%20%20%20%20%20%20%22rating%22%3A%20rating%2C%0A%20%20%20%20%20%20%20%20%22review_count%22%3A%20review_count%2C%0A%20%20%20%20%20%20%20%20%22availability%22%3A%20text_or_none%28%22%23availability%20span%22%29%2C%0A%20%20%20%20%20%20%20%20%22brand%22%3A%20text_or_none%28%22%23bylineInfo%22%29%2C%0A%20%20%20%20%7D%0A%0A%0Adef%20parse_reviews%28html%3A%20str%2C%20asin%3A%20str%29%20-%3E%20list%5Bdict%5D%3A%0A%20%20%20%20%22%22%22Extract%20customer%20reviews%20from%20a%20review%20page.%22%22%22%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22lxml%22%29%0A%20%20%20%20reviews%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20block%20in%20soup.select%28%22div%5Bdata-hook%3D%27review%27%5D%22%29%3A%0A%0A%20%20%20%20%20%20%20%20author%20%3D%20block.select_one%28%22span.a-profile-name%22%29%0A%20%20%20%20%20%20%20%20title%20%3D%20block.select_one%28%22a%5Bdata-hook%3D%27review-title%27%5D%20span%22%29%0A%20%20%20%20%20%20%20%20body%20%3D%20block.select_one%28%22span%5Bdata-hook%3D%27review-body%27%5D%20span%22%29%0A%20%20%20%20%20%20%20%20rating_tag%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22i%5Bdata-hook%3D%27review-star-rating%27%5D%20span%22%0A%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20date_tag%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22span%5Bdata-hook%3D%27review-date%27%5D%22%0A%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20verified%20%3D%20block.select_one%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22span%5Bdata-hook%3D%27avp-badge%27%5D%22%0A%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20images%20%3D%20block.select%28%22img.review-image-tile%22%29%0A%0A%20%20%20%20%20%20%20%20rating%20%3D%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20rating_tag.get_text%28strip%3DTrue%29.split%28%22%20out%20of%22%29%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20rating_tag%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20reviews.append%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22asin%22%3A%20asin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22author%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20author.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20author%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_title%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20title%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_text%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20body.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20body%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22rating%22%3A%20rating%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22verified_purchase%22%3A%20bool%28verified%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22review_date%22%3A%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date_tag.get_text%28strip%3DTrue%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20date_tag%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image_urls%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20img.get%28%22src%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20img%20in%20images%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20img.get%28%22src%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20return%20reviews%0A%0A%0Adef%20scrape_all_reviews%28%0A%20%20%20%20asin%3A%20str%2C%0A%20%20%20%20session%3A%20requests.Session%2C%0A%20%20%20%20max_pages%3A%20int%20%3D%2020%2C%0A%29%20-%3E%20list%5Bdict%5D%3A%0A%20%20%20%20%22%22%22Scrape%20reviews%20from%20multiple%20review%20pages.%22%22%22%0A%20%20%20%20all_reviews%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20page%20in%20range%281%2C%20max_pages%20%2B%201%29%3A%0A%0A%20%20%20%20%20%20%20%20url%20%3D%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22https%3A%2F%2Fwww.amazon.com%2Fproduct-reviews%2F%7Basin%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%3FpageNumber%3D%7Bpage%7D%26sortBy%3Drecent%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20response%20%3D%20fetch_page%28url%2C%20session%29%0A%0A%20%20%20%20%20%20%20%20if%20response%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22Stopping%20at%20page%20%7Bpage%7D.%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20page_reviews%20%3D%20parse_reviews%28response.text%2C%20asin%29%0A%0A%20%20%20%20%20%20%20%20if%20not%20page_reviews%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28f%22No%20reviews%20found%20on%20page%20%7Bpage%7D.%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20all_reviews.extend%28page_reviews%29%0A%0A%20%20%20%20%20%20%20%20print%28%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22Page%20%7Bpage%7D%3A%20collected%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Blen%28page_reviews%29%7D%20reviews.%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20time.sleep%28random.uniform%282%2C%205%29%29%0A%0A%20%20%20%20return%20all_reviews%0A%0A%0Adef%20export_data%28%0A%20%20%20%20product%3A%20dict%2C%0A%20%20%20%20reviews%3A%20list%5Bdict%5D%2C%0A%20%20%20%20output_dir%3A%20str%20%3D%20%22output%22%2C%0A%29%20-%3E%20None%3A%0A%20%20%20%20%22%22%22Export%20product%2C%20reviews%2C%20and%20combined%20data%20to%20CSV.%22%22%22%0A%0A%20%20%20%20os.makedirs%28output_dir%2C%20exist_ok%3DTrue%29%0A%0A%20%20%20%20pd.DataFrame%28%5Bproduct%5D%29.to_csv%28%0A%20%20%20%20%20%20%20%20f%22%7Boutput_dir%7D%2Fproduct_%7Bproduct%5B%27asin%27%5D%7D.csv%22%2C%0A%20%20%20%20%20%20%20%20index%3DFalse%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20reviews_df%20%3D%20pd.DataFrame%28reviews%29%0A%0A%20%20%20%20if%20not%20reviews_df.empty%3A%0A%20%20%20%20%20%20%20%20reviews_df%5B%22image_urls%22%5D%20%3D%20reviews_df%5B%22image_urls%22%5D.apply%28%0A%20%20%20%20%20%20%20%20%20%20%20%20lambda%20urls%3A%20%22%2C%20%22.join%28urls%29%20if%20urls%20else%20%22%22%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20reviews_df.to_csv%28%0A%20%20%20%20%20%20%20%20f%22%7Boutput_dir%7D%2Freviews_%7Bproduct%5B%27asin%27%5D%7D.csv%22%2C%0A%20%20%20%20%20%20%20%20index%3DFalse%2C%0A%20%20%20%20%29%0A%0A%20%20%20%20combined_df%20%3D%20reviews_df.copy%28%29%0A%0A%20%20%20%20for%20key%2C%20value%20in%20product.items%28%29%3A%0A%20%20%20%20%20%20%20%20combined_df%5Bf%22product_%7Bkey%7D%22%5D%20%3D%20value%0A%0A%20%20%20%20combined_df.to_csv%28%0A%20%20%20%20%20%20%20%20f%22%7Boutput_dir%7D%2Fcombined_%7Bproduct%5B%27asin%27%5D%7D.csv%22%2C%0A%20%20%20%20%20%20%20%20index%3DFalse%2C%0A%20%20%20%20%29%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%0A%20%20%20%20product_url%20%3D%20%22https%3A%2F%2Fwww.amazon.com%2FBody-Fortress-Advanced-Chocolate-Vitamins%2Fdp%2FB0BJLBD427%2Fref%3Dsr_1_1%3Fcrid%3D3KAO2MFW5Q9I4%26dib%3DeyJ2IjoiMSJ9.ZhRwjK472XyCwqPD1UQebjFhC28wqsK4JXf0GO0J2oTouTrV5sKRT29taXB_eecKIn2ajhR7KgL2IqbW0CeTw4-7C3auK1LZ_GZa8HFfrn9tjWUC4ECPsiMBPj_w8Gg4_2Isz4IoPvYDcZaLCDrpW5mwddfTwsCwkcoAIvqvQArZF-ls6TRnQZEybPmlK8zKdrh-Lge3zGhADZ9JIwBmsjPlAxudv1LySAN1Tx3QVx_wFYZvlSk82O-RAVNkx7URWGAJdUPw7XRwQ1MF-AlmI2q7GeFVrCsrx6qYglKJ0ac.HUEk75lqXofxHmS8eAMpQAJ2by2kTVOQsjKEqo02pCo%26dib_tag%3Dse%26keywords%3Dprotein%26qid%3D1785415523%26sprefix%3Dprotei%252Caps%252C279%26sr%3D8-1%26th%3D1%22%0A%0A%20%20%20%20asin%20%3D%20extract_asin%28product_url%29%0A%0A%20%20%20%20if%20asin%20is%20None%3A%0A%20%20%20%20%20%20%20%20raise%20SystemExit%28%22Could%20not%20extract%20ASIN%20from%20the%20URL.%22%29%0A%0A%20%20%20%20with%20requests.Session%28%29%20as%20session%3A%0A%0A%20%20%20%20%20%20%20%20product_response%20%3D%20fetch_page%28product_url%2C%20session%29%0A%0A%20%20%20%20%20%20%20%20if%20product_response%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20SystemExit%28%22Could%20not%20load%20the%20product%20page.%22%29%0A%0A%20%20%20%20%20%20%20%20product%20%3D%20parse_product%28product_response.text%2C%20asin%29%0A%0A%20%20%20%20%20%20%20%20reviews%20%3D%20scrape_all_reviews%28asin%2C%20session%29%0A%0A%20%20%20%20%20%20%20%20export_data%28product%2C%20reviews%29%0A%0A%20%20%20%20print%28%0A%20%20%20%20%20%20%20%20f%22Done.%20Scraped%201%20product%20and%20%22%0A%20%20%20%20%20%20%20%20f%22%7Blen%28reviews%29%7D%20reviews%20for%20ASIN%20%7Basin%7D.%22%0A%20%20%20%20%29\"><\/code><\/pre><\/figure>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-important-note\">Important note<\/h3>\n\n\n\n<p>Amazon frequently updates its HTML structure, CSS selectors, and anti-bot protections. The example in <strong>this guide demonstrates the overall scraping workflow<\/strong>, but individual selectors or request patterns may require updates over time<strong>. If your scraper starts returning empty results or missing fields, inspect the latest page source, adjust the selectors, and verify that Amazon has not served a CAPTCHA or Robot Check page instead of the requested content.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-common-errors-and-troubleshooting\">Common errors and troubleshooting<\/h2>\n\n\n\n<p>Web scraping is not a one-time implementation. Amazon regularly changes its page layout, experiments with A\/B testing, and strengthens anti-bot protection. Even a scraper that works today may require minor selector updates in the future.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Symptom<\/strong><\/td><td><strong>Likely Cause<\/strong><\/td><td><strong>\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c<\/strong><\/td><\/tr><\/thead><tbody><tr><td>HTTP 403<\/td><td>Missing or suspicious headers<\/td><td>Add a realistic User-Agent and Accept-Language header<\/td><\/tr><tr><td>HTTP 503<\/td><td>Soft rate limit or overloaded route<\/td><td>Back off with jitter, slow down request rate<\/td><\/tr><tr><td>Page loads but fields are empty<\/td><td>Robot Check page, not the real listing<\/td><td>Check for a null title, rotate IP, add proxies<\/td><\/tr><tr><td>Missing selectors after weeks of stable scraping<\/td><td>Amazon changed the layout in an A\/B test<\/td><td>Re-inspect the page, update selectors, add fallback selectors<\/td><\/tr><tr><td>Empty HTML response<\/td><td>Connection was dropped or blocked mid-request<\/td><td>Wrap requests in try\/except, retry with a fresh session<\/td><\/tr><tr><td>Prices differ from what you see in the browser<\/td><td>Regional pricing tied to IP location<\/td><td>Use proxies located in the target country<\/td><\/tr><tr><td>Review count stops growing after a few pages<\/td><td>Hit the max_pages cap or reviews genuinely ran out<\/td><td>Check for an empty parsed list before assuming a bug<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-to-scale-amazon-scraping\">How to scale Amazon Scraping<\/h2>\n\n\n\n<p>A script that works for one product on your laptop behaves very differently at 10,000 products a day. Scaling means solving for volume without tripping Amazon&#8217;s defenses.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-rotating-ips\">\u0440\u043e\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430<\/h3>\n\n\n\n<p>Every request from the same IP adds to that IP&#8217;s risk score. Rotating through a large pool of IPs spreads your request volume so no single address looks suspicious.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-sticky-sessions\">Sticky-\u0441\u0435\u0441\u0441\u0438\u0438<\/h3>\n\n\n\n<p>Rotation isn&#8217;t always the right call. Paging through reviews for one product works better from a single, stable IP for the duration of that session, since jumping IPs mid-session can itself look unnatural.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-real-browser-headers\">Real browser headers<\/h3>\n\n\n\n<p>Keep your header set current. Browser versions in User-Agent strings age quickly, and an outdated one stands out.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-random-delays-and-retry-logic\">Random delays and retry logic<\/h3>\n\n\n\n<p>We already covered jitter and backoff. At scale, apply the same logic across your whole request queue, not just within a single product&#8217;s review pages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-parallel-scraping-and-session-persistence\">Parallel Scraping and Session Persistence<\/h3>\n\n\n\n<p>Running requests concurrently speeds things up, but each worker thread or process needs its own session and, ideally, its own IP. Mixing shared sessions across concurrent workers is a common source of accidental rate-limit triggers.<\/p>\n\n\n\n<p>This is where proxy infrastructure becomes less optional. A datacenter IP running thousands of requests a day gets flagged fast, no matter how good your headers and retry logic are.<\/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            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"186\" data-end=\"296\"><strong>Scale your Python Amazon scraper with reliable residential and mobile proxies.<\/strong><br data-start=\"867\" data-end=\"870\" \/><strong>Try NodeMaven for $3.50 with 750 MB included<\/strong><\/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><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> route your traffic through real household IP addresses, which carry a much lower risk score with Amazon&#8217;s bot detection than server-hosted IPs do.<\/p>\n\n\n\n<p><a href=\"https:\/\/nodemaven.com\/ru\/proxies\/mobile-proxies\/\">\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u043a\u0441\u0438<\/a> go a step further for the toughest targets, like seller profile pages or geo-locked search results, since carrier IPs are shared by thousands of real phones and rarely get blanket blocked.<\/p>\n\n\n\n<p>The scraper code stays exactly the same either way. The only thing that changes is which IP address sits behind the <strong><em>requests.Session<\/em><\/strong> object, usually configured through a proxies dictionary passed into each request. <strong>That&#8217;s a small code change for a large jump in reliability at scale<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-use-nodemaven-for-amazon-scraping\">Why use NodeMaven for Amazon scraping?<\/h2>\n\n\n\n<p>Everything in the previous section points to the same conclusion. Your code can be flawless, and you&#8217;ll still get blocked if your IP looks wrong<strong>. NodeMaven is built around solving that specific problem.<\/strong><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/nodemaven.com\/ru\/features\/zip-level-targeting\/\">\u0413\u0435\u043e\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433<\/a>.<\/strong> Target by country, city, or ZIP code, which matters when you need to see the exact price a buyer in a specific region would see.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1014\" height=\"879\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/tt1-6.png\" alt=\"\u041b\u0438\u0447\u043d\u044b\u0439 \u043a\u0430\u0431\u0438\u043d\u0435\u0442 NodeMaven \" class=\"wp-image-39925\" style=\"aspect-ratio:1.1536010068203961;width:649px;height:auto\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/tt1-6.png 1014w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/tt1-6-300x260.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/tt1-6-768x666.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/tt1-6-14x12.png 14w\" sizes=\"auto, (max-width: 1014px) 100vw, 1014px\" \/><\/figure>\n\n\n\n<p><strong>Sticky sessions.<\/strong> Keep the same IP for as long as a review pagination job needs, then rotate for the next product.<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/nodemaven.com\/ru\/features\/ip-quality-filter\/\">IP quality filtering.<\/a><\/strong> Every IP is checked before it&#8217;s handed to you, which cuts down on the dead or already-flagged addresses that plague cheaper proxy pools.<\/p>\n\n\n\n<p><strong>None of this replaces good scraper design<\/strong>. Retry logic, headers, and pacing still matter. But pairing solid code with a proxy pool built for scraping is what turns a script that works for an afternoon into one that runs reliably every day.<\/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            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"186\" data-end=\"296\"><strong>Keep your Amazon scraper running with clean residential and mobile IPs.<\/strong><br data-start=\"1058\" data-end=\"1061\" \/><strong>Start your NodeMaven trial for $3.50 and enjoy 750 MB included.<\/strong><\/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 translation-block\" id=\"h-frequently-asked-questions\"><strong>\u0427\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435<\/strong> \u0432\u043e\u043f\u0440\u043e\u0441\u044b<\/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\">How do I scrape Amazon reviews 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>Send a request to the product&#8217;s review page using the ASIN, parse the HTML with BeautifulSoup targeting the <strong><em>data-hook=&#8221;review&#8221;<\/em><\/strong> blocks, then loop through pagination until reviews run out.<\/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 I scrape Amazon prices?<\/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>Yes. Prices sit in <strong><em>span.a-price-whole<\/em><\/strong> \u0438 <strong><em>span.a-price-fraction<\/em><\/strong> elements on the product page. Watch for regional variation based on the IP location making the request.<\/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 I scrape both prices and reviews together?<\/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>Yes. Fetch the product page for pricing data, then fetch the review pages using the same ASIN. Join the two datasets in pandas using the ASIN as the shared key.<\/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 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>Scraping publicly visible pages generally falls into a gray area shaped by past court rulings, but Amazon&#8217;s terms of service restrict automated access. Review Amazon&#8217;s terms and consult legal counsel before scraping at commercial scale.<\/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\">Do I need residential proxies?<\/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>For anything beyond a handful of requests a day, yes. Datacenter IPs get flagged quickly, while residential IPs carry a lower risk score with Amazon&#8217;s bot detection.<\/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 do Amazon prices differ by country?<\/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>Amazon serves regional pricing based on the buyer&#8217;s apparent location, currency, and local marketplace rules. A proxy located in the target country shows you the price a local buyer would actually see.<\/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\">How can I avoid CAPTCHA pages?<\/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>Use realistic headers, pace your requests with random delays, and route traffic through residential or mobile proxies. If a Robot Check page still appears, back off and rotate the IP rather than retrying immediately.<\/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 I use BeautifulSoup without Selenium?<\/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>For most product and review pages, yes. Amazon serves the core content in the initial HTML response, so Requests plus BeautifulSoup is usually enough without a full browser.<\/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 scraper in Python to collect product prices, ratings, and customer reviews. Follow a step-by-step guide using Requests, BeautifulSoup, and Pandas","protected":false},"author":80,"featured_media":39926,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[213,205],"class_list":["post-39924","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>Amazon Reviews &amp; Prices Scraper in Python: Step-by-Step Guide<\/title>\n<meta name=\"description\" content=\"Build an Amazon scraper in Python to collect product prices, and customer reviews. Follow our step-by-step guide with code examples\" \/>\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\/how-to-scrape-amazon-reviews-and-prices\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to scrape Amazon product reviews &amp; prices with Python\" \/>\n<meta property=\"og:description\" content=\"Build an Amazon scraper in Python to collect product prices, and customer reviews. Follow our step-by-step guide with code examples\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nodemaven.com\/ru\/blog\/how-to-scrape-amazon-reviews-and-prices\/\" \/>\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-30T13:40:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-30T13:40:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/as_featured.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Olga Kotko\" \/>\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=\"Olga Kotko\" \/>\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=\"12 \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\\\/how-to-scrape-amazon-reviews-and-prices\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/\"},\"author\":{\"name\":\"Olga Kotko\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/79a9c10c7956e31a5628504fe9cffe2e\"},\"headline\":\"How to scrape Amazon product reviews &#038; prices with Python\",\"datePublished\":\"2026-07-30T13:40:54+00:00\",\"dateModified\":\"2026-07-30T13:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/\"},\"wordCount\":2550,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/as_featured.png\",\"keywords\":[\"Guides &amp; Tutorials\",\"Web Scraping\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/\",\"name\":\"Amazon Reviews & Prices Scraper in Python: Step-by-Step Guide\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/as_featured.png\",\"datePublished\":\"2026-07-30T13:40:54+00:00\",\"dateModified\":\"2026-07-30T13:40:55+00:00\",\"description\":\"Build an Amazon scraper in Python to collect product prices, and customer reviews. Follow our step-by-step guide with code examples\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/as_featured.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/as_featured.png\",\"width\":1672,\"height\":941,\"caption\":\"Illustration of a Python Amazon scraper collecting product prices, ratings, and customer reviews for structured data extraction\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nodemaven.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to scrape Amazon product reviews &#038; prices 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\\\/how-to-scrape-amazon-reviews-and-prices\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#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\\\/79a9c10c7956e31a5628504fe9cffe2e\",\"name\":\"Olga Kotko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"caption\":\"Olga Kotko\"},\"description\":\"I write about proxies and automation, translating complicated digital topics into research-driven content people can actually enjoy reading\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/author\\\/olga-kotko\\\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-amazon-reviews-and-prices\\\/#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":"Amazon Reviews & Prices Scraper in Python: Step-by-Step Guide","description":"Build an Amazon scraper in Python to collect product prices, and customer reviews. Follow our step-by-step guide with code examples","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\/how-to-scrape-amazon-reviews-and-prices\/","og_locale":"ru_RU","og_type":"article","og_title":"How to scrape Amazon product reviews & prices with Python","og_description":"Build an Amazon scraper in Python to collect product prices, and customer reviews. Follow our step-by-step guide with code examples","og_url":"https:\/\/nodemaven.com\/ru\/blog\/how-to-scrape-amazon-reviews-and-prices\/","og_site_name":"NodeMaven","article_publisher":"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","article_published_time":"2026-07-30T13:40:54+00:00","article_modified_time":"2026-07-30T13:40:55+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/as_featured.png","type":"image\/png"}],"author":"Olga Kotko","twitter_card":"summary_large_image","twitter_misc":{"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c":"Olga Kotko","\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f":"12 \u043c\u0438\u043d\u0443\u0442"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#article","isPartOf":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/"},"author":{"name":"Olga Kotko","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/79a9c10c7956e31a5628504fe9cffe2e"},"headline":"How to scrape Amazon product reviews &#038; prices with Python","datePublished":"2026-07-30T13:40:54+00:00","dateModified":"2026-07-30T13:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/"},"wordCount":2550,"commentCount":0,"publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/as_featured.png","keywords":["Guides &amp; Tutorials","Web Scraping"],"articleSection":["Uncategorized"],"inLanguage":"ru-RU","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/nodemaven.com\/ru\/#organization"}},{"@type":"WebPage","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/","url":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/","name":"Amazon Reviews & Prices Scraper in Python: Step-by-Step Guide","isPartOf":{"@id":"https:\/\/nodemaven.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#primaryimage"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/as_featured.png","datePublished":"2026-07-30T13:40:54+00:00","dateModified":"2026-07-30T13:40:55+00:00","description":"Build an Amazon scraper in Python to collect product prices, and customer reviews. Follow our step-by-step guide with code examples","breadcrumb":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/"]}]},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#primaryimage","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/as_featured.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/as_featured.png","width":1672,"height":941,"caption":"Illustration of a Python Amazon scraper collecting product prices, ratings, and customer reviews for structured data extraction"},{"@type":"BreadcrumbList","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nodemaven.com\/"},{"@type":"ListItem","position":2,"name":"How to scrape Amazon product reviews &#038; prices 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\/how-to-scrape-amazon-reviews-and-prices\/#local-main-organization-logo"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#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\/79a9c10c7956e31a5628504fe9cffe2e","name":"\u041e\u043b\u044c\u0433\u0430 \u041a\u043e\u0442\u043a\u043e","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","caption":"Olga Kotko"},"description":"\u042f \u043f\u0438\u0448\u0443 \u043e \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0442\u0435\u043c\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u044e\u0434\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c.","url":"https:\/\/nodemaven.com\/ru\/author\/olga-kotko\/"},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-amazon-reviews-and-prices\/#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\/39924","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\/80"}],"replies":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/comments?post=39924"}],"version-history":[{"count":1,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39924\/revisions"}],"predecessor-version":[{"id":39927,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39924\/revisions\/39927"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media\/39926"}],"wp:attachment":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media?parent=39924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/categories?post=39924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/tags?post=39924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}