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
Métodos Avançados Do Módulo os
Aprenda a criar documentos do Word com Python
Três dicas simples para escrever códigos Python mais robustos
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.