{
  "version": "1.0.0",
  "exported_at": "2026-06-01T00:45:00.000Z",
  "project": {
    "name": "Amazon Reviews Scraper",
    "description": "Best-effort Amazon US customer reviews scraper equivalent to the Octoparse Amazon Reviews Scraper. Starts from the accessible Amazon product detail page for ASIN B0BY27XSJ3, scrolls to customer reviews, checks for review rows before running any expansion clicks, expands/reveals text only inside detected review cards, extracts visible reviews, then optionally opens the explicit 'See all reviews' link and paginates only on real review-list Next links containing pageNumber. Extracts page URL, product URL, ASIN, brand, product name, product rating summary, review rating, reviewer name, title, content, review URL, images, verified badge, helpful count, date, and country. Limitation: Amazon may redirect review-list pages to Sign-In/CAPTCHA or intermittently suppress review widgets; when blocked, the template extracts accessible product-page review rows when present and exits safely.",
    "color": "bg-[#ff9900]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser window dimensions",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "url": "https://www.amazon.com/Belkin-Connect-Multiport-Transfer-Chromebook/dp/B0BY27XSJ3?th=1",
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "selector": "#productTitle, body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Run custom JavaScript",
      "position_x": 1464,
      "position_y": 220,
      "config": {
        "jsCode": "(() => { const targets = ['#customerReviews', '#reviewsMedley', '#cm-cr-dp-review-list', '[data-hook=\"reviews-medley-footer\"]']; const el = targets.map(s => document.querySelector(s)).find(Boolean); if (el) { el.scrollIntoView({ behavior: 'instant', block: 'center' }); } else { window.scrollTo(0, Math.floor(document.body.scrollHeight * 0.75)); } window.dispatchEvent(new Event('scroll')); document.dispatchEvent(new Event('scroll')); return true; })();",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1800,
      "position_y": 220,
      "config": {
        "duration": 4,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-2",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Run custom JavaScript",
      "position_x": 2136,
      "position_y": 220,
      "config": {
        "jsCode": "(() => { const el = document.querySelector('#cm-cr-dp-review-list, #customerReviews, #reviewsMedley'); if (el) { el.scrollIntoView({ behavior: 'instant', block: 'start' }); } else { window.scrollTo(0, document.body.scrollHeight); } window.dispatchEvent(new Event('scroll')); document.dispatchEvent(new Event('scroll')); return true; })();",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 2472,
      "position_y": 220,
      "config": {
        "duration": 3,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 2808,
      "position_y": 220,
      "config": {
        "selector": "[data-hook=\"review\"], div[id^=\"customer_review-\"], div[id*=\"customer_review\"], .a-section.review",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "inject-javascript-3",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Run custom JavaScript",
      "position_x": 3144,
      "position_y": 520,
      "config": {
        "jsCode": "(() => { const rows = Array.from(document.querySelectorAll('[data-hook=\"review\"], div[id^=\"customer_review-\"], div[id*=\"customer_review\"], .a-section.review')); rows.forEach(row => { Array.from(row.querySelectorAll('button, a, span')).filter(el => /read more|see more|show more/i.test((el.textContent || '').trim())).slice(0, 5).forEach(el => { try { el.click(); } catch (e) {} }); row.querySelectorAll('[data-hook=\"review-collapsed\"], [data-hook=\"review-expanded\"], [data-hook=\"review-body\"], .review-text-content, .review-text, .cr-original-review-content, .a-expander-content').forEach(el => { el.style.maxHeight = 'none'; el.style.height = 'auto'; el.style.overflow = 'visible'; el.style.display = 'block'; el.style.webkitLineClamp = 'unset'; el.removeAttribute('aria-hidden'); }); }); return rows.length; })();",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-3",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3480,
      "position_y": 520,
      "config": {
        "duration": 1,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 3816,
      "position_y": 520,
      "config": {
        "selector": "[data-hook=\"review\"], div[id^=\"customer_review-\"], div[id*=\"customer_review\"], .a-section.review",
        "timeout": 20,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 4152,
      "position_y": 520,
      "config": {
        "rowSelector": "[data-hook=\"review\"], div[id^=\"customer_review-\"], div[id*=\"customer_review\"], .a-section.review",
        "fileName": "amazon-reviews-scraper-for-amazon-us.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "Page_URL",
            "selector": "window.location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Product_URL",
            "selector": "(() => { const canonical = document.querySelector('link[rel=\"canonical\"]')?.href || ''; const productLink = document.querySelector('a[data-hook=\"product-link\"], #cm_cr-product_info a.a-link-normal, a[href*=\"/dp/B0BY27XSJ3\"]')?.href || ''; return productLink || canonical || 'https://www.amazon.com/dp/B0BY27XSJ3'; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "ASIN",
            "selector": "((window.location.href.match(/product-reviews\\/([A-Z0-9]{10})/) || window.location.href.match(/\\/dp\\/([A-Z0-9]{10})/) || ['','B0BY27XSJ3'])[1]) || 'B0BY27XSJ3'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Brand",
            "selector": "(() => { const byline = (document.querySelector('#bylineInfo')?.textContent || '').replace(/Visit the | Store/gi, '').trim(); if (byline) return byline; const name = (document.querySelector('a[data-hook=\"product-link\"], #cm_cr-product_info .a-link-normal, h1#title span#productTitle, #productTitle')?.textContent || '').trim(); return name.split(/\\s+/)[0] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Product_name",
            "selector": "(() => { return (document.querySelector('a[data-hook=\"product-link\"], #cm_cr-product_info .a-link-normal, h1#title span#productTitle, #productTitle')?.textContent || '').trim().replace(/\\s+/g, ' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Product_stars",
            "selector": "(() => { return (document.querySelector('[data-hook=\"rating-out-of-text\"], [data-hook=\"average-star-rating\"] .a-icon-alt, #acrPopover .a-icon-alt')?.textContent || '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Rating_count",
            "selector": "(() => { return (document.querySelector('[data-hook=\"total-review-count\"], #acrCustomerReviewText')?.textContent || '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Review_rating",
            "selector": "(() => { const t = (ROW.querySelector('i[data-hook=\"review-star-rating\"] span.a-icon-alt, i[data-hook=\"cmps-review-star-rating\"] span.a-icon-alt, [data-hook=\"review-star-rating\"] .a-icon-alt, [data-hook=\"cmps-review-star-rating\"] .a-icon-alt, .review-rating .a-icon-alt, .a-icon-star .a-icon-alt')?.textContent || '').trim(); const m = t.match(/[0-9.]+/); return m ? m[0] : t; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Reviewer_name",
            "selector": "(() => { return (ROW.querySelector('.a-profile-name, [data-hook=\"genome-widget\"] .a-profile-name')?.textContent || '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Review_title",
            "selector": "(() => { const selectors = ['[data-hook=\"review-title\"]', '.review-title', 'a.a-size-base.a-link-normal.review-title', 'a[href*=\"/gp/customer-reviews/\"]']; for (const s of selectors) { const el = ROW.querySelector(s); if (!el) continue; const spanTexts = Array.from(el.querySelectorAll('span')).map(x => (x.textContent || '').trim()).filter(Boolean).filter(x => !/out of 5 stars/i.test(x)); let t = (spanTexts.pop() || el.getAttribute('aria-label') || el.textContent || '').trim().replace(/\\s+/g, ' '); t = t.replace(/^[0-9.]+\\s*out of\\s*5\\s*stars\\s*/i, '').trim(); if (t && !/out of 5 stars/i.test(t)) return t; } const reviewer = (ROW.querySelector('.a-profile-name')?.textContent || '').trim(); const date = (ROW.querySelector('[data-hook=\"review-date\"], .review-date')?.textContent || '').trim(); const texts = Array.from(ROW.querySelectorAll('span, a, div')).map(el => (el.textContent || '').trim().replace(/\\s+/g, ' ')).filter(Boolean); const bad = /^(verified purchase|helpful|report|read more|see more|show more|customer reviews?|top reviews|\\(?[\\d,]+\\)?$|one person found|[\\d,]+ people found|reviewed in |[0-9.]+ out of 5 stars)/i; return (texts.find(t => t !== reviewer && t !== date && t.length >= 6 && t.length <= 180 && !bad.test(t) && !/out of 5 stars/i.test(t)) || ''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Review_content",
            "selector": "(() => { const directSelectors = ['[data-hook=\"review-body\"] span', '[data-hook=\"review-body\"]', '[data-hook=\"review-collapsed\"] span', '[data-hook=\"review-collapsed\"]', '[data-hook=\"review-expanded\"] span', '[data-hook=\"review-expanded\"]', '.review-text-content span', '.review-text-content', '.review-text', '.cr-original-review-content', '.a-expander-content.reviewText', '.a-expander-content']; for (const s of directSelectors) { const el = ROW.querySelector(s); const txt = (el?.textContent || '').trim().replace(/\\s+/g, ' '); if (txt && txt.length > 10 && !/^(read more|see more|show more)$/i.test(txt)) return txt; } const reviewer = (ROW.querySelector('.a-profile-name')?.textContent || '').trim(); const date = (ROW.querySelector('[data-hook=\"review-date\"], .review-date')?.textContent || '').trim(); const titleEl = ROW.querySelector('[data-hook=\"review-title\"], .review-title, a.a-size-base.a-link-normal.review-title'); let title = (titleEl?.textContent || '').trim().replace(/\\s+/g, ' ').replace(/^[0-9.]+\\s*out of\\s*5\\s*stars\\s*/i, '').trim(); const leafTexts = Array.from(ROW.querySelectorAll('span, div, p')).filter(el => !Array.from(el.children).some(ch => (ch.textContent || '').trim().length > 20)).map(el => (el.textContent || '').trim().replace(/\\s+/g, ' ')).filter(Boolean); const bad = /^(verified purchase|helpful|report|read more|see more|show more|customer reviews?|top reviews|\\(?[\\d,]+\\)?$|one person found|[\\d,]+ people found|reviewed in |[0-9.]+ out of 5 stars)/i; const candidates = leafTexts.filter(t => t !== reviewer && t !== date && t !== title && t.length > 15 && !bad.test(t) && !/out of 5 stars/i.test(t) && !/^reviewed in/i.test(t)); return (candidates.sort((a,b) => b.length - a.length)[0] || '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Review_URL",
            "selector": "(() => { return ROW.querySelector('a[data-hook=\"review-title\"], [data-hook=\"review-title\"] a, a.review-title, a[href*=\"/gp/customer-reviews/\"]')?.href || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Review_images",
            "selector": "(() => { return Array.from(ROW.querySelectorAll('[data-hook=\"review-image-tile\"] img, .review-image-tile img')).map(img => img.src || img.getAttribute('data-src') || '').filter(Boolean).join(' | '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Is_verified",
            "selector": "ROW.querySelector('[data-hook=\"avp-badge\"], .avp-badge') ? 'True' : 'False'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Helpful_count",
            "selector": "(() => { const t = (ROW.querySelector('[data-hook=\"helpful-vote-statement\"], .cr-vote-text')?.textContent || '').trim(); if (!t) return ''; if (/^One\\s+/i.test(t)) return '1'; const m = t.replace(/,/g, '').match(/\\d+/); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Date",
            "selector": "(() => { return (ROW.querySelector('[data-hook=\"review-date\"], .review-date')?.textContent || '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Country",
            "selector": "(() => { const t = (ROW.querySelector('[data-hook=\"review-date\"], .review-date')?.textContent || '').trim(); const m = t.match(/Reviewed in (.*?) on /i); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "element-exists-2",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 4488,
      "position_y": 520,
      "config": {
        "selector": "a[data-hook=\"see-all-reviews-link-foot\"][href*=\"/product-reviews/\"], a.a-link-emphasis[href*=\"/product-reviews/\"]",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "click-1",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 3312,
      "position_y": 800,
      "config": {
        "selector": "a[data-hook=\"see-all-reviews-link-foot\"][href*=\"/product-reviews/\"], a.a-link-emphasis[href*=\"/product-reviews/\"]",
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "wait-for-page-load-2",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 3648,
      "position_y": 800,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-4",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3984,
      "position_y": 800,
      "config": {
        "duration": 3,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "element-exists-3",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 4488,
      "position_y": 520,
      "config": {
        "selector": "#cm_cr-pagination_bar .a-pagination .a-last:not(.a-disabled) a[href*=\"pageNumber\"], ul.a-pagination li.a-last:not(.a-disabled) a[href*=\"pageNumber\"]",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "click-2",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 4824,
      "position_y": 520,
      "config": {
        "selector": "#cm_cr-pagination_bar .a-pagination .a-last:not(.a-disabled) a[href*=\"pageNumber\"], ul.a-pagination li.a-last:not(.a-disabled) a[href*=\"pageNumber\"]",
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "wait-for-page-load-3",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 5160,
      "position_y": 520,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-5",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 5496,
      "position_y": 520,
      "config": {
        "duration": 2,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "end-1",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 4320,
      "position_y": 800,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "connections": [
    {
      "from_block_id": "set-window-size-1",
      "from_connector_id": "right",
      "to_block_id": "navigate-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "navigate-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-2",
      "from_connector_id": "right",
      "to_block_id": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-2",
      "from_connector_id": "right",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "inject-javascript-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "element-exists-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-3",
      "from_connector_id": "right",
      "to_block_id": "sleep-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-3",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-2",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "element-exists-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-3",
      "from_connector_id": "true",
      "to_block_id": "click-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-3",
      "from_connector_id": "false",
      "to_block_id": "element-exists-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-2",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-3",
      "from_connector_id": "right",
      "to_block_id": "sleep-5",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-5",
      "from_connector_id": "right",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "true",
      "to_block_id": "click-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "false",
      "to_block_id": "end-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-2",
      "from_connector_id": "right",
      "to_block_id": "sleep-4",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-4",
      "from_connector_id": "right",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-entry",
      "element_type": "group",
      "title": "Entry & Setup",
      "color": "#4589ff",
      "position_x": 48,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "set-window-size-1"
        ]
      }
    },
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 384,
      "position_y": 116,
      "width": 5360,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1",
          "sleep-2",
          "sleep-3",
          "wait-for-element-2",
          "wait-for-page-load-2",
          "sleep-4",
          "wait-for-page-load-3",
          "sleep-5"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1392,
      "position_y": 116,
      "width": 2000,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1",
          "inject-javascript-2",
          "inject-javascript-3"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2736,
      "position_y": 116,
      "width": 2336,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1",
          "element-exists-2",
          "click-1",
          "element-exists-3",
          "click-2"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 4080,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-control",
      "element_type": "group",
      "title": "Control Flow",
      "color": "#8d8d8d",
      "position_x": 4248,
      "position_y": 696,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Amazon US customer reviews scraper equivalent to the Octoparse Amazon Reviews Scraper. Starts from the accessible Amazon product detail page for ASIN B0BY27XSJ3, scrolls to customer reviews, checks for review rows before running any expansion clicks, expands/reveals text only inside detected review cards, extracts visible reviews, then optionally opens the explicit 'See all reviews' link and paginates only on real review-list Next links containing pageNumber. Extracts page URL, product URL, ASIN, brand, product name, product rating summary, review rating, reviewer name, title, content, review URL, images, verified badge, helpful count, date, and country. Limitation: Amazon may redirect review-list pages to Sign-In/CAPTCHA or intermittently suppress review widgets; when blocked, the template extracts accessible product-page review rows when present and exits safely.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `[data-hook=\"review\"], div[id^=\"customer_review-\"], div[id*=\"customer_review\"], .a-section.review`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 3008,
      "position_y": 200,
      "width": 340,
      "height": 162,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-inject-javascript-3",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(() => { const rows = Array.from(document.querySelectorAll('[data-hook=\"review\"], div[id^=\"customer_...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 3344,
      "position_y": 500,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-3"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (Page_URL, Product_URL, ASIN, Brand, Product_name). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 4352,
      "position_y": 500,
      "width": 340,
      "height": 130,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-element-exists-2",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `a[data-hook=\"see-all-reviews-link-foot\"][href*=\"/product-reviews/\"], a.a-link-emphasis[href*=\"/product-reviews/\"]`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 4688,
      "position_y": 500,
      "width": 340,
      "height": 168,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-2"
      }
    },
    {
      "id": "note-block-element-exists-3",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `#cm_cr-pagination_bar .a-pagination .a-last:not(.a-disabled) a[href*=\"pageNumber\"], ul.a-pagination li.a-last:not(.a-dis`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 4688,
      "position_y": 500,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-3"
      }
    }
  ]
}