{
  "version": "1.0.0",
  "exported_at": "2026-05-31T16:25:00.000Z",
  "project": {
    "name": "Doda Job Listing Scraper",
    "description": "Scrapes one Doda job detail URL and exports the same job fields shown by the Octoparse Doda template: company name, job title/label, tags, job description, location, nearest station, salary information, business content, and detail page URL. The attached analyzed sample URL returned HTTP 410 / 掲載終了, so this template includes a posting_status column and avoids extracting generic navigation text from expired postings. No pagination is used because the target URL is a single Doda job detail page and the attached analysis found no pagination candidates. To scrape another job, replace the Navigate URL with an active Doda job detail URL.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser viewport size",
      "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": {
        "url": "https://doda.jp/DodaFront/View/JobSearchDetail/j_jid__3011704183/-tab__pr/",
        "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": 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": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 260,
      "config": {
        "duration": 1,
        "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": 260,
      "config": {
        "rowSelector": "body",
        "fileName": "doda-job-listing-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "create",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "posting_status",
            "selector": "(function(){const txt=(ROW.innerText||'').replace(/\\s+/g,' ').trim();if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(txt))return 'expired';if(/求人を探す|掲載中の求人を探す/.test(txt)&&!/(仕事内容|勤務地|給与|事業内容|会社名|社名)/.test(txt))return 'not_job_detail_or_expired';return 'active_or_unknown';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_name",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';function byLabel(labels){const nodes=Array.from(ROW.querySelectorAll('tr,dl,section,div,li'));for(const n of nodes){const keyEl=n.querySelector('th,dt,h2,h3,h4,.ttl,.title,.label,[class*=title],[class*=label]');const key=clean(keyEl&&keyEl.innerText);if(!key||!labels.some(l=>key.indexOf(l)>=0))continue;const valEl=n.querySelector('td,dd,p,.txt,.content,.body,[class*=text],[class*=content]');let val=clean(valEl?valEl.innerText:n.innerText.replace(keyEl?keyEl.innerText:'' ,''));if(val&&val!==key&&val.length<500)return val;}return '';}let v=byLabel(['社名','会社名','企業名']);if(v)return v;for(const s of ['[class*=company]','[class*=Company]','.companyName','.company-name','.jobCompany','.job-company']){const e=ROW.querySelector(s);const t=clean(e&&e.innerText);if(t&&t.length<160&&!/ログイン|会員|検索|求人を探す/.test(t))return t;}return '';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "label",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';for(const s of ['h1','[class*=jobTitle]','[class*=JobTitle]','[class*=job-title]','[class*=detailTitle]','[class*=DetailTitle]']){const e=ROW.querySelector(s);const t=clean(e&&e.innerText);if(t&&t.length<220&&!/求人を探す|紹介してもらう|プロフィール|イベント|ログイン|会員|doda|デューダ/.test(t))return t;}const title=clean(document.title).replace(/転職.*doda.*$/,'').replace(/｜.*$/,'');return title.length<220?title:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "tags",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';const selectors='[class*=tag],[class*=Tag],[class*=badge],[class*=Badge],[class*=condition],[class*=Condition],[class*=iconText],[class*=IconText]';const vals=Array.from(ROW.querySelectorAll(selectors)).map(e=>clean(e.innerText||e.getAttribute('alt')||e.getAttribute('title'))).filter(t=>t&&t.length<=50&&!/ログイン|会員|メニュー|気になる|検索|応募|会社案内|求人掲載/.test(t));return Array.from(new Set(vals)).join('、');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "job_description",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';function byLabel(labels){const nodes=Array.from(ROW.querySelectorAll('tr,dl,section,div,li'));for(const n of nodes){const keyEl=n.querySelector('th,dt,h2,h3,h4,.ttl,.title,.label,[class*=title],[class*=label]');const key=clean(keyEl&&keyEl.innerText);if(!key||!labels.some(l=>key.indexOf(l)>=0))continue;const valEl=n.querySelector('td,dd,p,.txt,.content,.body,[class*=text],[class*=content]');let val=clean(valEl?valEl.innerText:n.innerText.replace(keyEl?keyEl.innerText:'' ,''));if(val&&val!==key)return val;}return '';}return byLabel(['仕事内容','業務内容','職務内容','仕事の内容']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "location",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';function byLabel(labels){const nodes=Array.from(ROW.querySelectorAll('tr,dl,section,div,li'));for(const n of nodes){const keyEl=n.querySelector('th,dt,h2,h3,h4,.ttl,.title,.label,[class*=title],[class*=label]');const key=clean(keyEl&&keyEl.innerText);if(!key||!labels.some(l=>key.indexOf(l)>=0))continue;const valEl=n.querySelector('td,dd,p,.txt,.content,.body,[class*=text],[class*=content]');let val=clean(valEl?valEl.innerText:n.innerText.replace(keyEl?keyEl.innerText:'' ,''));if(val&&val!==key)return val;}return '';}return byLabel(['勤務地','所在地','勤務場所']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "nearest_station",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';function byLabel(labels){const nodes=Array.from(ROW.querySelectorAll('tr,dl,section,div,li'));for(const n of nodes){const keyEl=n.querySelector('th,dt,h2,h3,h4,.ttl,.title,.label,[class*=title],[class*=label]');const key=clean(keyEl&&keyEl.innerText);if(!key||!labels.some(l=>key.indexOf(l)>=0))continue;const valEl=n.querySelector('td,dd,p,.txt,.content,.body,[class*=text],[class*=content]');let val=clean(valEl?valEl.innerText:n.innerText.replace(keyEl?keyEl.innerText:'' ,''));if(val&&val!==key)return val;}return '';}return byLabel(['最寄り駅','最寄駅','交通','アクセス']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "salary_info",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';function byLabel(labels){const nodes=Array.from(ROW.querySelectorAll('tr,dl,section,div,li'));for(const n of nodes){const keyEl=n.querySelector('th,dt,h2,h3,h4,.ttl,.title,.label,[class*=title],[class*=label]');const key=clean(keyEl&&keyEl.innerText);if(!key||!labels.some(l=>key.indexOf(l)>=0))continue;const valEl=n.querySelector('td,dd,p,.txt,.content,.body,[class*=text],[class*=content]');let val=clean(valEl?valEl.innerText:n.innerText.replace(keyEl?keyEl.innerText:'' ,''));if(val&&val!==key)return val;}return '';}return byLabel(['給与情報','給与','年収','月給','賃金']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "business_content",
            "selector": "(function(){function clean(t){return (t||'').replace(/\\s+/g,' ').trim();}const page=clean(ROW.innerText);if(/掲載が終了|ご指定の求人情報は掲載が終了/.test(page))return '';function byLabel(labels){const nodes=Array.from(ROW.querySelectorAll('tr,dl,section,div,li'));for(const n of nodes){const keyEl=n.querySelector('th,dt,h2,h3,h4,.ttl,.title,.label,[class*=title],[class*=label]');const key=clean(keyEl&&keyEl.innerText);if(!key||!labels.some(l=>key.indexOf(l)>=0))continue;const valEl=n.querySelector('td,dd,p,.txt,.content,.body,[class*=text],[class*=content]');let val=clean(valEl?valEl.innerText:n.innerText.replace(keyEl?keyEl.innerText:'' ,''));if(val&&val!==key)return val;}return '';}return byLabel(['事業内容','事業概要','会社概要']);})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "detail_page_url",
            "selector": "location.href",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    }
  ],
  "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"
    }
  ],
  "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": 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": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes one Doda job detail URL and exports the same job fields shown by the Octoparse Doda template: company name, job title/label, tags, job description, location, nearest station, salary information, business content, and detail page URL. The attached analyzed sample URL returned HTTP 410 / 掲載終了, so this template includes a posting_status column and avoids extracting generic navigation text from expired postings. No pagination is used because the target URL is a single Doda job detail page and the attached analysis found no pagination candidates. To scrape another job, replace the Navigate URL with an active Doda job detail URL.",
      "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 (posting_status, company_name, label, tags, job_description). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2120,
      "position_y": 240,
      "width": 340,
      "height": 133,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    }
  ]
}