RSU / app.py
carlosdimare's picture
Update app.py
d5964cb verified
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)