import os
import pandas as pd
import requests
import time
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from diarios_rss import diarios
import agrega_sentimientos
import datetime as dt
import streamlit as st
class Scrapper:
def __init__(self):
self.noticias = {}
def recorre_diarios(self):
contador = 0
for diario in diarios:
try:
print(f"Obteniendo noticias de {diarios[diario]['diario']} ,seccion {diarios[diario]['seccion']} ")
st.session_state['muestra_progreso']=f"{diarios[diario]['diario']} -- > seccion {diarios[diario]['seccion']} "
st.write(st.session_state['muestra_progreso'])
time.sleep(0.5)
url = requests.get(diarios[diario]['rss'])
soup = BeautifulSoup(url.content, "xml")
items_pagina = soup.find_all('item')
for item in range(len(items_pagina)):
noticia = {}
noticia['diario'] = diarios[diario]['diario']
noticia['seccion'] = diarios[diario]['seccion']
noticia['titulo'] = items_pagina[item].title.text
if items_pagina[item].description == None or items_pagina[item].description == " " or items_pagina[item].description == "":
if diarios[diario]['diario'] == 'Perfil':
noticia['descripcion'] = items_pagina[item].description.text.split(
"
")[1].split('")[
1].split('')[0]
else:
noticia['descripcion'] = items_pagina[item].title.text
else:
if diarios[diario]['diario'] == 'Perfil':
noticia['descripcion'] = items_pagina[item].description.text.split(
"")[1].split('")[
1].split('')[0]
else:
noticia['descripcion'] = (
items_pagina[item].description.text)
self.noticias[contador] = noticia
contador = contador + 1
except:
pass
def formateo_noticias(self):
dataframe_noticias = pd.DataFrame(self.noticias).transpose()
dataframe_noticias.drop_duplicates(subset=['titulo'])
return dataframe_noticias
def sentimientos(self, dataframe_noticias):
with st.spinner('Descargando sentimientos para las noticias..'):
dia_str = str(dt.datetime.today().date())
noticias = agrega_sentimientos.genera_excel_sentimientos(
dataframe_noticias)
noticias.to_csv(
f"noticias_con_sentimientos_{dia_str}.csv", index=False)
pass
def apila_diarios_historicos(self):
lista_diarios = os.listdir('diarios')
print(lista_diarios)
lista_diarios.remove('diarios_historicos.csv')
dataframes = []
dataframes.append(pd.read_csv("diarios_historicos.csv"))
for diarios in lista_diarios:
dataframes.append(pd.read_csv(diarios))
apilados = pd.concat(dataframes, axis=0)
apilados=apilados.drop_duplicates(subset=['titulo'])
apilados.to_csv(f"diarios_historicos.csv", index=False)
def agrega_fecha_hoy(self):
fechas = pd.read_csv("fechas.csv")
dia_str = str(dt.datetime.today().date())
fechas = fechas.append({'dia': dia_str}, ignore_index=True)
fechas.to_csv("fechas.csv", index=False)
def transforma_letras_para_wordcloud(self, dataframe_noticias):
columna_analizada = list(dataframe_noticias.titulo)
acentos = {'á': 'a', 'é': 'e', 'í': 'i', 'ó': 'o', 'ú': 'u',
'Á': 'A', 'E': 'E', 'Í': 'I', 'Ó': 'O', 'Ú': 'U'}
lista_palabras_para_wordcloud = []
for palabras in columna_analizada:
palabras_div = palabras.split(' ')
for letras in palabras_div:
for acen in acentos:
if acen in letras:
letras = letras.replace(acen, acentos[acen])
lista_palabras_para_wordcloud.append(letras.lower())
return ' '.join(lista_palabras_para_wordcloud)
def genera_wordcloud(self, palabras_para_wordcloud):
palabras_ignoradas = set(['a', 'ante', 'con', 'contra', 'de', 'desde', 'durante', 'en', 'para', 'por', 'segun', 'sin', 'sobre', 'el', 'la', 'los', 'las',
'...', 'y', 'hoy', 'este', 'cuanto', 'un', 'del', 'las', 'que', 'con', 'todos', 'es', '¿qué', 'como', 'cada',
'jueves', '¿cuanto', 'hoy', 'al', 'cual', 'se', 'su', 'sus', 'lo', 'una', 'un', 'tiene',
'le', 'habia'])
wordcloud = WordCloud(width=1920, height=1080, stopwords=palabras_ignoradas).generate(
palabras_para_wordcloud)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
def run(self):
self.recorre_diarios()
dataframe_noticias = self.formateo_noticias()
self.sentimientos(dataframe_noticias)
self.apila_diarios_historicos()
palabras_para_wordcloud = self.transforma_letras_para_wordcloud(
dataframe_noticias)
self.genera_wordcloud(palabras_para_wordcloud)
self.agrega_fecha_hoy()