{
  "version": "1.0.0",
  "exported_at": "2026-06-02T00:00:00.000Z",
  "project": {
    "name": "Universia Job Details Scraper",
    "description": "UScraper equivalent of the Octoparse Universia Job Details Scraper. Targets Universia Argentina jobs for the sample input Ingeniero + Buenos Aires and exports título, empresa, localidad, publicidad, modalidad, contrato, remuneración, jornada, horario, descripción, información, requisito and URL. Live testing showed the results page exposes the available job links on one loaded page and no enabled next-page control was present. The template opens each same-origin detail URL in a hidden iframe, waits for rendering, parses JSON-LD and rendered detail text, creates hidden extraction rows, and exports them with fileMode=create. Field mapping was refined after testing: employmentType is mapped to jornada, generic cookie/footer text is filtered, and modalidad is inferred only from explicit labels, URL hints, or description text to avoid false 'en remoto' values.",
    "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": 220,
      "config": {
        "url": "https://www.universia.net/ar/empleo?keyword=Ingeniero&location=buenos%20aires",
        "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": 456,
      "position_y": 220,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "selector": "#onetrust-accept-btn-handler, button[id*='accept'][class*='cookie'], button[class*='accept'][class*='cookie']"
      }
    },
    {
      "block_id": "click-1",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 1128,
      "position_y": 520,
      "config": {
        "selector": "#onetrust-accept-btn-handler, button[id*='accept'][class*='cookie'], button[class*='accept'][class*='cookie']",
        "timeout": 8
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1464,
      "position_y": 520,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "selector": "a[href*='/ar/empleo/'][href$='.html'], a[href*='/empleo/'][href$='.html']",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 2136,
      "position_y": 520,
      "config": {
        "jsCode": "return (async()=>{const rootId='uscraper-universia-results';document.getElementById(rootId)?.remove();document.querySelectorAll('.uscraper-universia-frame').forEach(x=>x.remove());const clean=s=>(s||'').toString().replace(/<script[\\s\\S]*?<\\/script>/gi,' ').replace(/<style[\\s\\S]*?<\\/style>/gi,' ').replace(/<[^>]*>/g,' ').replace(/&nbsp;/g,' ').replace(/\\u00a0/g,' ').replace(/[ \\t]+/g,' ').replace(/\\n[ \\t]+/g,'\\n').trim();const flat=s=>clean(s).replace(/\\s+/g,' ').trim();const bad=s=>/Pol[ií]tica de cookies|Configurar cookies|Rechazar todas las cookies|Aceptar todas las cookies|Consigue el empleo de tus sueños|Este sitio utiliza cookies|consulta nuestra/i.test(flat(s));const good=s=>{s=flat(s);return s&&!bad(s)?s:''};const slug=u=>good(decodeURIComponent((u.split('/').pop()||'').replace(/\\.html.*/,'').replace(/-/g,' ')));const q=(doc,sel)=>{try{return good(doc.querySelector(sel)?.textContent||'')}catch(e){return ''}};const qa=(doc,sel)=>{try{return Array.from(doc.querySelectorAll(sel))}catch(e){return []}};const attr=(doc,sel,a)=>{try{return good(doc.querySelector(sel)?.getAttribute(a)||'')}catch(e){return ''}};const lines=t=>clean(t).split(/\\n+/).map(good).filter(Boolean).filter(x=>!/^postular|^aplicar|^guardar|^compartir/i.test(x));const after=(raw,labs,max=500)=>{const t=clean(raw);const low=t.toLowerCase();for(const lab of labs){const i=low.indexOf(lab.toLowerCase());if(i>=0){let p=t.slice(i+lab.length,i+lab.length+max);p=p.split(/\\n\\s*\\n|Título|Empresa|Localidad|Modalidad|Contrato|Remuneración|Jornada|Horario|Descripción|Información|Requisito|Requisitos|Competencias/i)[0]||p;p=good(p.replace(/^[:\\-\\s]+/,''));if(p)return p}}return ''};const re=(t,r)=>good((clean(t).match(r)||[''])[0]);const mapJornada=v=>{const s=String(v||'').toUpperCase();if(s.includes('FULL_TIME'))return 'Jornada completa';if(s.includes('PART_TIME'))return 'Jornada parcial';if(s.includes('TEMPORARY'))return '';return good(v)};const modalityFrom=(url,raw,desc)=>{const u=url.toLowerCase();if(/hybrid|hibrid/.test(u))return 'Híbrido (remoto y presencial)';if(/remote|remoto/.test(u))return 'En remoto';if(/presencial/.test(u))return 'Presencial';let m=after(raw,['Modalidad'],140)||after(desc,['Modalidad'],140);if(m)return m;return re(desc,/Híbrido \\(remoto y presencial\\)|Hibrido \\(remoto y presencial\\)|100% presencial|Presencial|En remoto|Remoto|Híbrido|Hibrido/i)};const findJob=o=>{if(!o||typeof o!=='object')return null;if(Array.isArray(o)){for(const x of o){const f=findJob(x);if(f)return f}return null}const typ=o['@type'];if((Array.isArray(typ)&&typ.join(' ').toLowerCase().includes('jobposting'))||String(typ||'').toLowerCase()==='jobposting')return o;for(const v of Object.values(o)){const f=findJob(v);if(f)return f}return null};const jsonJob=doc=>{for(const s of qa(doc,'script[type*=ld],script[type=\"application/json\"]')){try{const f=findJob(JSON.parse(s.textContent));if(f)return f}catch(e){}}return {}};const org=j=>good((j.hiringOrganization&&(j.hiringOrganization.name||j.hiringOrganization.legalName))||'');const loc=j=>{const l=Array.isArray(j.jobLocation)?j.jobLocation[0]:j.jobLocation;const a=l&&l.address;return good([a&&a.addressLocality,a&&a.addressRegion,a&&a.addressCountry].filter(Boolean).join(', '))};const sal=j=>{try{if(!j.baseSalary)return '';if(typeof j.baseSalary==='string')return good(j.baseSalary);const v=j.baseSalary.value||j.baseSalary;return good([v.minValue||v.value||'',v.maxValue?'- '+v.maxValue:'',j.baseSalary.currency||v.currency||'',v.unitText||''].filter(Boolean).join(' '))}catch(e){return ''}};const bestCard=a=>{let best=a,bt='';for(let e=a;e&&e!==document.body;e=e.parentElement){const t=clean(e.innerText||'');if(t.length>bt.length&&t.length<5000){best=e;bt=t}if(t.length>250)break}return {el:best,text:bt}};const anchors=Array.from(document.querySelectorAll('a')).filter(a=>/\\/ar\\/empleo\\/.*\\.html(?:$|[?#])/i.test(a.href)||/\\/empleo\\/.*\\.html(?:$|[?#])/i.test(a.href));const seen=new Set();const items=[];for(const a of anchors){if(seen.has(a.href))continue;seen.add(a.href);const c=bestCard(a);items.push({url:a.href,anchor:good(a.textContent||a.getAttribute('aria-label')||a.getAttribute('title')||''),card:c.text})}async function frameDoc(u){return await new Promise(res=>{const f=document.createElement('iframe');f.className='uscraper-universia-frame';f.style.cssText='position:absolute;left:-99999px;top:-99999px;width:1200px;height:1800px;visibility:hidden;';let done=false;const finish=()=>{if(done)return;done=true;setTimeout(()=>{let d=null;try{d=f.contentDocument||f.contentWindow.document}catch(e){}res({doc:d,frame:f})},3500)};f.onload=finish;setTimeout(finish,12000);f.src=u;document.body.appendChild(f)})}function parseDoc(doc,u,card,anchor){const raw=doc&&doc.body?doc.body.innerText:'';const all=clean(raw);const lns=lines(raw);const j=doc?jsonJob(doc):{};let descripcion=good(j.description)||q(doc,'[data-testid*=description], [class*=description], [class*=Description], [class*=descripcion], [class*=Descripcion], main article, main p')||attr(doc,'meta[name=\"description\"]','content');let titulo=good(j.title)||q(doc,'h1')||q(doc,'h2')||attr(doc,'meta[property=\"og:title\"]','content')||anchor||slug(u);let empresa=org(j)||q(doc,'[data-testid*=company], [class*=company], [class*=Company], [class*=empresa], [class*=Empresa]')||after(raw,['Empresa'],180);let localidad=loc(j)||after(raw,['Localidad','Ubicación','Lugar'],220)||re(all,/(Cdad\\. Autónoma de Buenos Aires|Ciudad Autónoma de Buenos Aires|Buenos Aires|CABA|Argentina)(?:,\\s*Argentina)?/i);let publicidad=good(j.datePosted)||q(doc,'time')||after(raw,['Publicado','Fecha de publicación','Publicidad'],120)||re(all,/\\b\\d+\\s+d[ií]as?\\b|\\b\\d+\\s+horas?\\b/i);let modalidad=modalityFrom(u,raw,descripcion);let contrato=after(raw,['Contrato','Tipo de contrato'],180)||after(descripcion,['Contrato','Tipo de contrato'],180)||re(descripcion,/Contrato indefinido|Contrato temporal|Indefinido|Temporal|Prácticas|Pasant[ií]a|Freelance/i);let remuneracion=sal(j)||after(raw,['Remuneración','Salario','Sueldo'],180)||re(all,/Sin especificar|[$€]\\s?[\\d.,]+[^\\n,;]*|[\\d.,]+\\s?[$€][^\\n,;]*/i);let jornada=after(raw,['Jornada','Tipo de jornada'],160)||after(descripcion,['Jornada','Tipo de jornada'],160)||mapJornada(j.employmentType)||re(descripcion,/Jornada completa|Jornada parcial|Tiempo completo|Media jornada|20hs semanales|20 hs semanales/i);let horario=after(raw,['Horario'],220)||after(descripcion,['Horario'],220)||re(descripcion,/(Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Domingo|lunes|martes|miércoles|miercoles|jueves|viernes)[^\\n\\.]{0,140}/i);let informacion=after(raw,['Experiencia','Nivel de estudios','Idiomas'],600)||after(descripcion,['Experiencia','Nivel de estudios','Idiomas','Condiciones de la pasantía','Condiciones'],600);let requisito=good(j.qualifications||j.skills||j.responsibilities)||after(raw,['Requisitos','Requisito','Conocimientos requeridos','Competencias'],800)||after(descripcion,['Requisitos','Requisito','Conocimientos requeridos','Competencias'],800);if((!empresa||!localidad||!modalidad||!jornada)&&card){const c=clean(card);const cl=lines(c);titulo=titulo||anchor||cl[0]||slug(u);empresa=empresa||cl.find(x=>x!==titulo&&!/d[ií]as|h[ií]brido|remoto|presencial|contrato|jornada|sin especificar/i.test(x))||'';localidad=localidad||re(c,/(Cdad\\. Autónoma de Buenos Aires|Ciudad Autónoma de Buenos Aires|Buenos Aires|CABA|Argentina)(?:,\\s*Argentina)?/i);publicidad=publicidad||re(c,/\\b\\d+\\s+d[ií]as?\\b|\\b\\d+\\s+horas?\\b/i);modalidad=modalidad||modalityFrom(u,c,descripcion);contrato=contrato||re(c,/Contrato indefinido|Contrato temporal|Indefinido|Temporal|Prácticas|Pasant[ií]a|Freelance/i);remuneracion=remuneracion||re(c,/Sin especificar|[$€]\\s?[\\d.,]+[^\\n,;]*|[\\d.,]+\\s?[$€][^\\n,;]*/i);jornada=jornada||re(c,/Jornada completa|Jornada parcial|Tiempo completo|Media jornada/i);horario=horario||re(c,/(Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Domingo)[^\\n]{0,140}/i)}return {titulo,empresa,localidad,publicidad,modalidad,contrato,remuneracion,jornada,horario,descripcion,informacion,requisito,url:u}}const out=[];for(const it of items.slice(0,80)){const r=await frameDoc(it.url);out.push(parseDoc(r.doc,it.url,it.card,it.anchor));try{r.frame.remove()}catch(e){}}const root=document.createElement('div');root.id=rootId;root.style.display='none';for(const r of out){const d=document.createElement('div');d.className='uscraper-job-detail-row';for(const k of Object.keys(r)){d.setAttribute('data-'+k,good(r[k]).slice(0,12000))}root.appendChild(d)}document.body.appendChild(root);return out.length})();",
        "waitForCompletion": true,
        "timeout": 360
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 2472,
      "position_y": 520,
      "config": {
        "selector": ".uscraper-job-detail-row",
        "timeout": 360,
        "visible": false
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2808,
      "position_y": 520,
      "config": {
        "rowSelector": ".uscraper-job-detail-row",
        "fileName": "universia-detalles-de-empleo-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "create",
        "columns": [
          {
            "name": "titulo",
            "selector": "",
            "attribute": "data-titulo"
          },
          {
            "name": "empresa",
            "selector": "",
            "attribute": "data-empresa"
          },
          {
            "name": "localidad",
            "selector": "",
            "attribute": "data-localidad"
          },
          {
            "name": "publicidad",
            "selector": "",
            "attribute": "data-publicidad"
          },
          {
            "name": "modalidad",
            "selector": "",
            "attribute": "data-modalidad"
          },
          {
            "name": "contrato",
            "selector": "",
            "attribute": "data-contrato"
          },
          {
            "name": "remuneracion",
            "selector": "",
            "attribute": "data-remuneracion"
          },
          {
            "name": "jornada",
            "selector": "",
            "attribute": "data-jornada"
          },
          {
            "name": "horario",
            "selector": "",
            "attribute": "data-horario"
          },
          {
            "name": "descripcion",
            "selector": "",
            "attribute": "data-descripcion"
          },
          {
            "name": "informacion",
            "selector": "",
            "attribute": "data-informacion"
          },
          {
            "name": "requisito",
            "selector": "",
            "attribute": "data-requisito"
          },
          {
            "name": "url",
            "selector": "",
            "attribute": "data-url"
          }
        ]
      }
    },
    {
      "block_id": "end-1",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 3144,
      "position_y": 520,
      "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": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "click-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-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": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-2",
      "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": "end-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 116,
      "width": 2672,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1",
          "wait-for-element-2"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 720,
      "position_y": 116,
      "width": 656,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1",
          "click-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 2064,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2736,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-control",
      "element_type": "group",
      "title": "Control Flow",
      "color": "#8d8d8d",
      "position_x": 3072,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "UScraper equivalent of the Octoparse Universia Job Details Scraper. Targets Universia Argentina jobs for the sample input Ingeniero + Buenos Aires and exports título, empresa, localidad, publicidad, modalidad, contrato, remuneración, jornada, horario, descripción, información, requisito and URL. Live testing showed the results page exposes the available job links on one loaded page and no enabled next-page control was present. The template opens each same-origin detail URL in a hidden iframe, waits for rendering, parses JSON-LD and rendered detail text, creates hidden extraction rows, and exports them with fileMode=create. Field mapping was refined after testing: employmentType is mapped to jornada, generic cookie/footer text is filtered, and modalidad is inferred only from explicit labels, URL hints, or description text to avoid false 'en remoto' values.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `#onetrust-accept-btn-handler, button[id*='accept'][class*='cookie'], button[class*='accept'][class*='cookie']`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 992,
      "position_y": 200,
      "width": 340,
      "height": 166,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `return (async()=>{const rootId='uscraper-universia-results';document.getElementById(rootId)?.remove(...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 2336,
      "position_y": 500,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Extracts rows matching `.uscraper-job-detail-row`. Confirm row count > 0 before running at scale.",
      "color": "#ee5396",
      "position_x": 3008,
      "position_y": 500,
      "width": 340,
      "height": 112,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    }
  ]
}