{
  "version": "1.0.0",
  "exported_at": "2026-06-03T04:25:00.000Z",
  "project": {
    "name": "Golocal Reviews Scraper",
    "description": "Best-effort Golocal.de review scraper equivalent to the Octoparse Golocal Reviews Scraper. It extracts title, overall rating, review count, reviewer name, review date, reviewer rating, review text, and detail URL from supplied Golocal detail page URLs. Navigation strategy: warms up golocal.de, loops through detail URLs with navigate.urls[], retries/refreshes twice when Golocal returns 503 Service Unavailable, optionally opens a Bewertungen/Reviews tab, scrolls for lazy-loaded reviews, follows detected Next/Weiter review pagination, and appends all rows to golocal-bewertungen-scraper.csv. Limitation: autonomous tests showed persistent 503 responses from Golocal, so blocked URLs are skipped after retries; extraction requires Golocal to serve real detail pages.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser viewport size",
      "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.golocal.de/",
        "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": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1464,
      "position_y": 220,
      "config": {
        "duration": 5,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "navigate-2",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 1800,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.golocal.de/berlin/automobile/rolls-royce-studio-bmw-haus-am-kurfuerstendamm-YUQMN/",
          "https://www.golocal.de/berlin/automobile/tesla-YVftz/",
          "https://www.golocal.de/hamburg/lebensmittel/frischemarkt-hafentor-11Cjv7/",
          "https://www.golocal.de/duesseldorf/babyausstattungen/sabas-YUYR8/"
        ],
        "color": "bg-[#4589ff]"
      }
    },
    {
      "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": 220,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 2472,
      "position_y": 220,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "text-contains-1",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 2808,
      "position_y": 220,
      "config": {
        "selector": "body",
        "text": "503 Service Unavailable",
        "caseSensitive": false,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3144,
      "position_y": 520,
      "config": {
        "duration": 15,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "refresh-1",
      "block_type": "process",
      "title": "Refresh",
      "description": "Reload current page",
      "position_x": 3480,
      "position_y": 520,
      "config": {
        "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": 3816,
      "position_y": 520,
      "config": {
        "timeout": 30,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-element-3",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 4152,
      "position_y": 520,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "text-contains-2",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 4488,
      "position_y": 520,
      "config": {
        "selector": "body",
        "text": "503 Service Unavailable",
        "caseSensitive": false,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "sleep-3",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 4824,
      "position_y": 520,
      "config": {
        "duration": 25,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "refresh-2",
      "block_type": "process",
      "title": "Refresh",
      "description": "Reload current page",
      "position_x": 5160,
      "position_y": 520,
      "config": {
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-page-load-4",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 5496,
      "position_y": 520,
      "config": {
        "timeout": 30,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-element-4",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 5832,
      "position_y": 520,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "text-contains-3",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 6168,
      "position_y": 520,
      "config": {
        "selector": "body",
        "text": "503 Service Unavailable",
        "caseSensitive": false,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 6168,
      "position_y": 520,
      "config": {
        "selector": "//a[contains(translate(@href,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@href,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review') or contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review')] | //button[contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review')]",
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "click-1",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 3312,
      "position_y": 800,
      "config": {
        "selector": "//a[contains(translate(@href,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@href,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review') or contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review')] | //button[contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@aria-controls,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(translate(@data-target,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'review')]",
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-4",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3648,
      "position_y": 800,
      "config": {
        "duration": 2,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "scroll-1",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page or element",
      "position_x": 3984,
      "position_y": 800,
      "config": {
        "direction": "down",
        "amount": 900,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-5",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 4320,
      "position_y": 800,
      "config": {
        "duration": 2,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "element-exists-2",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 4656,
      "position_y": 800,
      "config": {
        "selector": "[itemprop=\"review\"], [itemtype*=\"Review\"], [itemtype*=\"schema.org/Review\"], article[class*=\"review\" i], li[class*=\"review\" i], div[class*=\"review-item\" i], div[class*=\"review\" i], article[class*=\"bewertung\" i], li[class*=\"bewertung\" i], div[class*=\"bewertung\" i], .rating-comment, .comment, [class*=\"rating-comment\" i], [class*=\"reviewList\" i] > *, [class*=\"bewertung\" i] > article, [class*=\"bewertung\" i] > li",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 4992,
      "position_y": 800,
      "config": {
        "rowSelector": "[itemprop=\"review\"], [itemtype*=\"Review\"], [itemtype*=\"schema.org/Review\"], article[class*=\"review\" i], li[class*=\"review\" i], div[class*=\"review-item\" i], div[class*=\"review\" i], article[class*=\"bewertung\" i], li[class*=\"bewertung\" i], div[class*=\"bewertung\" i], .rating-comment, .comment, [class*=\"rating-comment\" i], [class*=\"reviewList\" i] > *, [class*=\"bewertung\" i] > article, [class*=\"bewertung\" i] > li",
        "fileName": "golocal-bewertungen-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "titel",
            "selector": "(() => { const el = document.querySelector('[itemprop=\"name\"], h1, .fn, .business-title, [class*=\"business\" i] h1, [class*=\"title\" i]'); return (el?.getAttribute('content') || el?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "kundenbewertung",
            "selector": "(() => { const root = document.querySelector('[itemprop=\"aggregateRating\"], [itemtype*=\"AggregateRating\"]') || document; const el = root.querySelector('[itemprop=\"ratingValue\"], meta[itemprop=\"ratingValue\"], .ratingValue, [class*=\"rating\" i], [class*=\"bewertung\" i], [aria-label*=\"Stern\" i], [aria-label*=\"star\" i]'); const txt = (el?.getAttribute('content') || el?.getAttribute('aria-label') || el?.textContent || '').trim(); const m = txt.match(/\\d+(?:[\\.,]\\d+)?/); return m ? m[0].replace(',', '.') : txt; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "anzahl_der_rezensionen",
            "selector": "(() => { const root = document.querySelector('[itemprop=\"aggregateRating\"], [itemtype*=\"AggregateRating\"]') || document; const el = root.querySelector('[itemprop=\"reviewCount\"], meta[itemprop=\"reviewCount\"], [class*=\"review-count\" i], [class*=\"reviews-count\" i], [class*=\"bewertung-count\" i], [class*=\"bewertungen\" i]'); const txt = (el?.getAttribute('content') || el?.textContent || '').trim(); const m = txt.match(/\\d+/); return m ? m[0] : txt; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "person_name",
            "selector": "(() => { const el = ROW.querySelector('[itemprop=\"author\"] [itemprop=\"name\"], [itemprop=\"author\"], [class*=\"author\" i], [class*=\"user\" i], [class*=\"person\" i], [class*=\"name\" i], strong'); return (el?.getAttribute('content') || el?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "datum",
            "selector": "(() => { const el = ROW.querySelector('time, [itemprop=\"datePublished\"], meta[itemprop=\"datePublished\"], [class*=\"date\" i], [class*=\"datum\" i]'); return (el?.getAttribute('datetime') || el?.getAttribute('content') || el?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "person_kundenbewertung",
            "selector": "(() => { const root = ROW.querySelector('[itemprop=\"reviewRating\"], [itemtype*=\"Rating\"]') || ROW; const el = root.querySelector('[itemprop=\"ratingValue\"], meta[itemprop=\"ratingValue\"], [class*=\"rating\" i], [class*=\"stars\" i], [aria-label*=\"Stern\" i], [aria-label*=\"star\" i]'); const txt = (el?.getAttribute('content') || el?.getAttribute('aria-label') || el?.textContent || '').trim(); const m = txt.match(/\\d+(?:[\\.,]\\d+)?/); return m ? m[0].replace(',', '.') : txt; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "text",
            "selector": "(() => { const el = ROW.querySelector('[itemprop=\"reviewBody\"], [class*=\"review-text\" i], [class*=\"review-content\" i], [class*=\"bewertung-text\" i], [class*=\"content\" i], [class*=\"text\" i], p'); return (el?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "detail_page_url",
            "selector": "location.href",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "element-exists-3",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 5328,
      "position_y": 800,
      "config": {
        "selector": "//a[(contains(translate(@rel,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'next') or contains(translate(@class,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'next') or contains(translate(@aria-label,'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ','abcdefghijklmnopqrstuvwxyzäöü'),'weiter') or contains(translate(@title,'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ','abcdefghijklmnopqrstuvwxyzäöü'),'weiter') or contains(translate(normalize-space(.),'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ','abcdefghijklmnopqrstuvwxyzäöü'),'weiter')) and not(contains(translate(@class,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'disabled'))]",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "click-2",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 5664,
      "position_y": 800,
      "config": {
        "selector": "//a[(contains(translate(@rel,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'next') or contains(translate(@class,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'next') or contains(translate(@aria-label,'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ','abcdefghijklmnopqrstuvwxyzäöü'),'weiter') or contains(translate(@title,'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ','abcdefghijklmnopqrstuvwxyzäöü'),'weiter') or contains(translate(normalize-space(.),'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ','abcdefghijklmnopqrstuvwxyzäöü'),'weiter')) and not(contains(translate(@class,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'disabled'))]",
        "timeout": 10,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-page-load-5",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 6000,
      "position_y": 800,
      "config": {
        "timeout": 30,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-element-5",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 6336,
      "position_y": 800,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "sleep-6",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 6672,
      "position_y": 800,
      "config": {
        "duration": 2,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 6504,
      "position_y": 520,
      "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": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "navigate-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "navigate-2",
      "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": "wait-for-element-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-2",
      "from_connector_id": "right",
      "to_block_id": "text-contains-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "true",
      "to_block_id": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "false",
      "to_block_id": "element-exists-1",
      "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-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-3",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-3",
      "from_connector_id": "right",
      "to_block_id": "text-contains-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-2",
      "from_connector_id": "true",
      "to_block_id": "sleep-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-2",
      "from_connector_id": "false",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-3",
      "from_connector_id": "right",
      "to_block_id": "refresh-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "refresh-2",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-4",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-4",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-4",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-4",
      "from_connector_id": "right",
      "to_block_id": "text-contains-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-3",
      "from_connector_id": "true",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-3",
      "from_connector_id": "false",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "click-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "scroll-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-1",
      "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": "scroll-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-1",
      "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-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "true",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "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-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": "loop-continue-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-2",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-5",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-5",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-5",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-5",
      "from_connector_id": "right",
      "to_block_id": "sleep-6",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-6",
      "from_connector_id": "right",
      "to_block_id": "scroll-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": 6536,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1",
          "navigate-2",
          "wait-for-page-load-2",
          "wait-for-element-2",
          "sleep-2",
          "refresh-1",
          "wait-for-page-load-3",
          "wait-for-element-3",
          "sleep-3",
          "refresh-2",
          "wait-for-page-load-4",
          "wait-for-element-4",
          "sleep-4",
          "sleep-5",
          "wait-for-page-load-5",
          "wait-for-element-5",
          "sleep-6"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2736,
      "position_y": 116,
      "width": 4016,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "text-contains-1",
          "text-contains-2",
          "text-contains-3",
          "element-exists-1",
          "click-1",
          "element-exists-2",
          "element-exists-3",
          "click-2",
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 3912,
      "position_y": 696,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "scroll-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 4920,
      "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 Golocal.de review scraper equivalent to the Octoparse Golocal Reviews Scraper. It extracts title, overall rating, review count, reviewer name, review date, reviewer rating, review text, and detail URL from supplied Golocal detail page URLs. Navigation strategy: warms up golocal.de, loops through detail URLs with navigate.urls[], retries/refreshes twice when Golocal returns 503 Service Unavailable, optionally opens a Bewertungen/Reviews tab, scrolls for lazy-loaded reviews, follows detected Next/Weiter review pagination, and appends all rows to golocal-bewertungen-scraper.csv. Limitation: autonomous tests showed persistent 503 responses from Golocal, so blocked URLs are skipped after retries; extraction requires Golocal to serve real detail pages.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-text-contains-1",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `body`. 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": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-1"
      }
    },
    {
      "id": "note-block-text-contains-3",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `body`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 6368,
      "position_y": 500,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-3"
      }
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `//a[contains(translate(@href,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'bewertung') or contains(transla`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 6368,
      "position_y": 500,
      "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 `[itemprop=\"review\"], [itemtype*=\"Review\"], [itemtype*=\"schema.org/Review\"], article[class*=\"review\" i], li[class*=\"revie`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 4856,
      "position_y": 780,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-2"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (titel, kundenbewertung, anzahl_der_rezensionen, person_name, datum). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 5192,
      "position_y": 780,
      "width": 340,
      "height": 136,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-element-exists-3",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `//a[(contains(translate(@rel,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'next') or contains(translate(@c`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 5528,
      "position_y": 780,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-3"
      }
    },
    {
      "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": 6704,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}