
    U+i/                     p    d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dl	Z	de
de
fdZ G d	 d
      Zy)    N)BeautifulSoup)datetime)	NewsModel)Sessiontitlereturnc                     | sydj                  t        |       j                         j                         j	                               S )uK   Unifica título para detectar duplicados (minúsculas, espacios repetidos).  )joinstrstriplowersplit)r   s    O/var/www/pie360backend.cl/public_html/app/backend/classes/news_scraper_class.py_normalize_news_titler   	   s6    88CJ$$&,,.44677    c                   *    e Zd ZdefdZd Zd Zd Zy)NewsScraperClassdbc                      || _         d| _        y )Nz'https://especial.mineduc.cl/destacados/)r   url)selfr   s     r   __init__zNewsScraperClass.__init__   s    <r   c                    	 ddddddddd	d
ddd}|j                         j                         }t        |d         }|d   j                  dd      }t        |d   j                  dd            }|j	                  |d      }t        |||      }|S # t        $ r8}	t        d| dt        |	              t        j                         cY d}	~	S d}	~	ww xY w)ut   
        Convierte fecha en español a datetime
        Ejemplo: "Martes 25 de Noviembre, 2025" -> datetime
                                	   
         )enerofebreromarzoabrilmayojuniojulioagosto
septiembreoctubre	noviembre	diciembre,r
   zError parseando fecha 'z': N)
r   r   intreplacegetr   	Exceptionprintr   now)
r   date_strmesespartsdiames_straniomesresultes
             r   parse_spanish_datez#NewsScraperClass.parse_spanish_date   s    
	" q1qAQBRbE NN$**,EeAh-CAh&&sB/GuQx''R01D))GQ'CdC-FM 	"+H:SQAB<<>!	"s   BB 	C-CCCc           	         	 t        j                  ||d      }|j                          t        |j                  d      }d}|j                  dd      }|sD|j                  d      }|D ].  }|j                  d	      }	|	s|	d
vst        |	      dkD  s,|} n |s(|j                  dd      xs |j                  dd      }|r|j                  d	      }t        d| d       |rt        |      dk  s|d
v rt        d       y|j                  dd      xs& |j                  d      xs |j                  dd      }
d}|
rS|
j                  d      }dj                  |D cg c]'  }|j                  d	      s|j                  d	      ) c}      }|rt        |      dk  ryt        |      dkD  r|dd dz   n|}d}|j                  dd      xs |j                  dd      }|s|
r|
j                  d      }|s$|j                  d      }|r|j                  d      }|s|j                  d      }|ri|j                  dd      xs& |j                  dd      xs |j                  d d      }|r-|j                  d!      s|j                  d"      rd#| }nd$| }|sy||||d%S c c}w # t        $ r$}t        d&| d't        |              Y d}~yd}~ww xY w)(zG
        Obtiene el detalle completo de una noticia individual
        r%   headerstimeouthtml.parserr
   h1zentry-titleclass_Tr   )u   Ministerio de Educaciónu   Educación Especialh2z
post-titleu   Título extraído: ''u0   Título inválido o genérico, omitiendo noticiaNdivzentry-contentarticlecontentpz

2         ...imgzattachment-post-thumbnailzwp-post-imagesrczdata-srczdata-lazy-srchttp/zhttps://especial.mineduc.clzhttps://especial.mineduc.cl/)r   short_descriptiondescriptionimagezError obteniendo detalle de z: )requestsr7   raise_for_statusr   rR   findfind_allget_textlenr9   r   
startswithr8   r   )r   r   rG   responsesoupr   	title_tagall_h1rJ   h1_textrR   r]   
paragraphsrS   r\   	image_urlimg_tagrQ   rC   s                      r   get_news_detailz NewsScraperClass.get_news_detail2   s    \	||C"EH%%' !1!1=AD E 		$}	=I t,  B kkk5G72e#ejmnujvy{j{$&	  IId<I@iDIId[hIDi	!***6(q12 CJOu8k/kHJ iioi>|$))IBV|Z^ZcZcdir{ZcZ|G K$--c2
$kk:*paYZYcYcjnYcYo1::D:+A*pq #k"2R"7 >A=MPS=SDS 1E 9Yd I ii.IiJvdiiX]fuiNvG w!,,u- ))I.%ll51G ))E*#KKr2ugkk*b6QuU\U`U`aprtUu	Y%9%9&%A ++C0&A)$M	&B9+$N	  %6*"	 U +q`  	0RAx@A	sW   A?J5 J5 J5 A1J5 AJ5 'J0?J0J5 +C=J5 )J5 0J5 5	K">KK"c                 `	   	 ddi}t        j                  | j                  |d      }|j                          t	        |j
                  d      }|j                  dd      }d	}d	}t        d
t        |              |D ]  }	 |j                  dd      }d}	|D ]I  }
|
j                  dd      }|sd|v sd|
j                  dg       vs2d|
j                  dg       vsG|}	 n |	sk|j                  dd      }|r|j                  d      nd}|r| j                  |      nd}t        d|	        | j                  |	|      }|r|d   st        d|	        |d   }|d   }|d   }|d   }t        d|dd  d        t        |      }| j                  j                  t               j#                  t         j$                  |k(  t         j&                  d	k(        j)                         }|sv|rt| j                  j                  t               j#                  t         j&                  d	k(        j+                         }|D ]"  }t        |j$                  xs d      |k(  s |} n |rt        d!|dd  d        |d"z  }t        d#| d$|        t!        d	|||||r|nt-        j.                         t-        j.                         %      }| j                  j1                  |       | j                  j3                          |d"z  }t        d&|dd  d         t        d(| d)       	 | j                  j9                          t        d*       | j                  j                  t               j#                  t         j&                  d	k(        j;                         }t        d+|        d-d.| d/| d0||d1S # t4        $ r"}t        d't7        |              Y d}~`d}~ww xY w# t4        $ r7}t        d,t7        |              | j                  j=                           d}~ww xY w# t         j>                  $ r5}| j                  j=                          d2d3t7        |       d4cY d}~S d}~wt4        $ r5}| j                  j=                          d2d5t7        |       d4cY d}~S d}~ww xY w)6z\
        Scraper para obtener noticias del MINEDUC y guardarlas en la base de datos
        z
User-AgentzsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36r%   rF   rI   rP   boxrK   r   zTotal de noticias encontradas: aT)hrefNrr   r
   zespecial.mineduc.clthumbclassvermasspanfecharM   zProcesando noticia: r   zNo se pudo obtener detalle de: r\   r]   r^   u   Título encontrado: rT   rW   zNoticia ya existe: r   u   Creando noticia con título: 'z' - Fecha: )deleted_status_idr   r\   r]   r^   
added_dateupdated_dateu   Noticia agregada a la sesión: z%Error procesando noticia individual: zIntentando guardar z  noticias en la base de datos...zCommit exitoso!u0   Total de noticias en la BD después del commit: zError en commit: successzScraping completado. z noticias guardadas, z omitidas (duplicadas))statusmessagesavedskippederroru"   Error al realizar petición HTTP: )r|   r}   zError en el scraping: ) r_   r7   r   r`   r   rR   rb   r9   rd   ra   rc   rD   rn   r   r   queryr   filterr   rx   firstallr   r:   addflushr8   r   commitcountrollbackRequestException)r   rG   rf   rg   
news_boxessaved_countskipped_countrp   linksr   linkrr   	fecha_tag	fecha_str	news_datenews_detailr   r\   r]   rl   normexisting_news
candidatesrownew_newsrC   r   s                              r   scrape_newszNewsScraperClass.scrape_news   s   F	   TG  ||DHHgrJH%%' !!1!1=AD uU;JKM3C
O3DEF! POLL4L8EC % "#xx3$9T$AgUYU]U]^egiUjFjow  @D  @H  @H  IP  RT  @U  pU"&C!"   !$ @IBK	 2 2 2 >QUIFO 7 7	 BUYI067 #'"6"6sG"DK&k'.B ?uEF '0E(34G(H%"-m"<K +G 4I0sC@A
 17D$(GGMM)$<$C$C!50!33q8% eg " )T GGMM)4#VI$?$?1$DE SU #
 $. &C4SYY_"EM03 %&
 % 3E#2J<sCD%*  :5'YKXY(*+#*;$/'099x||~%-\\^ H GGKK)GGMMO1$K;E#2J<sKLYPf '}4TUV ) i077	8S8SWX8XY__aHPQ $2;-?TUbTccyz$(	 ' ! A#a&JK  )#a&23  " (( 	GG!?AxH   	GG!3CF8< 	s   B P) .N82N87N8N8!N8(P) )A3N8P) DN8 N8>P)  BN8P) *B O& *P) 8	O#OP) O##P) &	P&/2P!!P&&P) )R-<*Q,&R-,R-8*R("R-(R-N)__name__
__module____qualname__r   r   rD   rn   r    r   r   r   r      s     =7 =":`DJr   r   )r_   bs4r   r   app.backend.db.modelsr   sqlalchemy.ormr   localerer   r   r   r   r   r   <module>r      s9       + "  	8 8 8N Nr   