{
  "version": "1.0.0",
  "exported_at": "2026-06-01T01:45:00.000Z",
  "project": {
    "name": "Amazon Review Details Scraper for Japan",
    "description": "Best-effort Amazon.co.jp review scraper equivalent to Octoparse's Amazon Review Details Scraper for Japan. It extracts page URL, ASIN, product title, review ID, posting date, star rating, reviewer name, review title, review body, and helpful-vote text from Amazon Japan product review pages. Pagination is handled by clicking Amazon's enabled Next review-page link until no more pages exist, then continuing to the next configured ASIN URL in navigate.urls. The attached analysis and autonomous tests show Amazon.co.jp redirects these review URLs to sign-in/CAPTCHA in the current browser. Run from a logged-in Amazon.co.jp browser profile or manually solve sign-in/CAPTCHA during the pause; if still blocked, the ASIN is skipped safely instead of timing out.",
    "color": "bg-[#ff9900]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.amazon.co.jp/product-reviews/B09RQX74DW?reviewerType=all_reviews&pageNumber=1&sortBy=recent",
          "https://www.amazon.co.jp/product-reviews/B08R82RJJM?reviewerType=all_reviews&pageNumber=1&sortBy=recent"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "amazon",
          "reviews",
          "japan",
          "asin",
          "requires-login"
        ]
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 792,
      "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": 1128,
      "position_y": 220,
      "config": {
        "selector": "#ap_login_form, form[name=\"signIn\"], input[name=\"email\"], #ap_email, form[action*=\"validateCaptcha\"], input[name=\"cvf_captcha_input\"], input[name=\"field-keywords\"][disabled]",
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1464,
      "position_y": 520,
      "config": {
        "duration": 45,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "refresh-1",
      "block_type": "process",
      "title": "Refresh",
      "description": "Reload current page",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-page-load-2",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 2136,
      "position_y": 520,
      "config": {
        "timeout": 60,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "element-exists-2",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 2472,
      "position_y": 520,
      "config": {
        "selector": "#ap_login_form, form[name=\"signIn\"], input[name=\"email\"], #ap_email, form[action*=\"validateCaptcha\"], input[name=\"cvf_captcha_input\"], input[name=\"field-keywords\"][disabled]",
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "element-exists-3",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 2472,
      "position_y": 520,
      "config": {
        "selector": "[data-hook=\"review\"], #cm_cr-review_list [id^=\"customer_review-\"]",
        "color": "bg-[#42be65]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1632,
      "position_y": 800,
      "config": {
        "rowSelector": "[data-hook=\"review\"], #cm_cr-review_list [id^=\"customer_review-\"]",
        "fileName": "amazon-jp-review-details-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "ページUrl",
            "selector": "window.location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "ASIN",
            "selector": "(() => { const m = window.location.pathname.match(/product-reviews\\/([A-Z0-9]{10})/); if (m) return m[1]; const q = new URLSearchParams(window.location.search); return q.get('asin') || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "商品タイトル",
            "selector": "(() => { const el = document.querySelector('a[data-hook=\"product-link\"], [data-hook=\"cr-product-link\"], .product-title, #cm_cr-product_info .a-link-normal, #cm_cr-product_info a.a-link-normal'); return el ? (el.textContent || '').trim().replace(/\\s+/g, ' ') : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Id",
            "selector": "ROW.getAttribute('id') || ROW.getAttribute('data-review-id') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "投稿日",
            "selector": "[data-hook=\"review-date\"]",
            "attribute": "text"
          },
          {
            "name": "星",
            "selector": "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",
            "attribute": "text"
          },
          {
            "name": "名前",
            "selector": ".a-profile-name",
            "attribute": "text"
          },
          {
            "name": "レビュー_タイトル",
            "selector": "(() => { const el = ROW.querySelector('[data-hook=\"review-title\"]'); if (!el) return ''; const clone = el.cloneNode(true); clone.querySelectorAll('i, .a-icon-alt').forEach(n => n.remove()); return (clone.textContent || '').trim().replace(/\\s+/g, ' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "レビュー",
            "selector": "[data-hook=\"review-body\"] span, [data-hook=\"review-body\"]",
            "attribute": "text"
          },
          {
            "name": "役に立った",
            "selector": "[data-hook=\"helpful-vote-statement\"]",
            "attribute": "text"
          }
        ]
      }
    },
    {
      "block_id": "element-exists-4",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 1968,
      "position_y": 800,
      "config": {
        "selector": "li.a-last:not(.a-disabled) a, ul.a-pagination li.a-last:not(.a-disabled) a",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "click-1",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 2304,
      "position_y": 800,
      "config": {
        "selector": "li.a-last:not(.a-disabled) a, ul.a-pagination li.a-last:not(.a-disabled) a",
        "timeout": 10,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-page-load-3",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 2640,
      "position_y": 800,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-3",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 2976,
      "position_y": 800,
      "config": {
        "duration": 3,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2808,
      "position_y": 520,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "connections": [
    {
      "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": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "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": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "element-exists-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-2",
      "from_connector_id": "right",
      "to_block_id": "refresh-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "refresh-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": "element-exists-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "true",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "false",
      "to_block_id": "element-exists-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-3",
      "from_connector_id": "true",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-3",
      "from_connector_id": "false",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "element-exists-4",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-4",
      "from_connector_id": "true",
      "to_block_id": "click-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-4",
      "from_connector_id": "false",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-1",
      "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-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-3",
      "from_connector_id": "right",
      "to_block_id": "element-exists-3",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 116,
      "width": 3176,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "sleep-2",
          "refresh-1",
          "wait-for-page-load-2",
          "wait-for-page-load-3",
          "sleep-3"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 1056,
      "position_y": 116,
      "width": 2000,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1",
          "element-exists-2",
          "element-exists-3",
          "element-exists-4",
          "click-1",
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1560,
      "position_y": 696,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Amazon.co.jp review scraper equivalent to Octoparse's Amazon Review Details Scraper for Japan. It extracts page URL, ASIN, product title, review ID, posting date, star rating, reviewer name, review title, review body, and helpful-vote text from Amazon Japan product review pages. Pagination is handled by clicking Amazon's enabled Next review-page link until no more pages exist, then continuing to the next configured ASIN URL in navigate.urls. The attached analysis and autonomous tests show Amazon.co.jp redirects these review URLs to sign-in/CAPTCHA in the current browser. Run from a logged-in Amazon.co.jp browser profile or manually solve sign-in/CAPTCHA during the pause; if still blocked, the ASIN is skipped safely instead of timing out.",
      "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 `#ap_login_form, form[name=\"signIn\"], input[name=\"email\"], #ap_email, form[action*=\"validateCaptcha\"], input[name=\"cvf_ca`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 1328,
      "position_y": 200,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-element-exists-2",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `#ap_login_form, form[name=\"signIn\"], input[name=\"email\"], #ap_email, form[action*=\"validateCaptcha\"], input[name=\"cvf_ca`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2672,
      "position_y": 500,
      "width": 340,
      "height": 170,
      "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 `[data-hook=\"review\"], #cm_cr-review_list [id^=\"customer_review-\"]`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2672,
      "position_y": 500,
      "width": 340,
      "height": 152,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-3"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (ページUrl, ASIN, 商品タイトル, Id, レビュー_タイトル). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1832,
      "position_y": 780,
      "width": 340,
      "height": 125,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-element-exists-4",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `li.a-last:not(.a-disabled) a, ul.a-pagination li.a-last:not(.a-disabled) a`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2168,
      "position_y": 780,
      "width": 340,
      "height": 155,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-4"
      }
    },
    {
      "id": "note-block-loop-continue-1",
      "element_type": "note",
      "title": "Note: Loop Continue",
      "content": "Loop Continue advances a multi-URL or multi-text loop. Place at the end of the loop body with a clear back-edge to the loop start.",
      "color": "#ee5396",
      "position_x": 3008,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}