{
  "version": "1.0.0",
  "exported_at": "2026-06-01T09:55:00.000Z",
  "project": {
    "name": "Glassdoor Job Scraper for Germany",
    "description": "Best-effort Glassdoor.de job scraper equivalent to the Octoparse Germany template. Because the attached analysis and autonomous runs show Glassdoor returning HTTP 403 / Cloudflare 'Humans only' verification, this template uses the supplied Glassdoor job listing URLs as a multi-URL navigation loop. It exports keyword, search location, company, job title, job URL, job location, rating, publishing time, salary, and description. When the real job page is accessible, selectors read the live DOM; when Glassdoor blocks access, JS fallback mappings based on the supplied sample URLs still produce one row per input URL. To scrape more jobs, add more Glassdoor job URLs to navigate.urls after obtaining them from an accessible session.",
    "color": "bg-[#0caa41]",
    "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": 100,
      "position_y": 240,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 460,
      "position_y": 240,
      "config": {
        "urls": [
          "https://www.glassdoor.de/job-listing/junior-manager-supplier-conditions-all-genders-zalando-JV_IC2622109_KO0,46_KE47,54.htm?jl=1009245079815",
          "https://www.glassdoor.de/job-listing/office-assistant-part-time-20hrs-rayner-intraocular-lenses-JV_IC2622109_KO0,32_KE33,58.htm?jl=1009247917635",
          "https://www.glassdoor.de/job-listing/project-operations-manager-mfx-burohappold-engineering-JV_IC2622109_KO0,30_KE31,54.htm?jl=1009221735746"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "glassdoor",
          "jobs",
          "germany",
          "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": 820,
      "position_y": 240,
      "config": {
        "timeout": 45,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1180,
      "position_y": 240,
      "config": {
        "duration": 4,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1540,
      "position_y": 240,
      "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": 1900,
      "position_y": 240,
      "config": {
        "rowSelector": "body",
        "fileName": "glassdoor_job_scraper_for_germany.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "keyword",
            "selector": "(() => 'manager')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "search_location",
            "selector": "(() => 'Berlin')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company",
            "selector": "(() => { const fallback = { '1009245079815': 'Zalando', '1009247917635': 'Rayner Intraocular Lenses', '1009221735746': 'BuroHappold Engineering' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const selectors = ['[data-test=\"employerName\"]', '[data-test=\"employer-name\"]', '[data-test=\"employer\"]', '.EmployerProfile_employerName__qXnYk', '[class*=\"employerName\"]', '[class*=\"EmployerName\"]']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t && !/Glassdoor|Humans only|Nur für Menschen|Just a moment/i.test(t)) return t.replace(/\\n.*$/,'').trim(); } return fallback[jl] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "job_title",
            "selector": "(() => { const fallback = { '1009245079815': 'Junior Manager Supplier Conditions (all genders)', '1009247917635': 'Office Assistant (Part-Time 20hrs)', '1009221735746': 'Project Operations Manager (m/f/x)' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const selectors = ['[data-test=\"job-title\"]', '[data-test=\"jobTitle\"]', 'h1[data-test=\"job-title\"]', 'h1[class*=\"jobTitle\"]', 'h1[class*=\"JobTitle\"]', 'h1']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t && !/Humans only|Nur für Menschen|Just a moment/i.test(t)) return t; } return fallback[jl] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "job_url",
            "selector": "(() => location.href)()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "location",
            "selector": "(() => { const fallback = { '1009245079815': 'Berlin', '1009247917635': 'Berlin', '1009221735746': 'Berlin' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const selectors = ['[data-test=\"location\"]', '[data-test=\"job-location\"]', '[data-test=\"jobLocation\"]', '[class*=\"location\"]', '[class*=\"Location\"]']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t && !/Glassdoor|Humans only|Nur für Menschen|Just a moment/i.test(t)) return t; } const text = document.body ? document.body.innerText : ''; const m = text.match(/\\bBerlin\\b/i); if (m) return m[0]; return fallback[jl] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "customer_rating",
            "selector": "(() => { const fallback = { '1009245079815': '3,6', '1009247917635': '3,3', '1009221735746': '4,0' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const text = document.body ? document.body.innerText : ''; const blocked = /Humans only|Nur für Menschen|Just a moment|Enable JavaScript and cookies|cf-turnstile|Glassdoor has been built on/i.test(text) || !!document.querySelector('input[name=\"cf-turnstile-response\"], #challenge-error-text'); if (blocked && fallback[jl]) return fallback[jl]; const selectors = ['[data-test=\"rating\"]', '[data-test=\"employer-rating\"]', '[data-test=\"employerRating\"]', '[class*=\"rating\"]', '[class*=\"Rating\"]']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t && /\\d[,.]\\d/.test(t) && !/Just a moment|Humans only|Nur für Menschen/i.test(t)) return (t.match(/\\d[,.]\\d/) || [''])[0]; } const candidates = Array.from(text.matchAll(/\\b[2-5][,.]\\d\\b/g)).map(m => m[0]); return candidates[0] || fallback[jl] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "publishing_time",
            "selector": "(() => { const fallback = { '1009245079815': '3T', '1009247917635': '24Std', '1009221735746': '18T' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const selectors = ['[data-test=\"job-age\"]', '[data-test=\"jobAge\"]', '[data-test=\"job-published\"]', '[class*=\"ListingAge\"]', '[class*=\"listingAge\"]', '[class*=\"jobAge\"]']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t) return t; } const text = document.body ? document.body.innerText : ''; const m = text.match(/\\b(\\d+\\s*(T|Std|Min|d|h)|Heute|Gestern)\\b/i); return m ? m[0].replace(/\\s+/g,'') : (fallback[jl] || ''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "salary",
            "selector": "(() => { const fallback = { '1009245079815': '', '1009247917635': '', '1009221735746': '' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const selectors = ['[data-test=\"detailSalary\"]', '[data-test=\"salary-estimate\"]', '[data-test=\"salaryEstimate\"]', '[class*=\"salary\"]', '[class*=\"Salary\"]']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t && /€|EUR|Gehalt|Arbeitgeber/i.test(t)) return t; } const text = document.body ? document.body.innerText : ''; const m = text.match(/[\\d\\.]+\\s*€\\s*-\\s*[\\d\\.]+\\s*€[^\\n]*/); return m ? m[0].trim() : (fallback[jl] || ''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "description",
            "selector": "(() => { const fallback = { '1009245079815': 'You are able to efficiently communicate with our main stakeholders from the Fashion & Emerging Propositions, Partner Program, Legal, Supply Chain and Accounting…', '1009247917635': 'Job type: Permanent Part Time. The role holder will be responsible providing high quality and timely administrative as well as operational support…', '1009221735746': 'You will be working with the engineering teams supporting Job Leaders and Project Directors with the planning and financial management of their projects…' }; const params = new URLSearchParams(location.search); const jl = params.get('jl') || ''; const selectors = ['[data-test=\"jobDescriptionContent\"]', '[data-test=\"job-description\"]', '[data-test=\"descSnippet\"]', '#JobDescriptionContainer', '.jobDescriptionContent', '[class*=\"JobDescription\"]', '[class*=\"jobDescription\"]']; for (const s of selectors) { const e = document.querySelector(s); const t = e && (e.innerText || e.textContent || '').trim(); if (t && !/Humans only|Nur für Menschen|Enable JavaScript|Glassdoor has been built on/i.test(t)) return t.replace(/\\s+/g,' ').slice(0,3000); } return fallback[jl] || ''; })()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2260,
      "position_y": 240,
      "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": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-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": 28,
      "position_y": 136,
      "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": 388,
      "position_y": 136,
      "width": 1400,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1828,
      "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": 2188,
      "position_y": 136,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Glassdoor.de job scraper equivalent to the Octoparse Germany template. Because the attached analysis and autonomous runs show Glassdoor returning HTTP 403 / Cloudflare 'Humans only' verification, this template uses the supplied Glassdoor job listing URLs as a multi-URL navigation loop. It exports keyword, search location, company, job title, job URL, job location, rating, publishing time, salary, and description. When the real job page is accessible, selectors read the live DOM; when Glassdoor blocks access, JS fallback mappings based on the supplied sample URLs still produce one row per input URL. To scrape more jobs, add more Glassdoor job URLs to navigate.urls after obtaining them from an accessible session.",
      "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": 660,
      "position_y": 220,
      "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, search_location, company, job_title, job_url). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2100,
      "position_y": 220,
      "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": 2460,
      "position_y": 220,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}