Conteúdos de várias fontes em um único local
Um agregador de conteúdo coleta e mostra conteúdos de várias fontes em um único local. O conteúdo agregado pode ser qualquer coisa, desde artigos de notícias até postagens de mídia social. A necessidade de agregadores de conteúdo é bastante clara. A internet está lotada de informações e, para nos manter atualizados, precisamos navegar em vários sites diariamente. Porém, isso consome tempo. A agregação de conteúdo nos ajuda a otimizar nosso tempo. Ao invés de percorrer vários sites diferentes, precisamos visitar apenas de um.
Neste post, criaremos um agregador de conteúdo usando feedparser. Depois, expandiremos o código para exibir o conteúdo na web usando Flask. Portanto, para acompanhar o post, é recomendável ter alguma familiaridade com Flask.
Como criar um agredador de conteúdo?
Existem passos comuns a qualquer agregador de conteúdo:
Escolha das fontes: se refere a decidir de onde virá o conteúdo que deseja. As fontes principais incluem RSS Feeds, APIs e web scraping.
Obtenção do conteúdo: uma vez que a fonte foi determinada, bibliotecas adequadas para obter o conteúdo desejado devem ser empregadas.
Exibição do conteúdo: como o conteúdo obtido será exibido? Estruturas como Flask ou Django podem ser empregadas nessa etapa para exibir o conteúdo mediante uma interface web.
Usaremos RSS Feeds como nossa fonte. Os conteúdos serão obtidos usando o excelente feedparser. Depois, exibiremos o conteúdo obtido em um wep app desenvolvido com Flask.
RSS Feeds do Reddit
Para ilustrar como criar um agregador de conteúdo, usaremos RSS Feeds do Reddit.
O Reddit é composto por muitos sub-reddits. A RSS feed para um sub-reddit pode ser obtido através de sua URL com a adição de um “.rss” a ela. No nosso exemplo, usaremos RSS Feeds para 2 sub-reddits: Python e Django.
O código para obter o conteúdo é bem simples. Para obter os dados, basta usar o comando:
import feedparser
dados = feedparser.parse('http://www.reddit.com/r/python/.rss')
Porém, como obteremos os dados de duas RSS Feeds com vários itens, usaremos um loop:
import feedparser
feeds = [
'http://www.reddit.com/r/python/.rss',
'http://www.reddit.com/r/django/.rss',
]
articles = []
for feed in feeds:
parsed_feed = feedparser.parse(feed)
for dado in parsed_feed.entries:
articles.append({
'title': dado.title,
'link': dado.link,
})
print(articles)
# resultados parciais: [{'title': "Sunday Daily Thread: What's everyone working on this week?", 'link': 'https://www.reddit.com/r/Python/comments/1fbku4v/sunday_daily_thread_whats_everyone_working_on/'}, {'title': 'PyWeek 38: A Python Game Jam', 'link': 'https://www.reddit.com/r/Python/comments/1fccov9/pyweek_38_a_python_game_jam/'}, ...
A execução desse código simples já retorna os dados desejados. No caso deste exemplo ilustrativo, estamos obtendo apenas os títulos e links dos artigos originais.
Exibição do conteúdo agregado com Flask
Uma vez que o conteúdo agregado é obtido, é hora de exibí-lo. Isso será feito com Flask.
Nosso código com o agregador de conteúdo com Flask é super simples. Criamos um app com Flask. Dentro dele, simplesmente colamos nossa lista com o conteúdo obtido das feeds como definido anteriormente. O conteúdo obtido é passado como contexto para um template HTML do Flask.
import feedparser
from flask import Flask, render_template # novo
# inicia um Flask object
app = Flask(__name__)
# define o app
@app.route('/')
def index():
"""Usa feedparser para obter conteúdo do Reddit e os exibe num template HTML usando Flask"""
feeds = [
'http://www.reddit.com/r/python/.rss',
'http://www.reddit.com/r/django/.rss',
]
articles = []
for feed in feeds:
parsed_feed = feedparser.parse(feed)
for dado in parsed_feed.entries:
articles.append({
'title': dado.title,
'link': dado.link,
})
# exibe contexto num template HTML
return render_template('index.html', articles=articles)
# executa o app
if __name__ == '__main__':
app.run(debug=True)
Exibição em HTML
O template HTML é mostrado abaixo. Ele precisa ser inserido numa pasta chamada templates para que o Flask consiga enxergá-lo. A pasta deve estar no mesmo diretório do arquivo Flask. O template usa Bootstrap para criar alguns contêineres. Basicamente, ele possui um loop implementado com Jinja que exibe o conteúdo obtido dinamicamente.
O código Flask é executado como um código Python tradicional. O conteúdo de HTML é exibido no localhost (http://127.0.0.1:5000/).
Esse é o resultado obtido com nosso agregador, ele não é muito bonito, mas é totalmente funcional :).
Veja também:
Concatenações com join() para strings em Python
O que é operador ternário em Python?
F-strings em Strings Multilinhas
Decodificação de strings em Python com decode()
Métodos para Manipular Strings em Python
Módulo Getpass para Prompts de Senhas
Aprenda a comparar textos com Python com Difflib
Módulo textwrap para formatação de textos
Manipulação de arquivos com Python
os.environ: gerenciamento de variáveis de ambiente com Python
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.