{
  "version": "1.0.0",
  "exported_at": "2026-06-03T10:10:00.000Z",
  "project": {
    "name": "Tabelog Store list and details Scraper",
    "description": "Scrapes Tabelog restaurant detail pages by URL list, equivalent to the Octoparse template. It extracts restaurant name, page URL, rating, reviewer count, categories, reservation phone, address, transportation, operating hours, budget, and payment method. Navigation strategy: multi-URL loop using the supplied Tabelog restaurant detail URLs; add more Tabelog detail URLs to the navigate.urls array to scrape additional stores. No pagination was detected on individual detail pages.",
    "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": 220,
      "config": {
        "urls": [
          "https://tabelog.com/tokyo/A1321/A132104/13064981/",
          "https://tabelog.com/tokyo/A1309/A130905/13024910/",
          "https://tabelog.com/tokyo/A1321/A132104/13012215/"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "tabelog",
          "multi-url",
          "restaurant-detail"
        ]
      }
    },
    {
      "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": 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": 840,
      "position_y": 220,
      "config": {
        "selector": "h2",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1200,
      "position_y": 220,
      "config": {
        "rowSelector": "body",
        "fileName": "Tabelog-Store-list-detail-Scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "Restaurant_name",
            "selector": "(()=>{const el=ROW.querySelector('h2')||ROW.querySelector('h1');return (el?.textContent||'').replace(/\\s+/g,' ').trim();})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Page_URL",
            "selector": "location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Star_rating",
            "selector": "(()=>{const meta=document.querySelector('meta[property=\"og:description\"]')?.content||'';const mm=meta.match(/([0-9]\\.[0-9]{2})/);if(mm)return mm[1];const el=ROW.querySelector('.rdheader-rating__score-val-dtl,.rdheader-rating__score-val,.c-rating__val');return (el?.textContent||'').replace(/\\s+/g,' ').trim();})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Number_Of_Reviewers",
            "selector": "(()=>{const fromLink=Array.from(ROW.querySelectorAll('a[href*=\"/dtlrvwlst/\"]')).map(a=>(a.textContent||'').replace(/\\s+/g,' ').trim()).find(t=>/口コミ\\s*[0-9,]+\\s*人/.test(t));if(fromLink)return fromLink;const m=(ROW.innerText||'').match(/口コミ\\s*[0-9,]+\\s*人/);return m?m[0]:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Categories",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const get=labels=>{for(const tr of ROW.querySelectorAll('tr')){const th=norm(tr.querySelector('th')?.textContent);if(labels.some(l=>th.includes(l)))return norm(tr.querySelector('td')?.innerText);}return '';};return get(['ジャンル']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Tel_for_reservation",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const get=labels=>{for(const tr of ROW.querySelectorAll('tr')){const th=norm(tr.querySelector('th')?.textContent);if(labels.some(l=>th.includes(l)))return norm(tr.querySelector('td')?.innerText);}return '';};return get(['お問い合わせ']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Address",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const get=labels=>{for(const tr of ROW.querySelectorAll('tr')){const th=norm(tr.querySelector('th')?.textContent);if(labels.some(l=>th.includes(l)))return norm(tr.querySelector('td')?.innerText);}return '';};return get(['住所']).replace(/大きな地図を見る|周辺のお店を探す/g,'').replace(/\\s+/g,' ').trim();})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Transportation",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const get=labels=>{for(const tr of ROW.querySelectorAll('tr')){const th=norm(tr.querySelector('th')?.textContent);if(labels.some(l=>th.includes(l)))return norm(tr.querySelector('td')?.innerText);}return '';};return get(['交通手段']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Operating_hours",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const get=labels=>{for(const tr of ROW.querySelectorAll('tr')){const th=norm(tr.querySelector('th')?.textContent);if(labels.some(l=>th.includes(l)))return norm(tr.querySelector('td')?.innerText);}return '';};return get(['営業時間']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Budget",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const rows=Array.from(ROW.querySelectorAll('tr'));const read=tr=>norm(tr.querySelector('td')?.innerText).replace(/利用金額分布を見る/g,'').replace(/\\s+/g,' ').trim();for(const tr of rows){if(norm(tr.querySelector('th')?.textContent)==='予算')return read(tr);}for(const tr of rows){const th=norm(tr.querySelector('th')?.textContent);if(th.includes('予算（口コミ集計）'))return read(tr);}for(const tr of rows){const th=norm(tr.querySelector('th')?.textContent);if(th.includes('予算'))return read(tr);}return '';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Method_of_payment",
            "selector": "(()=>{const norm=s=>(s||'').replace(/\\s+/g,' ').trim();const get=labels=>{for(const tr of ROW.querySelectorAll('tr')){const th=norm(tr.querySelector('th')?.textContent);if(labels.some(l=>th.includes(l)))return norm(tr.querySelector('td')?.innerText);}return '';};return get(['支払い方法']);})()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 220,
      "config": {
        "duration": 1,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 1920,
      "position_y": 220,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "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": 116,
      "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": 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": 1848,
      "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 Tabelog restaurant detail pages by URL list, equivalent to the Octoparse template. It extracts restaurant name, page URL, rating, reviewer count, categories, reservation phone, address, transportation, operating hours, budget, and payment method. Navigation strategy: multi-URL loop using the supplied Tabelog restaurant detail URLs; add more Tabelog detail URLs to the navigate.urls array to scrape additional stores. No pagination was detected on individual detail pages.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (Restaurant_name, Page_URL, Star_rating, Number_Of_Reviewers, Categories). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1400,
      "position_y": 200,
      "width": 340,
      "height": 137,
      "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": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}