{
  "version": "1.0.0",
  "exported_at": "2026-05-31T11:15:00.000Z",
  "project": {
    "name": "Rikunabi NEXT Job Scraper by URL",
    "description": "Rikunabi NEXT job-detail scraper equivalent to the Octoparse 'by URL' template. It loops through current valid /viewjob/ URLs discovered from the analyzed Rikunabi company/search page and appends one row per job. Older Octoparse sample detail URLs now return 404. Pagination/navigation strategy: multi-URL navigate.urls loop with loop-continue and append-mode CSV. Extraction is scoped to the current job summary and labeled job sections before recommended jobs/footer content.",
    "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": 240,
      "config": {
        "urls": [
          "https://next.rikunabi.com/viewjob/jk6ec6ab1aaaf4e6c6/",
          "https://next.rikunabi.com/viewjob/jk5c9a8764a2c5afae/",
          "https://next.rikunabi.com/viewjob/jk4211f2579c6e9972/",
          "https://next.rikunabi.com/viewjob/jkc1b8b89af8d0403c/",
          "https://next.rikunabi.com/viewjob/jke3f2d8a2ea52d759/",
          "https://next.rikunabi.com/viewjob/jk74040cffcd443907/",
          "https://next.rikunabi.com/viewjob/jk2fd5fa52959d0e29/",
          "https://next.rikunabi.com/viewjob/jk1b9a8a97b2e8527d/",
          "https://next.rikunabi.com/viewjob/jkfeddc5fccbcc3f22/"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "rikunabi",
          "jobs",
          "multi-url"
        ]
      }
    },
    {
      "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": 240,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 840,
      "position_y": 240,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "wait-for-text-1",
      "block_type": "process",
      "title": "Wait for Text",
      "description": "Wait until text appears",
      "position_x": 1200,
      "position_y": 240,
      "config": {
        "selector": "body",
        "text": "応募画面へ進む",
        "timeout": 20
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 240,
      "config": {
        "duration": 1
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1920,
      "position_y": 240,
      "config": {
        "rowSelector": "body",
        "fileName": "rikunabi_next_job_scraper_refined.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "会社名",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];const summary=(main.match(/いま見ている求人へ応募してみましょう！\\s*([\\s\\S]*?)(?:応募画面へ進む|この求人は|問題を報告する)/)||[])[1]||main;let m=summary.match(/((?:株式会社|有限会社|合同会社|学校法人|医療法人)[^\\s]+|[^\\s]+(?:株式会社|有限会社|合同会社))/);if(m)return n(m[1]);m=main.match(/掲載開始日：\\s*\\d{4}\\/\\d{2}\\/\\d{2}（.）\\s+[^\\s]+\\s+((?:株式会社|有限会社|合同会社|学校法人|医療法人)[^\\s]+|[^\\s]+(?:株式会社|有限会社|合同会社))/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "会社ホームページ",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/企業ホームページ\\s*(https?:\\/\\/\\S+)/);if(m)return m[1];const a=Array.from(document.querySelectorAll('a')).find(a=>/ホームページ|企業サイト|会社サイト/.test(a.textContent||'')&&/^https?:/.test(a.href||''));return a?a.href:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "企業ページ",
            "selector": "(()=>{const a=Array.from(document.querySelectorAll('a')).find(a=>/\\/company\\/cmi/.test(a.href||''));return a?a.href:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "連絡先",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/企業代表番号\\s*([0-9０-９\\-ー+()（）\\s]+)/);if(m)return n(m[1]);m=main.match(/(?:連絡先|問い合わせ先|問合せ先)\\s*([\\s\\S]*?)(?:掲載開始日|掲載期間|仕事内容|勤務地|給与|勤務時間|待遇|福利厚生|試用期間|その他)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "掲載期間",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/掲載開始日：\\s*\\d{4}\\/\\d{2}\\/\\d{2}（.）/);if(m)return n(m[0]);m=main.match(/掲載期間\\s*([\\s\\S]*?)(?:仕事内容|仕事概要|求めている人材|勤務地|給与|勤務時間)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "仕事の内容",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];for(const l of ['■仕事内容','仕事内容','仕事の内容','職務内容']){const i=main.indexOf(l);if(i>=0){let s=i+l.length,e=main.length;for(const stop of ['職場環境・雰囲気','求めている人材','対象となる方','勤務地','給与','勤務時間','待遇・福利厚生','試用期間','その他','仕事に関するPR','応募について','紹介企業情報']){const j=main.indexOf(stop,s+1);if(j>=0&&j<e)e=j;}return n(main.slice(s,e).replace(/^[:：\\s]+/,''));}}return '';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "求めている人材",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];for(const l of ['求めている人材','対象となる方','応募資格','必要な経験','歓迎条件']){const i=main.indexOf(l);if(i>=0){let s=i+l.length,e=main.length;for(const stop of ['勤務地','給与','勤務時間','休日休暇','待遇・福利厚生','試用期間','その他','仕事に関するPR','応募について','紹介企業情報']){const j=main.indexOf(stop,s+1);if(j>=0&&j<e)e=j;}return n(main.slice(s,e).replace(/^[:：\\s]+/,''));}}return '';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "勤務地",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];const summary=(main.match(/いま見ている求人へ応募してみましょう！\\s*([\\s\\S]*?)(?:応募画面へ進む|この求人は|問題を報告する)/)||[])[1]||'';const cm=(summary.match(/((?:株式会社|有限会社|合同会社|学校法人|医療法人)[^\\s]+|[^\\s]+(?:株式会社|有限会社|合同会社))/)||[])[1]||'';if(cm){const rest=summary.slice(summary.indexOf(cm)+cm.length);const m=rest.match(/(.+?)\\s+(?:年俸|月給|時給|日給|年収|月収|完全歩合制)/);if(m)return n(m[1]);}let m=main.match(/(?:■勤務地|勤務地)\\s*([\\s\\S]*?)(?:給与|勤務時間|待遇・福利厚生|試用期間|その他|仕事に関するPR|応募について)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "給与",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];const summary=(main.match(/いま見ている求人へ応募してみましょう！\\s*([\\s\\S]*?)(?:応募画面へ進む|この求人は|問題を報告する)/)||[])[1]||'';let m=summary.match(/((?:年俸|月給|時給|日給|年収|月収)\\s*[^\\s]+(?:\\s*[^\\s]+)?|完全歩合制)/);if(m)return n(m[1]);m=main.match(/(?:■給与|給与)\\s*([\\s\\S]*?)(?:勤務時間|休日休暇|待遇・福利厚生|試用期間|その他|仕事に関するPR|応募について)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "勤務時間",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/(?:■勤務時間|勤務時間)\\s*([\\s\\S]*?)(?:待遇・福利厚生|休日休暇|試用期間|その他|仕事に関するPR|応募について|紹介企業情報)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "休日休暇",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/(?:■休日休暇|休日休暇|休日・休暇|休日)\\s*([\\s\\S]*?)(?:待遇・福利厚生|試用期間|その他|仕事に関するPR|応募について|紹介企業情報)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "待遇福利厚生",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/(?:■待遇・福利厚生|待遇・福利厚生|待遇福利厚生|福利厚生|待遇)\\s*([\\s\\S]*?)(?:試用期間|その他|仕事に関するPR|応募について|紹介企業情報)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "代表者",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/代表者\\s*([\\s\\S]*?)(?:企業代表番号|企業ホームページ|資本金|売上高|従業員数|事業所|業種|いま見ている求人)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "資本金",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/資本金\\s*([\\s\\S]*?)(?:売上高|従業員数|事業所|業種|事業内容|本社所在地|代表者)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "売上高",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/売上高\\s*([\\s\\S]*?)(?:従業員数|事業所|業種|事業内容|本社所在地|代表者)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "従業員数",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/従業員数\\s*([\\s\\S]*?)(?:事業所|業種|事業内容|本社所在地|代表者)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "事業所",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/本社所在地\\s*([\\s\\S]*?)(?:代表者|企業代表番号|企業ホームページ|資本金|売上高|従業員数|事業内容)/);if(m)return n(m[1]);m=main.match(/事業所\\s*([\\s\\S]*?)(?:業種|事業内容|代表者|資本金|売上高|従業員数)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "業種",
            "selector": "(()=>{const n=s=>(s||'').replace(/\\s+/g,' ').trim();const raw=n(document.body.innerText);const main=raw.split(/あなたにおすすめの求人|関連条件で探す|社会人のための転職サイト/)[0];let m=main.match(/事業内容\\s*([\\s\\S]*?)(?:本社所在地|代表者|企業代表番号|企業ホームページ|いま見ている求人)/);if(m)return n(m[1]);m=main.match(/業種\\s*([\\s\\S]*?)(?:本社所在地|代表者|資本金|売上高|従業員数|事業所)/);return m?n(m[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "ページURL",
            "selector": "location.href",
            "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": 240,
      "config": {}
    }
  ],
  "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": "wait-for-text-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-text-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-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 136,
      "width": 1760,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "wait-for-text-1",
          "sleep-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1848,
      "position_y": 136,
      "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": 136,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Rikunabi NEXT job-detail scraper equivalent to the Octoparse 'by URL' template. It loops through current valid /viewjob/ URLs discovered from the analyzed Rikunabi company/search page and appends one row per job. Older Octoparse sample detail URLs now return 404. Pagination/navigation strategy: multi-URL navigate.urls loop with loop-continue and append-mode CSV. Extraction is scoped to the current job summary and labeled job sections before recommended jobs/footer content.",
      "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 (会社名, 会社ホームページ, 企業ページ, 連絡先, 掲載期間). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2120,
      "position_y": 220,
      "width": 340,
      "height": 124,
      "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": 220,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}