{
  "version": "1.0.0",
  "exported_at": "2026-06-03T00:00:00.000Z",
  "project": {
    "name": "LinkedIn EspaÃol Empleo Scraperï¼ˆrequiere Loginï¼",
    "description": "Best-effort LinkedIn España jobs scraper equivalent to the Octoparse LinkedIn Español Empleo template. The normal LinkedIn Jobs search URL redirected to an authwall during testing, so this template uses LinkedIn's public guest job-posting fragment URLs with Spain geoId=105646813 and known offset pagination. It extracts job-card data across multiple result offsets and appends all pages to one CSV. LinkedIn may still require login, show CAPTCHA/checkpoint pages, ignore/alter location parameters, or rate-limit requests.",
    "color": "bg-[#0a66c2]",
    "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": 220,
      "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": 220,
      "config": {
        "urls": [
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=0",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=25",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=50",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=75",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=100",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=125",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=150",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=175",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=200",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=&location=Spain&geoId=105646813&start=225"
        ],
        "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": 220,
      "config": {
        "timeout": 45,
        "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": 220,
      "config": {
        "selector": ".base-search-card, .job-search-card",
        "timeout": 45,
        "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": 220,
      "config": {
        "rowSelector": ".base-search-card, .job-search-card",
        "fileName": "linkedin_espana_empleo_scraper_requiere_login.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "job_title",
            "selector": "h3.base-search-card__title, .base-search-card__title",
            "attribute": "text"
          },
          {
            "name": "company",
            "selector": "h4.base-search-card__subtitle, .base-search-card__subtitle, .base-search-card__subtitle a",
            "attribute": "text"
          },
          {
            "name": "location",
            "selector": ".job-search-card__location",
            "attribute": "text"
          },
          {
            "name": "job_url",
            "selector": "a.base-card__full-link, a[href*=\"/jobs/view/\"]",
            "attribute": "href"
          },
          {
            "name": "job_id",
            "selector": "(() => { const href = ROW.querySelector('a.base-card__full-link, a[href*=\"/jobs/view/\"]')?.href || ''; const m = href.match(/-(\\d+)(?:\\?|$)/) || href.match(/currentJobId=(\\d+)/) || href.match(/\\/jobs\\/view\\/(?:[^/?#-]+-)*(\\d+)/); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "posted_date",
            "selector": "time, .job-search-card__listdate, .job-search-card__listdate--new",
            "attribute": "text"
          },
          {
            "name": "posted_datetime",
            "selector": "time",
            "attribute": "datetime"
          },
          {
            "name": "salary",
            "selector": ".job-search-card__salary-info",
            "attribute": "text"
          },
          {
            "name": "image_url",
            "selector": "img",
            "attribute": "src"
          },
          {
            "name": "image_alt",
            "selector": "img",
            "attribute": "alt"
          },
          {
            "name": "easy_apply",
            "selector": "/solicitud sencilla|easy apply/i.test(ROW.innerText || '') ? 'true' : 'false'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "promoted",
            "selector": "/promocionado|promoted/i.test(ROW.innerText || '') ? 'true' : 'false'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "card_text",
            "selector": "",
            "attribute": "text"
          }
        ]
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1920,
      "position_y": 220,
      "config": {
        "duration": 2,
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2280,
      "position_y": 220,
      "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": "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-entry",
      "element_type": "group",
      "title": "Entry & Setup",
      "color": "#4589ff",
      "position_x": 48,
      "position_y": 116,
      "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": 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": 1488,
      "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": 2208,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort LinkedIn España jobs scraper equivalent to the Octoparse LinkedIn Español Empleo template. The normal LinkedIn Jobs search URL redirected to an authwall during testing, so this template uses LinkedIn's public guest job-posting fragment URLs with Spain geoId=105646813 and known offset pagination. It extracts job-card data across multiple result offsets and appends all pages to one CSV. LinkedIn may still require login, show CAPTCHA/checkpoint pages, ignore/alter location parameters, or rate-limit requests.",
      "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 10 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 680,
      "position_y": 200,
      "width": 332,
      "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 (job_id, easy_apply, promoted). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "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": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}