CCCPaste

empleos it argentina

import requests
from bs4 import BeautifulSoup
import json
import re

# 1. Definir la URL de la página web
URL = "https://www.empleosit.com.ar/search-results-jobs/?searchId=1761583867.6528&action=search&page=1&listings_per_page=100&view=list"

def scrape_empleos(url):
    """
    Descarga el contenido de la URL, extrae los datos de los empleos
    (nombre, descripción, fecha, empresa) y los devuelve en formato JSON.
    """
    # Intentar obtener el contenido de la página
    try:
        # Usar headers para simular un navegador y evitar ser bloqueado
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # Lanza una excepción para errores HTTP (4xx o 5xx)
        html_doc = response.text
    except requests.exceptions.RequestException as e:
        return json.dumps({"error": f"Error al acceder a la URL: {e}"}, indent=4, ensure_ascii=False)

    # 2. Parsear el HTML con BeautifulSoup
    soup = BeautifulSoup(html_doc, 'html.parser')
    jobs_data = []

    # Identificar el contenedor de cada oferta de empleo
    # Las ofertas están en divs con clases 'evenrow' u 'oddrow' dentro de 'searchResultsJobs'
    job_listings = soup.select('.searchResultsJobs > div.evenrow, .searchResultsJobs > div.oddrow')

    if not job_listings:
         return json.dumps({"mensaje": "No se encontraron ofertas de empleo con la estructura esperada."}, indent=4, ensure_ascii=False)


    # 3. Iterar sobre cada oferta y extraer los datos
    for job in job_listings:
        # Extraer el Nombre del Puesto (Título)
        title_tag = job.select_one('.listing-title a')
        name = title_tag.get_text(strip=True) if title_tag else "N/A"

        # Extraer la Descripción (resumen)
        description_tag = job.select_one('.show-brief')
        if description_tag:
            # Eliminar la etiqueta  para dejar solo la descripción
            strong_tag = description_tag.find('strong')
            if strong_tag:
                strong_tag.decompose()
            # Limpiar el texto: quitar espacios extra y el posible ":" inicial
            description = description_tag.get_text(strip=True).replace(':', '', 1).strip()
        else:
            description = "N/A"
            
        # Extraer la Fecha
        # Se encuentra en 
        date_tag = job.select_one('.captions-field.posted-ico')
        date = date_tag.get_text(strip=True) if date_tag else "N/A"
        
        # Extraer la Empresa
        # Se encuentra en  dentro de 
        company_tag = job.select_one('.captions-field.company-ico a')
        company = company_tag.get_text(strip=True) if company_tag else "N/A"
        
        # Agregar los datos al resultado final
        jobs_data.append({
            "nombre": name,
            "descripcion": description,
            "fecha": date,
            "empresa": company
        })

    # 4. Convertir la lista de diccionarios a formato JSON
    return json.dumps(jobs_data, indent=4, ensure_ascii=False)

# Ejecutar el script
json_output = scrape_empleos(URL)

print(json_output)