import requests from bs4 import BeautifulSoup from transformers import pipeline import pandas as pd from datetime import datetime, timedelta # Configuración inicial SITIOS = { "Mundo Gremial": "https://www.mundogremial.com.ar", "ANRed": "https://www.anred.org", "Prensa Obrera": "https://www.prensaobrera.com", "La Izquierda Diario": "https://www.laizquierdadiario.com" } # Fecha actual y límite para noticias recientes (últimos 7 días) FECHA_ACTUAL = datetime(2025, 1, 28) # Hoy es 28 de enero de 2025 LIMITE_RECIENTE = FECHA_ACTUAL - timedelta(days=7) # Cargar modelo de IA para análisis de texto try: analizador = pipeline("text-classification", model="deepseek-ai/r1-zero") except OSError as e: print(f"Error al cargar el modelo: {e}") # Fallback to a default model if the specified one fails analizador = pipeline("text-classification", model="distilbert-base-uncased-finetuned-sst-2-english") # Example fallback model # Cargar modelo de IA para generación de texto modelo_generacion = pipeline("text-generation", model="deepseek-ai/DeepSeek-R1", trust_remote_code=True) # Función para hacer scraping en un sitio def scrapear_sitio(url): try: response = requests.get(url) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") return soup except Exception as e: print(f"Error al scrapear {url}: {e}") return None # Función para extraer noticias de Mundo Gremial def extraer_mundo_gremial(soup): noticias = [] for articulo in soup.find_all("article", class_="post"): titulo = articulo.find("h2").text.strip() enlace = articulo.find("a")["href"] contenido = articulo.find("div", class_="entry-content").text.strip() fecha_texto = articulo.find("time")["datetime"] # Extraer fecha fecha = datetime.strptime(fecha_texto, "%Y-%m-%d") # Convertir a objeto datetime noticias.append({"titulo": titulo, "contenido": contenido, "enlace": enlace, "fecha": fecha}) return noticias # Función para extraer noticias de ANRed def extraer_anred(soup): noticias = [] for articulo in soup.find_all("article"): titulo = articulo.find("h2").text.strip() enlace = articulo.find("a")["href"] contenido = articulo.find("div", class_="entry-content").text.strip() fecha_texto = articulo.find("time")["datetime"] # Extraer fecha fecha = datetime.strptime(fecha_texto, "%Y-%m-%d") # Convertir a objeto datetime noticias.append({"titulo": titulo, "contenido": contenido, "enlace": enlace, "fecha": fecha}) return noticias # Función para extraer noticias de Prensa Obrera def extraer_prensa_obrera(soup): noticias = [] for articulo in soup.find_all("article"): titulo = articulo.find("h2").text.strip() enlace = articulo.find("a")["href"] contenido = articulo.find("div", class_="entry-content").text.strip() fecha_texto = articulo.find("time")["datetime"] # Extraer fecha fecha = datetime.strptime(fecha_texto, "%Y-%m-%d") # Convertir a objeto datetime noticias.append({"titulo": titulo, "contenido": contenido, "enlace": enlace, "fecha": fecha}) return noticias # Función para extraer noticias de La Izquierda Diario def extraer_la_izquierda_diario(soup): noticias = [] for articulo in soup.find_all("article"): titulo = articulo.find("h2").text.strip() enlace = articulo.find("a")["href"] contenido = articulo.find("div", class_="entry-content").text.strip() fecha_texto = articulo.find("time")["datetime"] # Extraer fecha fecha = datetime.strptime(fecha_texto, "%Y-%m-%d") # Convertir a objeto datetime noticias.append({"titulo": titulo, "contenido": contenido, "enlace": enlace, "fecha": fecha}) return noticias # Función para clasificar noticias def clasificar_noticia(texto): try: resultado = analizador(texto) return resultado[0]["label"] except Exception as e: print(f"Error al clasificar texto: {e}") return "Desconocido" # Función para detectar conflictos laborales def es_conflicto_laboral(texto): palabras_clave = ["huelga", "paro", "despido", "salario", "protesta", "trabajadores", "sindicato"] return any(palabra in texto.lower() for palabra in palabras_clave) # Función para detectar protestas próximas def es_protesta_proxima(texto): palabras_clave = ["marcha", "manifestación", "concentración", "asamblea", "corte", "huelga"] return any(palabra in texto.lower() for palabra in palabras_clave) # Procesar todos los sitios conflictos_laborales = [] agenda_protestas = [] for nombre, url in SITIOS.items(): print(f"Scrapeando {nombre}...") soup = scrapear_sitio(url) if soup: if nombre == "Mundo Gremial": noticias = extraer_mundo_gremial(soup) elif nombre == "ANRed": noticias = extraer_anred(soup) elif nombre == "Prensa Obrera": noticias = extraer_prensa_obrera(soup) elif nombre == "La Izquierda Diario": noticias = extraer_la_izquierda_diario(soup) for noticia in noticias: # Filtrar noticias recientes (últimos 7 días) if noticia["fecha"] >= LIMITE_RECIENTE: if es_conflicto_laboral(noticia["contenido"]): conflictos_laborales.append({ "Sitio": nombre, "Título": noticia["titulo"], "Enlace": noticia["enlace"], "Fecha": noticia["fecha"].strftime("%Y-%m-%d") }) if es_protesta_proxima(noticia["contenido"]): agenda_protestas.append({ "Sitio": nombre, "Título": noticia["titulo"], "Enlace": noticia["enlace"], "Fecha": noticia["fecha"].strftime("%Y-%m-%d") }) # Crear tablas con Pandas df_conflictos = pd.DataFrame(conflictos_laborales) df_protestas = pd.DataFrame(agenda_protestas) # Guardar tablas en archivos CSV df_conflictos.to_csv("conflictos_laborales.csv", index=False) df_protestas.to_csv("agenda_protestas.csv", index=False) print("Tablas generadas:") print("\nConflictos Laborales en Desarrollo (últimos 7 días):") print(df_conflictos) print("\nAgenda de Protestas Próximas (últimos 7 días):") print(df_protestas)