{
  "version": "1.0.0",
  "exported_at": "2026-06-02T13:20:00.000Z",
  "project": {
    "name": "Falabella Retails Listing ScraperKeywords",
    "description": "Scrapes Falabella Colombia keyword listing results for the keyword \"Televisor\" and exports Keyword, Producto, Producto_url, Imagen_url, Marca, Precio, Precio_original, and Estrellas. Uses a tested click-next pagination loop to continue through all available listing pages and append results to one CSV. Product rows are anchored on Falabella product links; JavaScript columns clean sponsored labels, price/review-count text, and tracking query parameters. Best-effort template: Falabella may show CAPTCHA/anti-bot checks, cookie banners, or location popups.",
    "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": 240,
      "config": {
        "url": "https://www.falabella.com.co/falabella-co/search?Ntt=Televisor",
        "color": "bg-[#4589ff]",
        "tags": [
          "falabella",
          "keyword-search",
          "colombia"
        ]
      }
    },
    {
      "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": 240,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 840,
      "position_y": 240,
      "config": {
        "duration": 4,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1200,
      "position_y": 240,
      "config": {
        "jsCode": "(() => {\n  const textMatch = /aceptar|accept|entiendo|cerrar|close|continuar/i;\n  const candidates = Array.from(document.querySelectorAll('button, [role=\"button\"], a'));\n  for (const el of candidates) {\n    const txt = (el.innerText || el.textContent || el.getAttribute('aria-label') || '').trim();\n    if (txt && textMatch.test(txt)) {\n      try { el.click(); } catch (e) {}\n    }\n  }\n  window.scrollTo(0, 400);\n  setTimeout(() => window.scrollTo(0, 0), 300);\n  return true;\n})()",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 240,
      "config": {
        "duration": 3,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1920,
      "position_y": 240,
      "config": {
        "selector": "a[href*=\"/falabella-co/product/\"], a[href*=\"/product/\"][href*=\"falabella.com.co\"], a[id^=\"testId-pod\"], [id^=\"testId-pod\"] a[href*=\"/product/\"]",
        "timeout": 45,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2280,
      "position_y": 240,
      "config": {
        "rowSelector": "a[href*=\"/falabella-co/product/\"], a[href*=\"/product/\"][href*=\"falabella.com.co\"]",
        "fileName": "falabella_retail_listados_scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "keyword",
            "selector": "(()=>{return 'Televisor';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "producto",
            "selector": "(()=>{const card=ROW.closest('[data-pod],[data-testid=\"product-pod\"],[id^=\"testId-pod\"],li,article')||ROW.parentElement?.parentElement?.parentElement||ROW;const titleEl=card.querySelector('[id*=\"displaySubTitle\"],[id*=\"pod-subTitle\"],[data-testid*=\"product-title\"],[data-testid*=\"pod-subTitle\"],.pod-subTitle,[class*=\"pod-subTitle\"],h2,h3');const img=card.querySelector('img[alt]');let txt=((titleEl&&(titleEl.innerText||titleEl.textContent))||ROW.getAttribute('title')||img?.getAttribute('alt')||ROW.textContent||'');txt=txt.replace(/Patrocinado/ig,' ').replace(/\\$\\s*[\\d.]+(?:,\\d+)?/g,' ').replace(/\\(\\s*\\d+\\s*\\)/g,' ').replace(/\\s+/g,' ').trim();const brandEl=card.querySelector('[id*=\"pod-displayName\"],[id*=\"displayName\"],[data-testid*=\"pod-title\"],.pod-title,[class*=\"pod-title\"],[data-testid*=\"brand\"],[class*=\"brand\"]');let brand=(brandEl&&(brandEl.innerText||brandEl.textContent)||'').replace(/^Patrocinado\\s+/i,'').replace(/\\s+/g,' ').trim();if(!brand){const m=(card.innerText||'').match(/\\b(SAMSUNG|LG|TCL|SONY|HYUNDAI|HISENSE|CHALLENGER|KALLEY|XIAOMI|PANASONIC|PHILIPS|CAIXUN|AIWA|NOBLEX|DAEWOO|HITACHI|JVC|RCA|OLIMPO|WESTINGHOUSE)\\b/i);brand=m?m[1]:'';}if(brand&&txt.toUpperCase().startsWith(brand.toUpperCase()+' ')){txt=txt.slice(brand.length).trim();}return txt;})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "producto_url",
            "selector": "(()=>{const href=ROW.getAttribute('href')||'';try{const u=new URL(href,location.origin);u.search='';u.hash='';return u.href;}catch(e){return href.split('?')[0].split('#')[0];}})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "imagen_url",
            "selector": "(()=>{const card=ROW.closest('[data-pod],[data-testid=\"product-pod\"],[id^=\"testId-pod\"],li,article')||ROW.parentElement?.parentElement?.parentElement||ROW;const img=card.querySelector('img[src]');if(img&&img.src)return img.src;const source=card.querySelector('source[srcset]');if(source){const first=(source.getAttribute('srcset')||'').split(',')[0].trim().split(' ')[0];try{return first?new URL(first,location.origin).href:'';}catch(e){return first;}}return '';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "marca",
            "selector": "(()=>{const card=ROW.closest('[data-pod],[data-testid=\"product-pod\"],[id^=\"testId-pod\"],li,article')||ROW.parentElement?.parentElement?.parentElement||ROW;const el=card.querySelector('[id*=\"pod-displayName\"],[id*=\"displayName\"],[data-testid*=\"pod-title\"],.pod-title,[class*=\"pod-title\"],[data-testid*=\"brand\"],[class*=\"brand\"]');let txt=(el&&(el.innerText||el.textContent)||'').replace(/\\s+/g,' ').trim();if(txt)return txt.replace(/^Patrocinado\\s+/i,'').trim();const all=(card.innerText||card.textContent||'').replace(/\\s+/g,' ').trim();const m=all.match(/\\b(SAMSUNG|LG|TCL|SONY|HYUNDAI|HISENSE|CHALLENGER|KALLEY|XIAOMI|PANASONIC|PHILIPS|CAIXUN|AIWA|NOBLEX|DAEWOO|HITACHI|JVC|RCA|OLIMPO|WESTINGHOUSE)\\b/i);return m?m[1].toUpperCase():'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "precio",
            "selector": "(()=>{const card=ROW.closest('[data-pod],[data-testid=\"product-pod\"],[id^=\"testId-pod\"],li,article')||ROW.parentElement?.parentElement?.parentElement||ROW;const nodes=Array.from(card.querySelectorAll('li[data-cmr-price],li[data-internet-price],li[data-event-price],[data-cmr-price],[data-internet-price],[data-event-price],[data-testid*=\"price\"],[class*=\"price\"]'));const attrs=['data-cmr-price','data-internet-price','data-event-price'];for(const n of nodes){for(const a of attrs){const v=n.getAttribute(a);if(v&&v.trim())return v.trim();}const t=(n.innerText||n.textContent||'').replace(/\\s+/g,' ').trim();const m=t.match(/\\$\\s*[\\d.]+(?:,\\d+)?/);if(m)return m[0];}const all=(card.innerText||'').replace(/\\s+/g,' ');const m=all.match(/\\$\\s*[\\d.]+(?:,\\d+)?/);return m?m[0]:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "precio_original",
            "selector": "(()=>{const card=ROW.closest('[data-pod],[data-testid=\"product-pod\"],[id^=\"testId-pod\"],li,article')||ROW.parentElement?.parentElement?.parentElement||ROW;const nodes=Array.from(card.querySelectorAll('li[data-normal-price],li[data-list-price],[data-normal-price],[data-list-price],[data-testid*=\"normal-price\"],[data-testid*=\"list-price\"],[class*=\"normal\"],[class*=\"cross\"],[class*=\"strike\"]'));const attrs=['data-normal-price','data-list-price'];for(const n of nodes){for(const a of attrs){const v=n.getAttribute(a);if(v&&v.trim())return v.trim();}const t=(n.innerText||n.textContent||'').replace(/\\s+/g,' ').trim();const m=t.match(/\\$\\s*[\\d.]+(?:,\\d+)?/);if(m)return m[0];}const all=(card.innerText||'');const prices=Array.from(new Set((all.match(/\\$\\s*[\\d.]+(?:,\\d+)?/g)||[]).map(p=>p.replace(/\\s+/g,' ').trim())));return prices.length>1?prices[1]:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "estrellas",
            "selector": "(()=>{const card=ROW.closest('[data-pod],[data-testid=\"product-pod\"],[id^=\"testId-pod\"],li,article')||ROW.parentElement?.parentElement?.parentElement||ROW;const attrNodes=Array.from(card.querySelectorAll('[data-rating],[rating],[data-testid*=\"rating\"],[aria-label*=\"estrella\"],[aria-label*=\"Estrella\"],[aria-label*=\"calific\"],[title*=\"estrella\"],[title*=\"calific\"]'));for(const n of attrNodes){const vals=[n.getAttribute('data-rating'),n.getAttribute('rating'),n.getAttribute('aria-label'),n.getAttribute('title'),n.innerText||n.textContent].filter(Boolean);for(const raw0 of vals){const raw=String(raw0).replace(',', '.');if(!/(estrella|calific|rating)/i.test(raw))continue;const m=raw.match(/\\d+(?:\\.\\d+)?/);if(m){const num=parseFloat(m[0]);if(num>0&&num<=5)return String(num);}}}return '';})()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 2640,
      "position_y": 240,
      "config": {
        "selector": "a[aria-label*=\"Siguiente\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"Siguiente\"]:not(:disabled),a[aria-label*=\"siguiente\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"siguiente\"]:not(:disabled),a[aria-label*=\"Next\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"Next\"]:not(:disabled),a[id*=\"pagination\"][id*=\"right\"]:not([aria-disabled=\"true\"]):not(.disabled),button[id*=\"pagination\"][id*=\"right\"]:not(:disabled),a[data-testid=\"pagination-next\"]:not([aria-disabled=\"true\"]):not(.disabled),button[data-testid=\"pagination-next\"]:not(:disabled),a.next:not(.disabled)",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "end-1",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 2640,
      "position_y": 600,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    },
    {
      "block_id": "click-1",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 3000,
      "position_y": 600,
      "config": {
        "selector": "a[aria-label*=\"Siguiente\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"Siguiente\"]:not(:disabled),a[aria-label*=\"siguiente\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"siguiente\"]:not(:disabled),a[aria-label*=\"Next\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"Next\"]:not(:disabled),a[id*=\"pagination\"][id*=\"right\"]:not([aria-disabled=\"true\"]):not(.disabled),button[id*=\"pagination\"][id*=\"right\"]:not(:disabled),a[data-testid=\"pagination-next\"]:not([aria-disabled=\"true\"]):not(.disabled),button[data-testid=\"pagination-next\"]:not(:disabled),a.next:not(.disabled)",
        "timeout": 15,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-page-load-2",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 3360,
      "position_y": 600,
      "config": {
        "timeout": 30,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "sleep-3",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3720,
      "position_y": 600,
      "config": {
        "duration": 4,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 4080,
      "position_y": 600,
      "config": {
        "selector": "a[href*=\"/falabella-co/product/\"], a[href*=\"/product/\"][href*=\"falabella.com.co\"], a[id^=\"testId-pod\"], [id^=\"testId-pod\"] a[href*=\"/product/\"]",
        "timeout": 45,
        "visible": true,
        "color": "bg-[#ff832b]"
      }
    }
  ],
  "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": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "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": "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": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "end-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": "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-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"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 136,
      "width": 4280,
      "height": 656,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "sleep-2",
          "wait-for-element-1",
          "wait-for-page-load-2",
          "sleep-3",
          "wait-for-element-2"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1128,
      "position_y": 136,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2208,
      "position_y": 136,
      "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": 2568,
      "position_y": 136,
      "width": 680,
      "height": 656,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1",
          "click-1"
        ]
      }
    },
    {
      "id": "group-control",
      "element_type": "group",
      "title": "Control Flow",
      "color": "#8d8d8d",
      "position_x": 2568,
      "position_y": 496,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes Falabella Colombia keyword listing results for the keyword \"Televisor\" and exports Keyword, Producto, Producto_url, Imagen_url, Marca, Precio, Precio_original, and Estrellas. Uses a tested click-next pagination loop to continue through all available listing pages and append results to one CSV. Product rows are anchored on Falabella product links; JavaScript columns clean sponsored labels, price/review-count text, and tracking query parameters. Best-effort template: Falabella may show CAPTCHA/anti-bot checks, cookie banners, or location popups.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(() => {\n  const textMatch = /aceptar|accept|entiendo|cerrar|close|continuar/i;\n  const candidates =...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1400,
      "position_y": 220,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (keyword, producto, producto_url, imagen_url, marca). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2480,
      "position_y": 220,
      "width": 340,
      "height": 130,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `a[aria-label*=\"Siguiente\"]:not([aria-disabled=\"true\"]):not(.disabled),button[aria-label*=\"Siguiente\"]:not(:disabled),a[a`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2840,
      "position_y": 220,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-click-1",
      "element_type": "note",
      "title": "Note: Click",
      "content": "Pagination click — add waits after this block; the page reloads asynchronously.",
      "color": "#ee5396",
      "position_x": 3200,
      "position_y": 580,
      "width": 316,
      "height": 106,
      "z_index": 22,
      "data": {
        "block_id": "click-1"
      }
    }
  ]
}