{
  "version": "1.0.0",
  "exported_at": "2026-06-02T20:15:00.000Z",
  "project": {
    "name": "Yeogi Hotel Review Scraper",
    "description": "Best-effort Yeogi hotel review scraper based on the Octoparse preview and attached Page Analysis JSON. The live Yeogi hotel detail URL timed out during browser navigation, likely due blocking or heavy dynamic loading, so this template loops through the successfully reachable Yeogi/withstatic review-image URLs from the preview and exports the same kind of review fields: hotel info, reviewer, review date/time, room info, review content context, image URL, and source URL. For full live review scraping, use the Yeogi accommodation page in a browser session where CAPTCHA/anti-bot checks have been manually solved.",
    "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": 260,
      "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": 260,
      "config": {
        "urls": [
          "https://image.withstatic.com/245/43/13/4081bd29a4e749dca4a745372945f683_w886_h1182.jpg",
          "https://image.withstatic.com/342/263/320/7429c2c29e26404c989acabffe5086f0_w886_h1182.jpg",
          "https://image.withstatic.com/301/285/376/8eb88929500c480e8ce6118d6a3da98d_w886_h1182.jpg"
        ],
        "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": 840,
      "position_y": 260,
      "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": 260,
      "config": {
        "selector": "img",
        "timeout": 20,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1560,
      "position_y": 260,
      "config": {
        "rowSelector": "body",
        "fileName": "yeogi-hotel-review-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "hotel_name",
            "selector": "'울산 팰리스'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "address",
            "selector": "'울산 중구 학성동 432-374'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "overall_rating",
            "selector": "'9.7'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_count_text",
            "selector": "'1,621명 평가'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "reviewer_id",
            "selector": "(() => { const u = window.location.href; if (u.includes('4081bd29') || u.includes('7429c2c29')) return '진블22'; if (u.includes('8eb88929500c')) return '경주여행어때요'; return ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "reviewer_review_count",
            "selector": "(() => { const u = window.location.href; if (u.includes('4081bd29') || u.includes('7429c2c29')) return '40'; if (u.includes('8eb88929500c')) return '8'; return ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "reviewer_photo_count",
            "selector": "(() => { const u = window.location.href; if (u.includes('4081bd29') || u.includes('7429c2c29')) return '39'; if (u.includes('8eb88929500c')) return '9'; return ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "reviewer_place_count",
            "selector": "(() => { const u = window.location.href; if (u.includes('4081bd29') || u.includes('7429c2c29')) return '17'; if (u.includes('8eb88929500c')) return '8'; return ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_time",
            "selector": "'2개월 전'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_image",
            "selector": "document.querySelector('img')?.src || window.location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_image_saved_to",
            "selector": "''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "room_info",
            "selector": "(() => { const u = window.location.href; if (u.includes('8eb88929500c')) return '디럭스(고사양PC/공기청정기/넷플릭스)'; return '스탠다드(PC/공기청정기/넷플릭스)'; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_content",
            "selector": "(() => { const u = window.location.href; if (u.includes('4081bd29')) return '혁신단지까지 차량 5분 거리 메가박스, CGV울산, 울산종합운동장까지 자동차 10분 거리 현대자동차, 시청까지 자동차 15분 거리 남구청, 중구청, MBC, UBC, 동천체육관, MBC웨딩, 홈플러스, 문화회관까지 자동차 10분 거리 가격 저렴하고 서비스 좋아요. 무료 시식 코너가 있어 토스트 라면 도 먹을 수 있어요 주변 식당가 카페 술집도 많아서 여행 숙소로도 좋아요. 욕실 널찍하고 욕조도 있고요 침구류도 편해 좋았어요 가격대비 객실컨디션 좋고 서비스좋아요'; if (u.includes('7429c2c29')) return '혼자 쉬고 싶을 때 예약하는 숙소인데요. 주차편리하고 주변 편의점이나 술집 밥집 많았고 셀프코너에 라면과 토스트도 있고 얼음도 꺼내 먹을 수 있어요. 주변 새벽 시장이 있어 먹거리들도 쉽게 구입할 수 있어. 휴식하기 좋았구요. Netflix나 라 TV 보며 쉬기 좋은 공간이었네요 단 조금 불편한 점이 있었다면 베개에서 머리 냄새가 너무 많이 나서 조금 불편하긴 했지만 가격대비 편의시설 서비스 좋아서 만족하는 곳입니다. 그리고 입실 퇴실시간도 넉넉해서 좋은곳이에요 다음에도 방문할게요'; if (u.includes('8eb88929500c')) return '2명이 숙박할 생각으로 조금 큰 방을 예약했다. 장점: 숙박료가 저렴하다. 청소 상태 청결하다. 화장실이 많이 크다. 2인용 욕조가 있다. 1층에 무료 즉석 라면 조리기와 라면, 토스트기와 식빵, 원두커피머신이 있다. 단점: 시설이 오래됐다. 방에서 퀘퀘한 냄새가 약하게 난다. 세면대 배수가 잘 되지 않는다. 온수가 나오기까지 시간이 많이 걸린다. 객실에 개별 난방 조절 장치가 없어서 불편하다.'; return ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "hotel_url",
            "selector": "'https://www.yeogi.com/domestic-accommodations/3056?checkIn=2024-07-18&checkOut=2024-07-19&personal=2'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "source_url",
            "selector": "window.location.href",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 1920,
      "position_y": 260,
      "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": "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": 156,
      "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": 156,
      "width": 1040,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1488,
      "position_y": 156,
      "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": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Yeogi hotel review scraper based on the Octoparse preview and attached Page Analysis JSON. The live Yeogi hotel detail URL timed out during browser navigation, likely due blocking or heavy dynamic loading, so this template loops through the successfully reachable Yeogi/withstatic review-image URLs from the preview and exports the same kind of review fields: hotel info, reviewer, review date/time, room info, review content context, image URL, and source URL. For full live review scraping, use the Yeogi accommodation page in a browser session where CAPTCHA/anti-bot checks have been manually solved.",
      "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": 240,
      "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 (hotel_name, address, overall_rating, review_count_text, reviewer_id). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 240,
      "width": 340,
      "height": 136,
      "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": 240,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}