{"id":40607,"date":"2026-09-07T12:59:19","date_gmt":"2026-09-07T12:59:19","guid":{"rendered":"https:\/\/nodemaven.com\/?p=40607"},"modified":"2026-09-07T13:02:31","modified_gmt":"2026-09-07T13:02:31","slug":"ecommerce-data-scraping","status":"publish","type":"post","link":"https:\/\/nodemaven.com\/ru\/blog\/ecommerce-data-scraping\/","title":{"rendered":"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial"},"content":{"rendered":"<p><a href=\"https:\/\/nodemaven.com\/ru\/use-cases\/e-commerce-proxies\/\" data-type=\"use_case\" data-id=\"39816\">E-commerce<\/a> data scraping helps pricing teams, marketplace sellers, and catalogue managers collect public product information across competitor stores. A dependable workflow captures <strong>product identity, price, sale state, variant, location, and timestamp<\/strong> rather than saving one visible price.<\/p>\n\n\n\n<p>Start with an official API or product feed when it provides the required fields. For dynamic stores, inspect permitted public JSON responses. Use <strong>\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433\u0430 NodeMaven<\/strong> when the workflow requires rendered pages, browser interaction, location-specific offers, or a no-code setup.<\/p>\n\n\n\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u043c <a href=\"https:\/\/www.census.gov\/retail\/ecommerce.html\">U.S. Census Bureau\u2019s Q2 2026 Quarterly Retail E-Commerce Sales release<\/a>, U.S. retail e-commerce sales reached <strong>$340.2 billion<\/strong> during the quarter and represented <strong>17.1% of total retail sales<\/strong>. Product prices, promotions, variants, and regional offers can change quickly, so every observation needs clear comparison rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-key-takeaways\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 <strong>official source<\/strong>, then test permitted public JSON responses.<\/li>\n\n\n\n<li>\u0421\u043e\u0432\u043c\u0435\u0449\u0430\u0442\u044c <strong>product-listing and size-level variant data<\/strong> into one validated offer record.<\/li>\n\n\n\n<li>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c <strong>price, sale state, product ID, size, market, and timestamp<\/strong> with every captured offer.<\/li>\n\n\n\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>managed browser workflow<\/strong> for rendered pages, profile continuity, visual review, or cloud execution.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-choose-an-e-commerce-data-collection-method\">Choose an E-Commerce Data Collection Method<\/h2>\n\n\n\n<p>\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 <strong>\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433\u0430 NodeMaven<\/strong> when you need a no-code workflow, rendered pages, product filters, variant selection, location-aware offers, or recurring browser automation. Build the workflow with a ready-made template, a plain-language AI prompt, or code, without setting up a local browser.<\/p>\n\n\n\n<p>Scraping Browser includes <strong>NodeMaven proxies, managed anti-detection, automatic CAPTCHA solving, reusable profiles, Live Browser, and session recordings<\/strong>. There is no separate browser fee. You pay for the rotating proxy traffic used during sessions. <\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Want to collect e-commerce data without building the browser stack yourself?<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">Try NodeMaven Scraping Browser with the $3.50 paid trial, including 750 MB of residential and mobile proxy traffic. <strong>Scraping Browser has no separate browser fee:<\/strong> browser runtime, templates, AI prompts, CAPTCHA solving, Live Browser, and session recordings are included with eligible proxy traffic.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441        <\/a>\n    <\/div>\n<\/div>\n\n\n<p>The right method still depends on the retailer and the fields required for the collection.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u041c\u0435\u0442\u043e\u0434<\/th><th>\u041d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435<\/th><th>NodeMaven role<\/th><\/tr><\/thead><tbody><tr><td><strong><a href=\"https:\/\/nodemaven.com\/ru\/proxies\/scraping-browser\/\" data-type=\"proxies\" data-id=\"36315\">\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433\u0430<\/a><\/strong><\/td><td>No-code collection, JavaScript-heavy stores, filters, pagination, selected variants, location-sensitive offers, and recurring workflows<\/td><td>Built-in proxies, CAPTCHA solving, AI prompts, templates, Live Browser, session recordings, and reusable profiles<\/td><\/tr><tr><td>Official API or feed<\/td><td>A retailer or supplier provides documented access and the required product fields<\/td><td>Proxy configuration is usually unnecessary<\/td><\/tr><tr><td>Permitted public JSON<\/td><td>A validated frontend response contains product data and remains stable enough to monitor<\/td><td>Use NodeMaven proxies for regional results or repeated requests<\/td><\/tr><tr><td>HTML-\u043f\u0430\u0440\u0441\u0438\u043d\u0433<\/td><td>Required fields appear in the initial page source<\/td><td>Use proxies when location or request continuity affects the displayed result<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Choose the lightest method that returns the required fields reliably. Validate one product and one location before scaling to a full category. For a technical comparison of direct requests and browser collection, see NodeMaven\u2019s <a href=\"https:\/\/nodemaven.com\/ru\/blog\/web-scraping-vs-api\/\">web scraping vs. API guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-configure-proxy-context-for-regional-and-repeated-collection\">Configure Proxy Context for Regional and Repeated Collection<\/h2>\n\n\n\n<p>A product offer can change by <strong>country, city, ZIP code, currency, delivery location, or session state<\/strong>. Set the collection location before comparing offers, then keep that context with every saved record.<\/p>\n\n\n\n<p>For repeated permitted requests, NodeMaven <a href=\"https:\/\/nodemaven.com\/ru\/proxies\/residential-proxies\/\">\u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c <strong>\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u044b, \u0433\u043e\u0440\u043e\u0434\u0430, ISP \u0438 ZIP<\/strong>. Sticky sessions can preserve the same IP across a connected browsing flow. Rotating sessions suit independent product requests that do not need shared browser state. <\/p>\n\n\n\n<p>Use the same market context when validating the browser page, public response, and exported record. A price from one location should not be compared directly with an offer collected from another.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Need a stable proxy session for your e-commerce data workflow?<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">Start with NodeMaven\u2019s <\/span><b>\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0437\u0430 $3.50<\/b><span style=\"font-weight: 400\">, which includes <\/span><b>750 MB of residential and mobile proxy traffic<\/b><span style=\"font-weight: 400\">. Test location-aware requests, sticky sessions, and your Python integration before moving to a larger plan.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-define-product-and-offer-data-before-collecting-pages\">Define Product and Offer Data Before Collecting Pages<\/h2>\n\n\n\n<p>A <strong>product record<\/strong> describes the item itself:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Name<\/li>\n\n\n\n<li>\u0411\u0440\u0435\u043d\u0434<\/li>\n\n\n\n<li>Retailer product ID<\/li>\n\n\n\n<li>Catalogue ID<\/li>\n\n\n\n<li>Colour<\/li>\n\n\n\n<li>Variant<\/li>\n\n\n\n<li>Size<\/li>\n\n\n\n<li>GTIN<\/li>\n<\/ul>\n\n\n\n<p>\u0410\u043d <strong>offer observation<\/strong> describes the offer shown for that item at a stated time and location:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0446\u0435\u043d\u0430<\/li>\n\n\n\n<li>Sale status<\/li>\n\n\n\n<li>Currency<\/li>\n\n\n\n<li>Market country<\/li>\n\n\n\n<li>Source URL<\/li>\n\n\n\n<li>Session or location context<\/li>\n\n\n\n<li>Capture timestamp<\/li>\n<\/ul>\n\n\n\n<p>For example, \u201cNike Shox Z, colour HQ7540-011, women\u2019s size 7\u201d is a product variant. A $78.97 sale offer for that variant on a U.S. storefront at 09:00 UTC is an offer observation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-compare-equivalent-offers\">Compare Equivalent Offers<\/h2>\n\n\n\n<p>A listed price needs product context. Two products with the same name can differ by size, colour, pack size, condition, seller, delivery terms, or market.<\/p>\n\n\n\n<p>Before comparing competitors, confirm:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Product identity:<\/strong> retailer product ID, brand, title, and model<\/li>\n\n\n\n<li><strong>Variant identity:<\/strong> size, colour, SKU, and GTIN where available<\/li>\n\n\n\n<li><strong>Price type:<\/strong> regular price, sale price, member price, or marketplace offer<\/li>\n\n\n\n<li><strong>\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/strong> country, city, ZIP code, currency, and delivery context<\/li>\n\n\n\n<li><strong>Time:<\/strong> capture timestamp and collection frequency<\/li>\n<\/ul>\n\n\n\n<p>\u0417\u043e\u043d\u0430 <a href=\"https:\/\/www.bls.gov\/evaluation\/modernizing-the-consumer-price-index-for-the-21st-century.pdf\">National Academies\u2019 review of web-scraped price data<\/a> discusses risks such as outliers, seller relevance, changing websites, and location-specific results. Those checks belong in any pricing or stock-monitoring workflow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-build-a-python-workflow-for-public-product-data\">Build a Python Workflow for Public Product Data<\/h2>\n\n\n\n<p>This tutorial uses a public Nike women\u2019s-sneakers results page to show how to identify a product-data response and map its fields. The Python example uses <strong>generic placeholder URLs<\/strong>. Replace them only after validating an official source or permitted public response for the retailer you are collecting from.<\/p>\n\n\n\n<p>The workflow follows this sequence:<\/p>\n\n\n\n<p><strong>Product-listing response \u2192 product identity and price \u2192 size-level SKU and GTIN data \u2192 validated offer record \u2192 CSV or SQL history<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-1-find-the-product-search-request\">Step 1: Find the Product Search Request<\/h3>\n\n\n\n<p>Open a public product-search or category page. In this example, the page displays Nike women\u2019s sneakers.<\/p>\n\n\n\n<p>\u041e\u0442\u043a\u0440\u044b\u0442\u044c <strong>Chrome DevTools<\/strong>, \u0432\u044b\u0431\u0440\u0430\u0442\u044c <strong>\u0421\u0435\u0442\u044c<\/strong>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c <strong>Fetch\/XHR<\/strong>. Reload the page or run a search. The Network panel will show requests triggered by the listing page.<\/p>\n\n\n\n<p>Look for the request that returns the products shown on the page. On the Nike results page, the relevant request is named <strong><code>\u041f\u0440\u043e\u0434\u0443\u043a\u0442\u044b<\/code><\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"515\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1-1024x515.png\" alt=\"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial\" class=\"wp-image-40608\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1-1024x515.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1-300x151.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1-768x386.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1-1536x773.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1-18x9.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-1.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Chrome DevTools Network tab filtered to Fetch\/XHR requests on a Nike women\u2019s sneakers search-results page, with the products request selected<\/figcaption><\/figure>\n\n\n\n<p>The request list may also include analytics, event tracking, and recommendation calls. Select the request connected to the visible product cards before opening its response.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-2-map-the-response-fields\">Step 2: Map the Response Fields<\/h3>\n\n\n\n<p>The Nike <strong><code>\u041f\u0440\u043e\u0434\u0443\u043a\u0442\u044b<\/code><\/strong> response contains an array named <code>hydratedProducts<\/code>. Each product object includes a retailer product ID, title, current price, sale status, colour code, and market country.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"json\"><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-json\" data-rhino-code=\"%7B%0A%20%20%22hydratedProducts%22%3A%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22isOnSale%22%3A%20true%2C%0A%20%20%20%20%20%20%22catalogId%22%3A%20%229ae04562-788c-458c-9bbb-ba5c28c72ab2%22%2C%0A%20%20%20%20%20%20%22name%22%3A%20%22W%20NIKE%20SHOX%20Z%22%2C%0A%20%20%20%20%20%20%22currentPrice%22%3A%2078.97%2C%0A%20%20%20%20%20%20%22productId%22%3A%20%221015830972%22%2C%0A%20%20%20%20%20%20%22cloudProductId%22%3A%20%22ac1cc85b-4ae6-465f-58f9-923b-1af2f34ea872%22%2C%0A%20%20%20%20%20%20%22color%22%3A%20%22HQ7540-011%22%2C%0A%20%20%20%20%20%20%22country%22%3A%20%22us%22%0A%20%20%20%20%7D%0A%20%20%5D%0A%7D\"><\/code><\/pre><\/figure>\n\n\n<p>Map the fields into an offer record as follows:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Nike JSON field<\/th><th>Output field<\/th><\/tr><\/thead><tbody><tr><td><code>hydratedProducts[].productId<\/code><\/td><td><strong>retailer_product_id<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].catalogId<\/code><\/td><td><strong>catalog_id<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].name<\/code><\/td><td><strong>\u0438\u043c\u044f<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].currentPrice<\/code><\/td><td><strong>current_price<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].isOnSale<\/code><\/td><td><strong>is_on_sale<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].color<\/code><\/td><td><strong>colour_code<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].country<\/code><\/td><td><strong>market_country<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].cloudProductId<\/code><\/td><td><strong>cloud_product_id<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Check the price against the visible product card before adding it to a dataset. In this example, the Nike Shox Z card displays <strong>$78.97<\/strong>, matching <code>currentPrice: 78.97<\/code> in the response.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"515\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2-1024x515.png\" alt=\"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial\" class=\"wp-image-40609\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2-1024x515.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2-300x151.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2-768x386.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2-1536x773.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2-18x9.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-2.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Nike products JSON response showing a product name, current price, sale status, product ID, colour code, and market country.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-3-test-one-product-before-collecting-a-category\">Step 3: Test One Product Before Collecting a Category<\/h3>\n\n\n\n<p>Validate one product before collecting an entire category.<\/p>\n\n\n\n<p>For the Nike Shox Z example, confirm the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The visible product card matches <code>hydratedProducts[].name<\/code>.<\/li>\n\n\n\n<li>The card price matches <code>hydratedProducts[].currentPrice<\/code>.<\/li>\n\n\n\n<li>The record includes <code>productId<\/code>, <code>catalogId<\/code>, \u0438 <code>color<\/code>.<\/li>\n\n\n\n<li>The response\u2019s <code>\u0421\u0442\u0440\u0430\u043d\u0430<\/code> matches the market being monitored.<\/li>\n\n\n\n<li>The price is marked correctly as regular or sale pricing through <code>isOnSale<\/code>.<\/li>\n\n\n\n<li>One size shown on the product page matches a <code>skuData[].size<\/code> value in the response.<\/li>\n<\/ul>\n\n\n\n<p>A product ID match alone does not prove that a price is ready for comparison. The product name, price, colour, market, sale state, and selected size must refer to the same offer.<\/p>\n\n\n\n<p>If a price or selected size differs from the page, check the chosen colour, size, currency, country, tax display, promotion state, and cached-response context before storing the record.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-4-set-up-python\">Step 4: Set Up Python<\/h3>\n\n\n\n<p>Create a virtual environment and install the packages used in the example.<\/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=\"python%20-m%20venv%20.venv%0Asource%20.venv%2Fbin%2Factivate%0Apip%20install%20requests%20pydantic\"><\/code><\/pre><\/figure>\n\n\n<p>The code below uses a generic endpoint placeholder and the Nike response shape demonstrated in the screenshots. Do not copy an endpoint URL from this article into a live collection script.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-configure-the-session-before-sending-requests\">Configure the Session Before Sending Requests<\/h3>\n\n\n\n<p>For a permitted workflow that requires a specific market or repeated collection, configure the proxy session before requesting product data. Add your NodeMaven credentials from the dashboard rather than copying them into a shared script.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20requests%0A%0A%0APROXY_URL%20%3D%20%22http%3A%2F%2FUSERNAME%3APASSWORD%40PROXY_HOST%3APORT%22%0A%0A%0Adef%20build_session%28%29%3A%0A%20%20%20%20session%20%3D%20requests.Session%28%29%0A%0A%20%20%20%20session.proxies.update%28%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22http%22%3A%20PROXY_URL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22https%22%3A%20PROXY_URL%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%29%0A%0A%20%20%20%20return%20session\"><\/code><\/pre><\/figure>\n\n\n<p>Use a location that matches the market being monitored. For a multi-step browser flow, use a sticky session when the same location and session context must remain consistent. For independent product requests, rotating residential proxies can provide fresh IPs without carrying browser state between products.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Need a stable proxy session for your e-commerce data workflow?<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">Start with NodeMaven\u2019s <\/span><b>\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0437\u0430 $3.50<\/b><span style=\"font-weight: 400\">, which includes <\/span><b>750 MB of residential and mobile proxy traffic<\/b><span style=\"font-weight: 400\">. Test location-aware requests, sticky sessions, and your Python integration before moving to a larger plan.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441        <\/a>\n    <\/div>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-5-create-a-product-data-model-and-request-helpers\">Step 5: Create a Product Data Model and Request Helpers<\/h3>\n\n\n\n<p>The Nike response establishes a product-listing data structure, but the screenshots do not establish a pagination parameter. Start with one validated response.<\/p>\n\n\n\n<p>Some retailers use <code>\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430<\/code>, <code>offset<\/code>, <code>start<\/code>, <code>cursor<\/code>, \u0438\u043b\u0438 <code>limit<\/code> for pagination. Add a pagination loop only after inspecting the listing request and confirming the relevant parameter.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"from%20datetime%20import%20datetime%2C%20timezone%0Aimport%20csv%0Aimport%20logging%0A%0Aimport%20requests%0Afrom%20pydantic%20import%20BaseModel%0A%0A%0A%23%20Placeholder%20only.%20Replace%20after%20validating%20a%20permitted%20public%20response.%0APRODUCTS_URL%20%3D%20%22https%3A%2F%2Fstore.example%2Fapi%2Fproducts%22%0A%0A%0Aclass%20OfferObservation%28BaseModel%29%3A%0A%20%20%20%20retailer_product_id%3A%20str%0A%20%20%20%20catalog_id%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20cloud_product_id%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20name%3A%20str%0A%20%20%20%20current_price%3A%20float%20%7C%20None%20%3D%20None%0A%20%20%20%20is_on_sale%3A%20bool%20%7C%20None%20%3D%20None%0A%20%20%20%20colour_code%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20market_country%3A%20str%0A%20%20%20%20source_url%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20variant_sku%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20variant_size%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20variant_gtin%3A%20str%20%7C%20None%20%3D%20None%0A%20%20%20%20captured_at%3A%20str%0A%0A%0Adef%20get_json%28session%2C%20url%2C%20params%3DNone%29%3A%0A%20%20%20%20response%20%3D%20session.get%28url%2C%20params%3Dparams%2C%20timeout%3D30%29%0A%20%20%20%20response.raise_for_status%28%29%0A%20%20%20%20return%20response.json%28%29%0A%0A%0Adef%20build_base_record%28product%2C%20market_country%29%3A%0A%20%20%20%20product_id%20%3D%20product.get%28%22productId%22%29%0A%20%20%20%20name%20%3D%20product.get%28%22name%22%29%0A%0A%20%20%20%20if%20not%20product_id%20or%20not%20name%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22Product%20response%20is%20missing%20an%20ID%20or%20name%22%29%0A%0A%20%20%20%20price%20%3D%20product.get%28%22currentPrice%22%29%0A%0A%20%20%20%20return%20OfferObservation%28%0A%20%20%20%20%20%20%20%20retailer_product_id%3Dstr%28product_id%29%2C%0A%20%20%20%20%20%20%20%20catalog_id%3Dproduct.get%28%22catalogId%22%29%2C%0A%20%20%20%20%20%20%20%20cloud_product_id%3Dproduct.get%28%22cloudProductId%22%29%2C%0A%20%20%20%20%20%20%20%20name%3Dname%2C%0A%20%20%20%20%20%20%20%20current_price%3Dfloat%28price%29%20if%20price%20is%20not%20None%20else%20None%2C%0A%20%20%20%20%20%20%20%20is_on_sale%3Dproduct.get%28%22isOnSale%22%29%2C%0A%20%20%20%20%20%20%20%20colour_code%3Dproduct.get%28%22color%22%29%2C%0A%20%20%20%20%20%20%20%20market_country%3Dproduct.get%28%22country%22%2C%20market_country%29%2C%0A%20%20%20%20%20%20%20%20source_url%3Dproduct.get%28%22url%22%29%2C%0A%20%20%20%20%20%20%20%20captured_at%3Ddatetime.now%28timezone.utc%29.isoformat%28%29%2C%0A%20%20%20%20%29\"><\/code><\/pre><\/figure>\n\n\n<p>This model keeps the <strong>retailer product ID, current price, sale state, colour, market, and capture time<\/strong> together. Those fields support later comparisons without losing the context behind a price.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-6-add-variant-data-from-the-product-response\">Step 6: Add Variant Data From the Product Response<\/h3>\n\n\n\n<p>The Nike product response contains a <code>skuData<\/code> array for size-level product variants. Each entry includes a displayed size, a retailer SKU, and a GTIN.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"json\"><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-json\" data-rhino-code=\"%7B%0A%20%20%22skuData%22%3A%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22size%22%3A%20%22W%205%20%2F%20M%203.5%22%2C%0A%20%20%20%20%20%20%22sku%22%3A%20%222029291-f51f-5934-b9ff-8d249e939427%22%2C%0A%20%20%20%20%20%20%22gtin%22%3A%20%2200198959370104%22%0A%20%20%20%20%7D%2C%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22size%22%3A%20%22W%205.5%20%2F%20M%204%22%2C%0A%20%20%20%20%20%20%22sku%22%3A%20%22d060897-c60f-51f9-9b27-e70286c5c1ee%22%2C%0A%20%20%20%20%20%20%22gtin%22%3A%20%2200198959718265%22%0A%20%20%20%20%7D%0A%20%20%5D%0A%7D\"><\/code><\/pre><\/figure>\n\n\n<p>Map the size-level fields into the collection record as follows:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Nike JSON field<\/th><th>Output field<\/th><\/tr><\/thead><tbody><tr><td><code>hydratedProducts[].skuData[].size<\/code><\/td><td><strong>variant_size<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].skuData[].sku<\/code><\/td><td><strong>variant_sku<\/strong><\/td><\/tr><tr><td><code>hydratedProducts[].skuData[].gtin<\/code><\/td><td><strong>variant_gtin<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Use the selected product page to validate one record. For example, confirm that the size button <strong>W 5 \/ M 3.5<\/strong> on the page matches the <code>size<\/code> field in the JSON response.<\/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=\"def%20attach_variant_data%28record%2C%20sku_data%29%3A%0A%20%20%20%20return%20record.model_copy%28%0A%20%20%20%20%20%20%20%20update%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22variant_sku%22%3A%20sku_data.get%28%22sku%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22variant_size%22%3A%20sku_data.get%28%22size%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22variant_gtin%22%3A%20sku_data.get%28%22gtin%22%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%29%0A%0A%0Adef%20expand_variant_records%28record%2C%20product%29%3A%0A%20%20%20%20sku_data%20%3D%20product.get%28%22skuData%22%2C%20%5B%5D%29%0A%0A%20%20%20%20if%20not%20sku_data%3A%0A%20%20%20%20%20%20%20%20yield%20record%0A%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20for%20variant%20in%20sku_data%3A%0A%20%20%20%20%20%20%20%20yield%20attach_variant_data%28record%2C%20variant%29\"><\/code><\/pre><\/figure>\n\n\n<p>Each exported row can now represent one product-size combination. This supports product matching across retailers and lets a monitoring workflow distinguish between two offers for the same shoe in different sizes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"514\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3-1024x514.png\" alt=\"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial\" class=\"wp-image-40610\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3-1024x514.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3-300x150.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3-768x385.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3-1536x770.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3-18x9.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-3.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Nike product JSON response showing size-level SKU and GTIN data beside a public product page with selectable shoe sizes.<\/figcaption><\/figure>\n\n\n\n<p>The response shown here does not provide an explicit availability or stock-status field. Do not infer stock from the presence of a size in <code>skuData<\/code>. Add stock data only when a permitted response provides a clear field, such as <code>inStock<\/code>, <code>\u043d\u0430\u043b\u0438\u0447\u0438\u0435<\/code>, <code>inventory<\/code>, \u0438\u043b\u0438 <code>availability_status<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-7-run-the-complete-collection-flow-and-export-a-csv\">Step 7: Run the Complete Collection Flow and Export a CSV<\/h3>\n\n\n\n<p>After validating the field map, request the permitted product-listing response, extract product records, and export valid observations to a CSV file.<\/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=\"def%20is_valid_observation%28record%29%3A%0A%20%20%20%20required%20%3D%20%5B%0A%20%20%20%20%20%20%20%20record.retailer_product_id%2C%0A%20%20%20%20%20%20%20%20record.name%2C%0A%20%20%20%20%20%20%20%20record.current_price%2C%0A%20%20%20%20%20%20%20%20record.market_country%2C%0A%20%20%20%20%20%20%20%20record.captured_at%2C%0A%20%20%20%20%5D%0A%20%20%20%20return%20all%28value%20is%20not%20None%20for%20value%20in%20required%29%0A%0A%0Adef%20export_csv%28records%2C%20filename%3D%22competitor_products.csv%22%29%3A%0A%20%20%20%20fieldnames%20%3D%20list%28OfferObservation.model_fields%29%0A%0A%20%20%20%20with%20open%28filename%2C%20%22w%22%2C%20newline%3D%22%22%2C%20encoding%3D%22utf-8%22%29%20as%20file%3A%0A%20%20%20%20%20%20%20%20writer%20%3D%20csv.DictWriter%28file%2C%20fieldnames%3Dfieldnames%29%0A%20%20%20%20%20%20%20%20writer.writeheader%28%29%0A%0A%20%20%20%20%20%20%20%20for%20record%20in%20records%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20writer.writerow%28record.model_dump%28%29%29%0A%0A%0Adef%20main%28%29%3A%0A%20%20%20%20market_country%20%3D%20%22us%22%0A%20%20%20%20valid_records%20%3D%20%5B%5D%0A%20%20%20%20review_rows%20%3D%20%5B%5D%0A%0A%20%20%20%20with%20build_session%28%29%20as%20session%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Replace%20parameters%20only%20after%20inspecting%20the%20permitted%20request.%0A%20%20%20%20%20%20%20%20%20%20%20%20payload%20%3D%20get_json%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20session%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PRODUCTS_URL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params%3D%7B%22query%22%3A%20%22women%27s%20sneakers%22%7D%2C%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%20for%20product%20in%20payload.get%28%22hydratedProducts%22%2C%20%5B%5D%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20base_record%20%3D%20build_base_record%28product%2C%20market_country%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20record%20in%20expand_variant_records%28base_record%2C%20product%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20is_valid_observation%28record%29%3A%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%20valid_records.append%28record%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%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%20review_rows.append%28%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%7B%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%22retailer_product_id%22%3A%20record.retailer_product_id%2C%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%22reason%22%3A%20%22Missing%20required%20offer%20field%22%2C%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%7D%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%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%20ValueError%20as%20error%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20review_rows.append%28%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%7B%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%22retailer_product_id%22%3A%20product.get%28%22productId%22%29%2C%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%22reason%22%3A%20str%28error%29%2C%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%7D%0A%20%20%20%20%20%20%20%20%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%20error%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20logging.warning%28%22Product%20request%20failed%3A%20%25s%22%2C%20error%29%0A%20%20%20%20%20%20%20%20%20%20%20%20review_rows.append%28%0A%20%20%20%20%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%20%20%20%20%22retailer_product_id%22%3A%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22reason%22%3A%20%22Product%20request%20failed%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20export_csv%28valid_records%29%0A%0A%20%20%20%20print%28f%22Collected%3A%20%7Blen%28valid_records%29%20%2B%20len%28review_rows%29%7D%22%29%0A%20%20%20%20print%28f%22Exported%3A%20%7Blen%28valid_records%29%7D%22%29%0A%20%20%20%20print%28f%22Review%20needed%3A%20%7Blen%28review_rows%29%7D%22%29%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20main%28%29\"><\/code><\/pre><\/figure>\n\n\n<p>Expected terminal output:<\/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=\"Collected%3A%2048%0AExported%3A%2045%0AReview%20needed%3A%203\"><\/code><\/pre><\/figure>\n\n\n<p>Example CSV output:<\/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=\"retailer_product_id%2Cname%2Ccurrent_price%2Cis_on_sale%2Ccolour_code%2Cmarket_country%2Cvariant_sku%2Cvariant_size%2Cvariant_gtin%2Ccaptured_at%0A152949253%2CWMNS%20AIR%20JORDAN%201%20LOW%2C120%2Cfalse%2C%2Cus%2C2029291-f51f-5934-b9ff-8d249e939427%2CW%205%20%2F%20M%203.5%2C00198959370104%2C2026-09-07T12%3A00%3A00Z\"><\/code><\/pre><\/figure>\n\n\n<p>The CSV provides a simple validation layer before building a larger monitoring pipeline. Review rows with missing product IDs, prices, market data, or unexpected response shapes before using them in pricing analysis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-8-store-observations-in-sql\">Step 8: Store Observations in SQL<\/h3>\n\n\n\n<p>A CSV works well during early validation. A SQL database supports price history, retailer comparisons, category analysis, and location-specific reporting.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"sql\"><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-sql\" data-rhino-code=\"CREATE%20TABLE%20product_observations%20%28%0A%20%20%20%20id%20BIGSERIAL%20PRIMARY%20KEY%2C%0A%20%20%20%20retailer%20TEXT%20NOT%20NULL%2C%0A%20%20%20%20retailer_product_id%20TEXT%20NOT%20NULL%2C%0A%20%20%20%20catalog_id%20TEXT%2C%0A%20%20%20%20cloud_product_id%20TEXT%2C%0A%20%20%20%20product_name%20TEXT%20NOT%20NULL%2C%0A%20%20%20%20current_price%20NUMERIC%2C%0A%20%20%20%20is_on_sale%20BOOLEAN%2C%0A%20%20%20%20colour_code%20TEXT%2C%0A%20%20%20%20market_country%20TEXT%20NOT%20NULL%2C%0A%20%20%20%20source_url%20TEXT%2C%0A%20%20%20%20variant_sku%20TEXT%2C%0A%20%20%20%20variant_size%20TEXT%2C%0A%20%20%20%20variant_gtin%20TEXT%2C%0A%20%20%20%20captured_at%20TIMESTAMPTZ%20NOT%20NULL%0A%29%3B\"><\/code><\/pre><\/figure>\n\n\n<p>Keep product identity separate from individual observations as the system grows. One product can produce many price records over time across colours, sizes, countries, and retailers.<\/p>\n\n\n\n<p>Store a raw-response reference or a small audit sample with each collection run. When a retailer changes its response structure, those records help the team update field mappings without confusing a format change with a real price movement.<\/p>\n\n\n\n<p>After the single-request workflow is validated, <a href=\"https:\/\/nodemaven.com\/ru\/blog\/python-async-requests\/\">Python async requests<\/a> can support controlled scaling.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-validate-every-offer-observation\">Validate Every Offer Observation<\/h2>\n\n\n\n<p>A 200 response confirms that the server answered the request. A comparable offer observation needs matching <strong>product identity, variant, price type, currency, location, and timestamp<\/strong>.<\/p>\n\n\n\n<p>For marketplace offers, add seller, item condition, fulfillment method, and shipping data. For products sold in different quantities, calculate the price per unit before comparing offers.<\/p>\n\n\n\n<p>When a workflow uses a connected browser session, location continuity affects results. Independent product requests can use rotation. Multi-step browsing often needs one stable session until the workflow ends. Read NodeMaven\u2019s <a href=\"https:\/\/nodemaven.com\/ru\/blog\/proxy-rotation-guide\/\">proxy rotation guide<\/a> before selecting session behavior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-use-nodemaven-scraping-browser-for-browser-based-e-commerce-collection\">Use NodeMaven Scraping Browser for Browser-Based E-Commerce Collection<\/h2>\n\n\n\n<p>NodeMaven Scraping Browser supports far more than pages requiring clicks or ZIP-code entry. It gives e-commerce teams a managed cloud browser for collecting public product data through rendered pages, browser profiles, scheduled automation, location-aware sessions, and visual debugging.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"531\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4-1024x531.png\" alt=\"\" class=\"wp-image-40611\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4-1024x531.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4-300x156.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4-768x398.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4-1536x797.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4-18x9.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/image-4.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">NodeMaven Scraping Browser settings for an e-commerce product-data collection workflow.<\/figcaption><\/figure>\n\n\n\n<p>Use Scraping Browser when the workflow requires:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>JavaScript-rendered<\/strong> category and product pages<\/li>\n\n\n\n<li>Product search, filters, and pagination<\/li>\n\n\n\n<li>Variant, size, colour, or quantity selection<\/li>\n\n\n\n<li>ZIP code, city, country, currency, or delivery-location settings<\/li>\n\n\n\n<li>Recurring price, catalogue, launch, or stock monitoring<\/li>\n\n\n\n<li>Reusable browser profiles that preserve cookies and local settings<\/li>\n\n\n\n<li>Live Browser, console output, screenshots, and recordings for troubleshooting<\/li>\n\n\n\n<li>Playwright, Puppeteer, Vanilla JavaScript, or plain-language AI prompts<\/li>\n<\/ul>\n\n\n\n<p>A public JSON response can be the leanest route for a stable permitted endpoint. Scraping Browser also fits teams that prefer a complete browser workflow for the target, particularly when catalogue pages change, location affects the offer, or the team needs visual review before sending the workflow into production.<\/p>\n\n\n\n<p>A practical setup looks like this:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Select an e-commerce or price-monitoring template.<\/li>\n\n\n\n<li>Set proxy type, location, session behavior, and browser settings.<\/li>\n\n\n\n<li>Test category, search, or product-page collection in Playground.<\/li>\n\n\n\n<li>Review the rendered output in Live Browser.<\/li>\n\n\n\n<li>Confirm product ID, selected variant, price, source URL, and location context.<\/li>\n\n\n\n<li>Save the workflow as a reusable profile or connect through CDP from Playwright or Puppeteer.<\/li>\n\n\n\n<li>Schedule it from a backend, queue, or monitoring system.<\/li>\n<\/ol>\n\n\n\n<p>\u0417\u043e\u043d\u0430 <a href=\"https:\/\/nodemaven.com\/ru\/blog\/scraping-browser-guide\/\">NodeMaven Scraping Browser guide<\/a> covers templates, profiles, location settings, sessions, Live Browser, and CDP connections.<\/p>\n\n\n\n<p><strong>Prefer to collect e-commerce data without building the browser stack yourself?<\/strong> Try NodeMaven Scraping Browser with the <strong>\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0437\u0430 $3.50<\/strong>, \u0432\u043a\u043b\u044e\u0447\u0430\u044f <strong>750 MB of residential and mobile proxy traffic<\/strong>. Browser runtime, templates, AI prompts, CAPTCHA solving, Live Browser, and session recordings are included with eligible proxy traffic. <a href=\"https:\/\/dashboard.nodemaven.com\/\">Try Scraping Browser for $3.50<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion-choose-the-lightest-reliable-workflow\">Conclusion: Choose the Lightest Reliable Workflow<\/h2>\n\n\n\n<p>Choose the collection method that returns the required product fields with the least maintenance. Start with an official feed when one is available. Use a permitted public JSON response when the request exposes a stable field map. Add HTML parsing when the fields are present in the initial page source.<\/p>\n\n\n\n<p>For teams that need a no-code route, rendered pages, browser interaction, regional product offers, or recurring workflows, <strong>NodeMaven Scraping Browser combines browser automation with built-in proxy handling and visual debugging<\/strong>. For Python-based collection, NodeMaven residential proxies give the workflow a consistent market context and stable sessions where the retailer experience requires them.<\/p>\n\n\n\n<p>Validate one product, one variant, and one location before adding a full category or another retailer. Store the product ID, price, colour, size, market, source URL, and timestamp with every observation.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n                            <div class=\"section-alert__title\">Want to collect e-commerce data without building the browser stack yourself?<\/div>\n            \n                            <div class=\"section-alert__description\"><p><span style=\"font-weight: 400\">Try NodeMaven Scraping Browser with the $3.50 paid trial, including 750 MB of residential and mobile proxy traffic. <strong>Scraping Browser has no separate browser fee:<\/strong> browser runtime, templates, AI prompts, CAPTCHA solving, Live Browser, and session recordings are included with eligible proxy traffic.<\/span><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-frequently-asked-questions\">\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<\/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\">Which e-commerce data collection method should I use?<\/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><span style=\"font-weight: 400\">Start with an official API or product feed when it provides the required fields. Use public JSON when a validated frontend response returns product data. Use HTML parsing for simple server-rendered pages. Choose <\/span><b>\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433\u0430 NodeMaven<\/b><span style=\"font-weight: 400\"> when the workflow requires rendering, interaction, location settings, stable browser state, or a no-code setup.<\/span><\/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 track competitor prices on Amazon and eBay?<\/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><span style=\"font-weight: 400\">Capture the product match, seller, item condition, quantity, shipping, price type, currency, and timestamp alongside the listed price. Marketplace offers can change by seller and fulfillment method, so a price without those fields is rarely comparable. For Amazon-specific workflows, see NodeMaven\u2019s<\/span><a href=\"https:\/\/nodemaven.com\/ru\/blog\/how-to-build-an-amazon-price-tracker-with-python\/\"> <span style=\"font-weight: 400\">Amazon price tracker tutorial<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/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 monitor Shopify stores for new product launches?<\/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><span style=\"font-weight: 400\">Store a catalogue baseline, then compare product IDs, URLs, variants, images, collections, and price data during later runs. Review each detected change before calling it a launch. For JavaScript-heavy storefronts or workflows that need filters, pagination, and browser interaction, <\/span><b>\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433\u0430 NodeMaven<\/b><span style=\"font-weight: 400\"> can run the collection through a managed browser session.<\/span><\/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 collect e-commerce stock availability every day?<\/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><span style=\"font-weight: 400\">Yes, when the retailer publishes a clear stock field in a permitted response or the browser workflow can validate the selected product state. <\/span><b>\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433\u0430 NodeMaven<\/b><span style=\"font-weight: 400\"> can load rendered product pages, select a variant or delivery location, and capture the resulting page state in Live Browser. Keep request failures separate from genuine stock changes.<\/span><\/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 e-commerce data without coding?<\/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><span style=\"font-weight: 400\">Yes. NodeMaven Scraping Browser supports <\/span><b>ready-made templates and plain-language AI prompts<\/b><span style=\"font-weight: 400\"> for browser-based collection. Configure location and session settings, test the workflow in Playground, review it in Live Browser, and save it as a reusable profile. Teams that need custom logic can also connect through Playwright, Puppeteer, or CDP.<\/span><\/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 do I save competitor product data to SQL?<\/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><span style=\"font-weight: 400\">Store product identity separately from retailer offers and timestamped observations. Keep product IDs, variant identifiers, market context, source URLs, and capture time with each offer. This history supports price comparisons, change alerts, and later product-matching repairs.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">What is the difference between a product record and an offer observation?<\/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><span style=\"font-weight: 400\">A <\/span><b>product record<\/b><span style=\"font-weight: 400\"> describes the item, such as its name, brand, SKU, GTIN, colour, and size. An <\/span><b>offer observation<\/b><span style=\"font-weight: 400\"> describes a retailer\u2019s price and sale state for that product variant at a stated location and time.<\/span><\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                    <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\"><\/h3>","protected":false},"excerpt":{"rendered":"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.","protected":false},"author":68,"featured_media":40612,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[213,234,205],"class_list":["post-40607","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guides-tutorials","tag-scraping-browser","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>E-Commerce Data Scraping: Methods, Tools, and Python Tutorial<\/title>\n<meta name=\"description\" content=\"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.\" \/>\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\/ecommerce-data-scraping\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial\" \/>\n<meta property=\"og:description\" content=\"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nodemaven.com\/ru\/blog\/ecommerce-data-scraping\/\" \/>\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-09-07T12:59:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-07T13:02:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x-1024x577.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"577\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Anna\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anna\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \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\\\/ecommerce-data-scraping\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/\"},\"author\":{\"name\":\"Anna\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/f3bc93327b3582e735259d2a98f7a7ff\"},\"headline\":\"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial\",\"datePublished\":\"2026-09-07T12:59:19+00:00\",\"dateModified\":\"2026-09-07T13:02:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/\"},\"wordCount\":2259,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png\",\"keywords\":[\"Guides &amp; Tutorials\",\"Scraping Browser\",\"Web Scraping\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/\",\"name\":\"E-Commerce Data Scraping: Methods, Tools, and Python Tutorial\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png\",\"datePublished\":\"2026-09-07T12:59:19+00:00\",\"dateModified\":\"2026-09-07T13:02:31+00:00\",\"description\":\"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png\",\"width\":3552,\"height\":2000},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nodemaven.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial\"}]},{\"@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\\\/ecommerce-data-scraping\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/people\\\/NodeMaven\\\/100095402507825\\\/\",\"https:\\\/\\\/t.me\\\/NodeMavenTG\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nodemaven\\\/\"],\"telephone\":[],\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"23:59\"}],\"legalName\":\"NodeMaven FZ LLC\",\"email\":\"support@nodemaven.com\",\"description\":\"NodeMaven is a proxy infrastructure provider offering residential, mobile, and ISP proxies with IP quality filtering, precise geo-targeting, HTTPS and SOCKS5 support, and developer APIs.\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@nodemaven.com\"},{\"@type\":\"ContactPoint\",\"contactType\":\"legal\",\"email\":\"legal.public@nodemaven.com\"}],\"award\":[\"People Love Us, awarded by Trustpilot (2025)\",\"Top Rated, awarded by Top Business Software (2025)\",\"Customers Love Us, awarded by Sourceforge (2025)\",\"Users Love Us, awarded by G2 (2025)\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/f3bc93327b3582e735259d2a98f7a7ff\",\"name\":\"Anna\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/anna-radziuk_avatar-96x96.jpg\",\"caption\":\"Anna\"},\"description\":\"Anna is a content manager at NodeMaven, and she specialises in turning complex technical topics into clear, practical guides backed by industry research, hands-on testing, and popular use cases.\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/author\\\/anna-radziuk\\\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/ecommerce-data-scraping\\\/#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":"E-Commerce Data Scraping: Methods, Tools, and Python Tutorial","description":"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.","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\/ecommerce-data-scraping\/","og_locale":"ru_RU","og_type":"article","og_title":"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial","og_description":"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.","og_url":"https:\/\/nodemaven.com\/ru\/blog\/ecommerce-data-scraping\/","og_site_name":"NodeMaven","article_publisher":"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","article_published_time":"2026-09-07T12:59:19+00:00","article_modified_time":"2026-09-07T13:02:31+00:00","og_image":[{"width":1024,"height":577,"url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x-1024x577.png","type":"image\/png"}],"author":"Anna","twitter_card":"summary_large_image","twitter_misc":{"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c":"Anna","\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f":"11 \u043c\u0438\u043d\u0443\u0442"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#article","isPartOf":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/"},"author":{"name":"Anna","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/f3bc93327b3582e735259d2a98f7a7ff"},"headline":"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial","datePublished":"2026-09-07T12:59:19+00:00","dateModified":"2026-09-07T13:02:31+00:00","mainEntityOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/"},"wordCount":2259,"commentCount":0,"publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png","keywords":["Guides &amp; Tutorials","Scraping Browser","Web Scraping"],"articleSection":["Uncategorized"],"inLanguage":"ru-RU","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/nodemaven.com\/ru\/#organization"}},{"@type":"WebPage","@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/","url":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/","name":"E-Commerce Data Scraping: Methods, Tools, and Python Tutorial","isPartOf":{"@id":"https:\/\/nodemaven.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#primaryimage"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png","datePublished":"2026-09-07T12:59:19+00:00","dateModified":"2026-09-07T13:02:31+00:00","description":"Learn how to scrape e-commerce product data with APIs, public JSON, HTML, or a scraping browser. Includes a practical Python tutorial.","breadcrumb":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/"]}]},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#primaryimage","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/09\/blog-cover-ecommerce-data-scraping-v3_1776x1000_2x.png","width":3552,"height":2000},{"@type":"BreadcrumbList","@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nodemaven.com\/"},{"@type":"ListItem","position":2,"name":"E-Commerce Data Scraping: Full Guide to Methods, Tools, and a Python Tutorial"}]},{"@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\/ecommerce-data-scraping\/#local-main-organization-logo"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","https:\/\/t.me\/NodeMavenTG","https:\/\/www.linkedin.com\/company\/nodemaven\/"],"telephone":[],"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"opens":"00:00","closes":"23:59"}],"legalName":"NodeMaven FZ LLC","email":"support@nodemaven.com","description":"NodeMaven \u2014 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043f\u0440\u043e\u043a\u0441\u0438-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u043d\u044b\u0435, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 ISP-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 IP, \u0442\u043e\u0447\u043d\u044b\u043c \u0433\u0435\u043e-\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 HTTPS \u0438 SOCKS5, \u0430 \u0442\u0430\u043a\u0436\u0435 API \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.","contactPoint":[{"@type":"ContactPoint","contactType":"customer support","email":"support@nodemaven.com"},{"@type":"ContactPoint","contactType":"legal","email":"legal.public@nodemaven.com"}],"award":["People Love Us, awarded by Trustpilot (2025)","Top Rated, awarded by Top Business Software (2025)","Customers Love Us, awarded by Sourceforge (2025)","Users Love Us, awarded by G2 (2025)"]},{"@type":"Person","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/f3bc93327b3582e735259d2a98f7a7ff","name":"\u0410\u043d\u043d\u0430","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/05\/anna-radziuk_avatar-96x96.jpg","caption":"Anna"},"description":"\u0410\u043d\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u0432 NodeMaven \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u043c\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0438\u0445 \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0442\u0440\u0430\u0441\u043b\u0435\u0432\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f","url":"https:\/\/nodemaven.com\/ru\/author\/anna-radziuk\/"},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/ecommerce-data-scraping\/#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\/40607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/users\/68"}],"replies":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/comments?post=40607"}],"version-history":[{"count":4,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/40607\/revisions"}],"predecessor-version":[{"id":40617,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/40607\/revisions\/40617"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media\/40612"}],"wp:attachment":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media?parent=40607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/categories?post=40607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/tags?post=40607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}