-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
115 lines (102 loc) · 4.58 KB
/
app.py
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
from flask import Flask, render_template, request
import requests
from bs4 import BeautifulSoup
import textwrap
import openai
import os
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
token_openai=os.environ.get("TOKEN_OPENAI")
def raspador_noticias(palavras_chave):
site_url = "https://www1.folha.uol.com.br/folha-topicos/eleicoes-2024/"
resposta = requests.get(site_url)
if resposta.status_code == 200:
soup = BeautifulSoup(resposta.text, 'html.parser')
noticias = soup.find_all('div', {"class": "c-headline c-headline--newslist"})
dict_noticias = {palavra_chave: [] for palavra_chave in palavras_chave}
noticias_por_candidato = {palavra_chave: 0 for palavra_chave in palavras_chave}
for noticia in noticias:
if all(noticias_por_candidato[palavra_chave] >= 5 for palavra_chave in palavras_chave):
break #sair do loop ao encontrar 5 notícias para cada candidato
titulo = noticia.find('a').text.strip()
link = noticia.find('a')['href']
for palavra_chave in palavras_chave:
if palavra_chave.lower() in noticia.text.lower():
if noticias_por_candidato[palavra_chave] < 5:
texto = texto_completo(link)
dict_noticias[palavra_chave].append({'titulo': titulo, 'link': link, 'texto': texto})
noticias_por_candidato[palavra_chave] += 1
return dict_noticias
def texto_completo(link):
resposta = requests.get(link)
if resposta.status_code == 200:
soup = BeautifulSoup(resposta.text, 'html.parser')
texto = soup.find('div', {"class": 'c-news__body'})
if texto:
texto_formatado = texto.text.strip().replace('\n', '\n\n')
largura_da_tela = 150
texto_final = textwrap.fill(texto_formatado, width=largura_da_tela)
return texto_final
def resumo_materia(texto_completo):
prompt = "Leia os textos extraídos sobre os pré-candidatos à prefeitura de São Paulo. Faça um resumo de no máximo 300 caracteres para cada texto. É obrigatório que o resumo tenha o nome do candidato."
openai_api_key = token_openai
client = openai.Client(api_key = openai_api_key)
response = client.chat.completions.create(
model="gpt-4-1106-preview",
messages=[
{"role": "user", "content": prompt},
{"role": "user", "content": texto_completo}
]
)
if response.choices:
resumo = response.choices[0].message.content
largura_da_tela = 150
resumo_formatado = textwrap.fill(resumo, width=largura_da_tela)
return resumo_formatado
@app.route("/paginainicial", methods=["GET", "POST"])
def paginainicial():
if request.method == "POST":
palavras_chave = ["Nunes", "Boulos", "Tabata"]
noticias_por_candidato = raspador_noticias(palavras_chave)
return render_template("paginainicial.html", noticias_por_candidato=noticias_por_candidato)
else:
return render_template("paginainicial.html")
# Rota para página do candidato 1
@app.route("/guilhermeboulos")
def candidato1():
palavras_chave = ["Boulos"]
noticias_por_candidato = raspador_noticias(palavras_chave)
resumos = []
for noticia in noticias_por_candidato['Boulos']:
titulo = noticia['titulo']
texto = noticia['texto']
resumo = resumo_materia(texto)
resumos.append({'titulo': titulo, 'resumo': resumo})
return render_template("guilhermeboulos.html", resumos=resumos)
# Rota para página do candidato 2
@app.route("/ricardonunes")
def candidato2():
palavras_chave = ["Nunes"]
noticias_por_candidato = raspador_noticias(palavras_chave)
resumos = []
for noticia in noticias_por_candidato['Nunes']:
titulo = noticia['titulo']
texto = noticia['texto']
resumo = resumo_materia(texto)
resumos.append({'titulo': titulo, 'resumo': resumo})
return render_template("ricardonunes.html", resumos=resumos)
# Rota para página do candidato 3
@app.route("/tabataamaral")
def candidato3():
palavras_chave = ["Tabata"]
noticias_por_candidato = raspador_noticias(palavras_chave)
resumos = []
for noticia in noticias_por_candidato['Tabata']:
titulo = noticia['titulo']
texto = noticia['texto']
resumo = resumo_materia(texto)
resumos.append({'titulo': titulo, 'resumo': resumo})
return render_template("tabataamaral.html", resumos=resumos)
if __name__ == '__main__':
app.run(port=5000, debug=True)