File size: 6,509 Bytes
b92ae70
31c2313
b92ae70
31c2313
b92ae70
31c2313
b92ae70
 
 
 
 
 
31c2313
 
b92ae70
 
 
31c2313
b92ae70
d5964cb
 
 
 
 
 
 
 
 
31c2313
b92ae70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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)