{
  "version": "1.0.0",
  "exported_at": "2026-06-02T17:15:00.000Z",
  "project": {
    "name": "Golocal Leads Scraper",
    "description": "Scrapes lead data from Golocal.de business detail pages: title, category, rating, review count, address, phone, email, website, and detail URL. Navigation strategy: multi-URL loop over configured Golocal detail URLs using navigate.urls plus loop-continue; all configured URLs are scraped and appended into one CSV. To scrape more leads, add additional Golocal detail page URLs to the Navigate block's urls array. UScraper does not support dynamic variable chaining from search-result listing pages into detail-page navigation, so this best-effort equivalent uses pre-enumerated detail URLs from the Octoparse sample.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 300,
      "config": {
        "urls": [
          "https://www.golocal.de/hamburg/lebensmittel/edeka-airport-plaza-tamme-YUFlR/",
          "https://www.golocal.de/hamburg/lebensmittel/frischemarkt-hafentor-11Cjv7/",
          "https://www.golocal.de/hamburg/lebensmittel/wochenmarkt-blankeneser-bahnhofstrasse-hh-blankenese-YUSiG/",
          "https://www.golocal.de/aachen/apotheken/apotheke-am-luisenhospital-10Wkhy/",
          "https://www.golocal.de/hamburg/lebensmittel/kaufland-hamburg-bramfeld-8W7hv/",
          "https://www.golocal.de/hamburg/lebensmittel/kaufland-hamburg-wandsbek-8b09q/",
          "https://www.golocal.de/hamburg/lebensmittel/lidl-YUFvM/",
          "https://www.golocal.de/duesseldorf/kindermoden/laurentia-nachhaltige-mode-fuer-babys-kinder-YVmZB/"
        ],
        "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": 480,
      "position_y": 300,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 840,
      "position_y": 300,
      "config": {
        "selector": ".detail-block .loc-head__title, .detail-block h1",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1200,
      "position_y": 300,
      "config": {
        "rowSelector": "body",
        "fileName": "golocal-leads-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "titel",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return (root.querySelector('.loc-head h1.loc-head__title a, .loc-head h1.loc-head__title, h1.loc-head__title, h1')?.textContent || document.querySelector('meta[property=\"og:title\"]')?.content || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "kategorie",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return Array.from(root.querySelectorAll('.loc-head .categories__item span, .loc-head .categories__item')).map(e => e.textContent.trim()).filter(Boolean).filter((v, i, a) => a.indexOf(v) === i).join(', '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "kundenbewertung",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return (root.querySelector('.loc-head [itemprop=\"ratingValue\"]')?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "anzahl_der_rezensionen",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return (root.querySelector('.loc-head [itemprop=\"reviewCount\"], #detailRating_amountInfo [itemprop=\"reviewCount\"]')?.textContent || '').replace(/\\D+/g, '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "adresse_strasse",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return (root.querySelector('.loc-head [itemprop=\"streetAddress\"], [itemprop=\"address\"] [itemprop=\"streetAddress\"]')?.textContent || '').replace(/,\\s*$/, '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "postleitzahl",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return (root.querySelector('.loc-head [itemprop=\"postalCode\"], [itemprop=\"address\"] [itemprop=\"postalCode\"]')?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "addresse_ort",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; return (root.querySelector('.loc-head [itemprop=\"addressLocality\"], [itemprop=\"address\"] [itemprop=\"addressLocality\"]')?.textContent || '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "telefonnummer",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; const tel = root.querySelector('.loc-head a[itemprop=\"telephone\"], .loc-head a[href^=\"tel:\"], a[itemprop=\"telephone\"]'); if (!tel) return ''; const preferred = tel.querySelector('.word.show-for-medium')?.textContent || tel.querySelector('.word')?.textContent || tel.textContent || tel.getAttribute('href') || ''; return preferred.replace(/^tel:/, '').replace(/\\bAnrufen\\b/g, '').replace(/\\s+/g, ' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "email",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; const href = root.querySelector('.loc-head a[itemprop=\"email\"], .loc-head a[href^=\"mailto:\"], a[itemprop=\"email\"]')?.getAttribute('href') || ''; return href.replace(/^mailto:/, '').split('?')[0].trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "website",
            "selector": "(function(){ const root = ROW.querySelector('.detail-block') || ROW; const link = root.querySelector('.loc-head a[itemprop=\"url\"], .loc-head a[title^=\"Die Website\"]'); return link ? link.href.trim() : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "detail_url",
            "selector": "location.href",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 300,
      "config": {
        "duration": 1
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 1920,
      "position_y": 300,
      "config": {}
    }
  ],
  "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": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "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": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 196,
      "width": 1760,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1128,
      "position_y": 196,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 1848,
      "position_y": 196,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes lead data from Golocal.de business detail pages: title, category, rating, review count, address, phone, email, website, and detail URL. Navigation strategy: multi-URL loop over configured Golocal detail URLs using navigate.urls plus loop-continue; all configured URLs are scraped and appended into one CSV. To scrape more leads, add additional Golocal detail page URLs to the Navigate block's urls array. UScraper does not support dynamic variable chaining from search-result listing pages into detail-page navigation, so this best-effort equivalent uses pre-enumerated detail URLs from the Octoparse sample.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-navigate-1",
      "element_type": "note",
      "title": "Note: Navigate",
      "content": "Multi-URL loop over 8 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 320,
      "position_y": 280,
      "width": 328,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (titel, kategorie, kundenbewertung, anzahl_der_rezensionen, adresse_strasse). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1400,
      "position_y": 280,
      "width": 340,
      "height": 138,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "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": 2120,
      "position_y": 280,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}