{
  "version": "1.0.0",
  "exported_at": "2026-06-01T07:10:00.000Z",
  "project": {
    "name": "Kakao Map Shop List Scraper",
    "description": "Scrapes Kakao Map shop/place detail pages equivalent to the Octoparse Kakao Map Shop List Scraper. Extracts keyword, store name, category, rating, review count, blog review count, address, jibun address, open hours, contact number, website, and Kakao detail URL. Navigation strategy: multi-URL loop over known Kakao place detail URLs from the provided keyword result sample; add more place URLs to the Navigate block to collect additional keyword results. If Kakao presents CAPTCHA or bot checks, solve manually in the browser.",
    "color": "bg-[#4589ff]",
    "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": 480,
      "position_y": 220,
      "config": {
        "urls": [
          "https://place.map.kakao.com/10201006",
          "https://place.map.kakao.com/23829251",
          "https://place.map.kakao.com/1436746032"
        ],
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 840,
      "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": 1200,
      "position_y": 220,
      "config": {
        "selector": "article#mainContent .tit_place",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 220,
      "config": {
        "duration": 2,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1920,
      "position_y": 220,
      "config": {
        "rowSelector": "article#mainContent",
        "fileName": "kakao-map-store-list-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "search_keyword",
            "selector": "'논현동 오마카세'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "store_name",
            "selector": "ROW.querySelector('.tit_place')?.childNodes ? Array.from(ROW.querySelector('.tit_place').childNodes).filter(n => n.nodeType === Node.TEXT_NODE).map(n => n.textContent.trim()).join(' ').trim() : (document.querySelector('meta[property=\"og:title\"]')?.content || '').trim()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "category",
            "selector": "ROW.querySelector('.info_cate')?.textContent.replace('장소 카테고리','').trim() || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "rating",
            "selector": "ROW.querySelector('.num_star')?.textContent.trim() || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "rating_count",
            "selector": "ROW.querySelector('.link_review .info_num')?.textContent.replace(/[^0-9]/g, '') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_count",
            "selector": "ROW.querySelector('.link_blog .info_num')?.textContent.replace(/[^0-9]/g, '') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "address",
            "selector": "(() => { const units = Array.from(ROW.querySelectorAll('.section_defaultinfo .unit_default')); const unit = units.find(u => u.querySelector('.ico_address')); if (!unit) return (document.querySelector('meta[property=\"og:description\"]')?.content || '').trim(); const firstRow = unit.querySelector('.row_detail'); if (!firstRow) return ''; const clone = firstRow.cloneNode(true); clone.querySelectorAll('button,.fold_detail,.screen_out,.badge_route').forEach(e => e.remove()); return clone.textContent.replace(/복사|펼치기|접기/g,'').replace(/\\s+/g,' ').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "jibun",
            "selector": "(() => { const units = Array.from(ROW.querySelectorAll('.section_defaultinfo .unit_default')); const unit = units.find(u => u.querySelector('.ico_address')); if (!unit) return ''; const dd = unit.querySelector('.fold_detail .list_item dd'); return dd ? dd.textContent.trim() : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_hours",
            "selector": "(() => { const units = Array.from(ROW.querySelectorAll('.section_defaultinfo .unit_default')); const unit = units.find(u => u.querySelector('.ico_runstate')); if (!unit) return ''; const lines = Array.from(unit.querySelectorAll('.line_fold')).map(line => { const day = line.querySelector('.tit_fold')?.textContent.trim() || ''; const times = Array.from(line.querySelectorAll('.detail_fold .txt_detail')).map(x => x.textContent.trim()).filter(Boolean).join(', '); return [day, times].filter(Boolean).join(' '); }).filter(Boolean); if (lines.length) return lines.join(' | '); return Array.from(unit.querySelectorAll('.row_detail .txt_detail')).map(x => x.textContent.trim()).filter(Boolean).join(' | '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "contact_number",
            "selector": "(() => { const units = Array.from(ROW.querySelectorAll('.section_defaultinfo .unit_default')); const unit = units.find(u => u.querySelector('.ico_call2')); if (!unit) return ''; const nums = Array.from(unit.querySelectorAll('.txt_detail')).map(x => x.textContent.trim()).filter(t => /\\d/.test(t)); return nums.join(' | '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "website",
            "selector": "(() => { const units = Array.from(ROW.querySelectorAll('.section_defaultinfo .unit_default')); const unit = units.find(u => u.querySelector('.ico_url')); if (!unit) return ''; return Array.from(unit.querySelectorAll('a.link_detail')).map(a => a.href || a.textContent.trim()).filter(Boolean).join(' | '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "detail_url",
            "selector": "location.href.split('#')[0]",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2280,
      "position_y": 220,
      "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": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-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": 408,
      "position_y": 116,
      "width": 1400,
      "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": 1848,
      "position_y": 116,
      "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": 2208,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes Kakao Map shop/place detail pages equivalent to the Octoparse Kakao Map Shop List Scraper. Extracts keyword, store name, category, rating, review count, blog review count, address, jibun address, open hours, contact number, website, and Kakao detail URL. Navigation strategy: multi-URL loop over known Kakao place detail URLs from the provided keyword result sample; add more place URLs to the Navigate block to collect additional keyword results. If Kakao presents CAPTCHA or bot checks, solve manually in the browser.",
      "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 3 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 680,
      "position_y": 200,
      "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 (search_keyword, store_name, category, rating, rating_count). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2120,
      "position_y": 200,
      "width": 340,
      "height": 133,
      "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": 2480,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}