Página de Noticias Atualizadas com Raspberry e Flask - ElectroFun Blog
Destaques Eletrónica Raspberry Pi
19 Outubro, 2021 15 Novembro, 2021 Rafael Pimenta	Flask, jinja, pi, python, Raspberry, servidor
Neste artigo daremos continuação ao post anterior desta vez, temos como objetivo gerar uma página que atualize sempre que seja acedida com as noticias mais recentes.
Para seguir este projeto caso ainda não possua o material mínimo necessário, recomendamos que adquira o seguinte conjunto:
Daremos inicio ao projeto por criar o ficheiro main.py que será responsável por controlar todas as ações que iremos efetuar no nosso servidor. Iremos contruir um módulo capaz de colecionar as noticias mais recentes de um site de noticias., no nosso caso iremos utilizar o Jornal de Noticias.
Para complementar o nosso servidor, precisamos de gerar 3 páginas HTML e 1 página CSS:
base.html – Pagina que será usada como base para as restantes páginas;
home.html – Página de aterragem ao servidor;
noticias.html – Página para visualizar as noticias;
style.css – Editar o estilo das restantes páginas.
Sendo que estamos a utilizar o Flask para hospedar o nosso servidor existem um conjunto de regras na preparação do ambiente.
O seu ambiente deve seguir a seguinte estrutura:
Ficheiro: main.py
Pasta: templates
Pasta: static
Pasta: modules:
Adicionalmente, com recuso ao gerenciador de pacotes do python3 (pip3) iremos instalar a biblioteca bs4, para isso execute o seguinte comando no seu terminal:
sudo python3 -m pip install bs4
Preparar Servidor
A função deste ficheiro é fazer scrapping ao site de noticias escolhido de forma a obter a informação que achamos necessária.
Alguns websites não autorizam web scraping nas suas plataformas, por isso, pedimos que consulte ficheiro robots.txt presente em cada site antes de avançar com estas praticas. Para aceder a este ficheiro tem de colocar /robots.txt em frente ao domínio – website.com/robots.txt. Sendo que o jornal de noticias permite webscraping iremos usa-lo para obter as noticias atualizadas.
Começamos o ficheiro por importar as bibliotecas necessárias:
requests – Usada para efetuar pedido de request a qualquer página web.
bs4 – Usada para webscraping
arrCategoriasJN = ['nacional','justica', 'mundo', 'economia', 'desporto', 'inovacao', 'artes', 'opiniao']
arrNoticias = []
firstTime = True
Cria a função getNoticias, e declara variáveis 3 variáveis:
arrCategoriasJN – Array que contém as categorias
arrNoticias – Array para armazenar noticias
firstTime – Caso seja primeira vez é True ou Falso caso não seja.
Está última etapa consiste num loop que faz um Get Request a cada categoria, de seguida procura no código fonte da página e armazena na variável mainDivNoticia a div que cumpra com a condição class_ = "t-grid-1-featured-2"
Nessa div encontra-se a informação de cada noticia de forma a facilitar o nosso trabalho no momento da criação da pagina web no nosso servidor, armazenamos a informação de cada noticia em variáveis diferentes.
tituloNoticia – Titulo das Noticias
linkNoticia – Links das Noticias
linkImagemNoticia – Links das Imagens das Noticias
descNoticia – Descrições das Noticias
Estas variáveis são de seguida convertidas num dicionário, noticia, que por sua vez é adicionado a um array com as noticias, arrNoticias.
# Ficheiro Principal Servidor
# Website: https://www.electrofun.pt
# Blog https://www.electrofun.pt/blog/
# Author: ElectroFun
Este é o código base para as nossas paginas do servidor, este código pode ser alterado com base nas suas preferências, apenas as referências a jinja2 devem ser mantidas (partes dentro de chavetas)
<!--Block para editar Titulo-->
<!--Icon Separador-->
<!--Barra de Navegação Superio: https://getbootstrap.com/docs/4.0/components/navbar/-->
<a class="navbar-brand" href="{{ url_for('home') }}">Servidor</a>
<a class="nav-link" href="{{ url_for('home') }}">Home <span class="sr-only">(current)</span></a>
<a class="nav-link" href="{{ url_for('noticias') }}">Noticias</a>
<a class="nav-link" href="#">Sensores</a>
<!--Conteudo de Unico de cada pagina-->
O ficheiro main.py como mencionado anteriormente é o arquivo principal do nosso projeto.
Começamos por importar as bibliotecas necessárias
from modules import getNoticias
De seguida criamos algumas constantes:
Deverá substituir o HOST pelo IP do seu Raspberry
De seguida criamos objeto para armazenar o nosso servidor:
Seguidamente criamos as páginas da nossa plataforma
return render_template('home.html')
items = getNoticias.getNoticias()
return render_template('noticias.html', items = items)
Na função noticias criamos um variável items que sempre que a função noticias() for executada, isto é, sempre que a página /noticias for aberta será executado o script criado em getNoticias.py retribuindo as noticias mais recentes.
app.run(host = HOST, port = PORT)
Têm como funcionalidade iniciar o servidor.
items = getNoticias.getNoticias()
return render_template('noticias.html', items = items)
@app.route("/nodemcu-text")
def nodemcu():
noticias = getNoticias.getNoticias()
noticiaClean = noticia.get('titulo')
noticiaClean = unidecode.unidecode(noticiaClean)
items.append(noticiaClean)
return render_template('nodemcu.html', items = items)
De seguida pode consultar o nosso código para a página noticias.html
A forma que optamos por mostrar as nóticias no nosso servidor foi com o uso de um Carousel fornecido nos exemplos do bootstrap.
Caso pretenda construir o sua própria página HTML deverá apenas usar as variaveis jinja {% for item in items %}, {{item.elemento}}, {% endfor %}, etc.. de forma irem ao encontro do seu design.
Os estilos usados no nosso servidor foram os seguintes – Caso decida criar a sua própria pagina HTML este código deverá ser igualmente alterado para ir ao encontro dos seus objetivos.
color:#a6a6a7;
color: #f0a926;
Com os códigos terminados e colocados na respetiva pasta, abra o terminal na pagina do seu servidor e execute a seguinte linha no terminal:
Finalmente basta aceder ao endereço de Ip apresentado e navegar até /noticias ou no como no nosso exemplo, clicar em noticias.
Este método de obtenção de conteúdo e criação de páginas web pode ser facilmente adaptado para mostrar outro tipo de conteúdo a sua escolha – lançamentos de filmes, novas promoções, etc… portanto recomendamos que estude bem cada etapa deste projeto.