{
  "version": "1.0.0",
  "exported_at": "2026-06-01T10:10:00.000Z",
  "project": {
    "name": "Goo Net Used Car Sales Scraper",
    "description": "Extracts Goo-net used-car detail data equivalent to the Octoparse Goo Net Used Car Sales Scraper: keyword/model, page number, maker, body/model, vehicle info, prices, year, mileage, inspection, displacement, repair history, warranty, legal maintenance, seller, page URL, and image URL. The attached analysis contains vehicle detail pages rather than a keyword search result page, so this UScraper template uses a multi-URL navigation loop over Goo-net vehicle detail URLs and appends all valid detail pages to one CSV. The extraction row selector is limited to Goo-net active detail-page containers so expired/404 listings are skipped instead of exporting fallback page text. Replace or extend navigate.urls with vehicle detail URLs collected from Goo-net keyword/search result pages. Goo-net may present CAPTCHA that must be solved manually.",
    "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://www.goo-net.com/usedcar/spread/goo/15/700060253530201128001.html",
          "https://www.goo-net.com/usedcar/spread/goo/13/700012323130220203001.html"
        ],
        "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": "body",
        "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": 1560,
      "position_y": 260,
      "config": {
        "rowSelector": ".kurumaPageInspection",
        "fileName": "goo-net-used-car-sales-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "keyword",
            "selector": "(function(){const links=[...document.querySelectorAll('.topicpath a')].map(a=>a.textContent.replace(/\\s+/g,' ').trim());const maker=(links.find(t=>/の中古車$/.test(t)&&t!=='中古車')||'').replace(/の中古車$/,'');const model=(links.find(t=>/の中古車$/.test(t)&&t!==maker+'の中古車'&&t!=='中古車'&&!/県/.test(t))||'').replace(/の中古車$/,'');return [maker,model].filter(Boolean).join(' ')||((document.querySelector('meta[name=\"keywords\"]')||{}).content||'').split(',')[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "page_number",
            "selector": "(function(){return '1';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "maker",
            "selector": "(function(){const links=[...document.querySelectorAll('.topicpath a')].map(a=>a.textContent.replace(/\\s+/g,' ').trim());return (links.find(t=>/の中古車$/.test(t)&&t!=='中古車')||'').replace(/の中古車$/,'')||((document.querySelector('h1')||{}).textContent||'').trim().split(/\\s+/)[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "body_type",
            "selector": "(function(){const links=[...document.querySelectorAll('.topicpath a')].map(a=>a.textContent.replace(/\\s+/g,' ').trim());const maker=(links.find(t=>/の中古車$/.test(t)&&t!=='中古車')||'').replace(/の中古車$/,'');return (links.find(t=>/の中古車$/.test(t)&&t!==maker+'の中古車'&&t!=='中古車'&&!/県/.test(t))||'').replace(/の中古車$/,'');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "vehicle_info",
            "selector": "(function(){const og=document.querySelector('meta[property=\"og:title\"]');const h2=document.querySelector('h2');const h1=document.querySelector('h1');return ((og&&og.content)||(h2&&h2.textContent)||(h1&&h1.textContent)||'').replace(/\\s+/g,' ').trim();})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "vehicle_price",
            "selector": "(function(){const v=(document.querySelector('input[name=\"loan_price\"]')||{}).value;return v?`${v}万円`:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "total_payment",
            "selector": "(function(){const v=(document.querySelector('input[name=\"loan_total_price\"]')||{}).value;return v?`${v}万円`:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "year",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('年式')||val('年式初度登録');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "mileage",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('走行距離');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "inspection",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('車検');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "displacement",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('排気量');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "repair_history",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('修復歴');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "warranty",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('保証');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "legal_maintenance",
            "selector": "(function(){function n(s){return(s||'').replace(/\\s+/g,' ').trim()}function val(label){const nodes=[...document.querySelectorAll('th,dt')];for(const el of nodes){let t=n(el.textContent).replace(/（.*?）/g,'');if(t===label){let nx=el.nextElementSibling;if(nx)return n(nx.textContent);let tr=el.closest('tr');if(tr){let kids=[...tr.children];let i=kids.indexOf(el);if(kids[i+1])return n(kids[i+1].textContent)}}}return ''}return val('法定整備');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "seller_name",
            "selector": "(function(){const el=document.querySelector('a.exp')||document.querySelector('a.updateExp')||[...document.querySelectorAll('h3')].find(e=>e.textContent.trim());return el?el.textContent.replace(/\\s+/g,' ').trim():'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "page_url",
            "selector": "(function(){return location.href.split('?')[0];})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_url",
            "selector": "(function(){const og=document.querySelector('meta[property=\"og:image\"]');const img=document.querySelector('img[src*=\"picture\"][src$=\".jpg\"], img[data-original*=\"picture\"]');return (og&&og.content)||(img&&(img.src||img.getAttribute('data-original')))||'';})()",
            "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": "Extracts Goo-net used-car detail data equivalent to the Octoparse Goo Net Used Car Sales Scraper: keyword/model, page number, maker, body/model, vehicle info, prices, year, mileage, inspection, displacement, repair history, warranty, legal maintenance, seller, page URL, and image URL. The attached analysis contains vehicle detail pages rather than a keyword search result page, so this UScraper template uses a multi-URL navigation loop over Goo-net vehicle detail URLs and appends all valid detail pages to one CSV. The extraction row selector is limited to Goo-net active detail-page containers so expired/404 listings are skipped instead of exporting fallback page text. Replace or extend navigate.urls with vehicle detail URLs collected from Goo-net keyword/search result pages. Goo-net may present CAPTCHA that must be solved manually.",
      "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 2 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 (keyword, page_number, maker, body_type, vehicle_info). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 240,
      "width": 340,
      "height": 131,
      "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"
      }
    }
  ]
}