paint-brush
Flix-Finder: Construindo um aplicativo de recomendação de filmes com Django e BrightData [Parte 1/3]por@infinity
3,348 leituras
3,348 leituras

Flix-Finder: Construindo um aplicativo de recomendação de filmes com Django e BrightData [Parte 1/3]

por Rishabh Agarwal9m2023/06/22
Read on Terminal Reader

Muito longo; Para ler

O aplicativo Django permitiria ao usuário filtrar filmes com base nas classificações de várias agências de classificação. Usaremos os serviços da BrightData para coletar os dados necessários para nosso aplicativo. Vamos começar a construir o Flix-Finder instalando o Django e configurando nosso projeto Django.
featured image - Flix-Finder: Construindo um aplicativo de recomendação de filmes com Django e BrightData [Parte 1/3]
Rishabh Agarwal HackerNoon profile picture

Você já lutou para decidir qual programa de TV ou filme assistir a seguir? Tomar uma decisão sobre o seu próximo binge-watch nunca é fácil porque há tantas opções acessíveis em diferentes provedores de streaming.


Ao decidir sobre nosso próximo filme, contamos principalmente com as críticas e classificações de várias agências de classificação (como o IMDB). No entanto, escolher em qual classificação acreditar pode ser difícil, dada a abundância dessas instituições.


Dito isso, geralmente é mais seguro assistir a um filme que recebeu boas notas de várias dessas organizações. Mas não é difícil encontrar um filme assim? É sim!


Nesta série de três blogs, criaremos uma solução de software para resolver exatamente esse problema! Esse aplicativo Django, que chamaremos de Flix-Finder, permitiria ao usuário filtrar filmes com base nas classificações de várias agências de classificação.


Usaremos os serviços da BrightData para coletar os dados necessários para nosso aplicativo.


Então, sem mais delongas, vamos começar a construir o Flix-Finder.

Configurando o aplicativo

Antes de começar com esta seção, certifique-se de que o Django esteja instalado em seu sistema!


O seguinte comando deve funcionar se o Django estiver instalado em seu sistema.

python3 -m django --version


Use o pip para instalar o Django se ele não estiver instalado em seu sistema!

python3 -m pip install Django


Vamos começar configurando nosso projeto Django. Crie um novo projeto usando o seguinte comando.


 rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder


Altere o diretório para o diretório do projeto recém-criado flix_finder . Abra seu editor de código favorito aqui. Você deve ver os seguintes arquivos neste diretório criado automaticamente pelo Django.


 rishabh@my-ubuntu:~/projects/flix_finder$ tree . . ├── flix_finder │ ├── asgi.py │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 1 directory, 6 files


Para saber mais sobre esses arquivos, consulte esta explicação fornecida pelo Django.


Tente executar o servidor Django e acessar localhost:8000 para garantir que a configuração foi concluída corretamente!


 rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver

Criando um novo aplicativo e nossa primeira visualização

Um aplicativo Django (ou aplicativo Django) refere-se a um componente de um projeto Django maior que encapsula um recurso ou funcionalidade individual. Os aplicativos Django são componentes reutilizáveis e independentes. Eles consistem em modelos, visualizações, modelos, testes e outros arquivos.

Toda a lógica do recomendador para nosso projeto residiria em um aplicativo chamado recommender . Para criar este aplicativo, execute o seguinte comando.


 rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender


O comando acima criará uma nova pasta chamada recommender . Toda a lógica do nosso aplicativo estaria dentro dessa pasta.


Há mais uma etapa restante antes de podermos dizer que nosso aplicativo foi criado com sucesso. Vá em frente e adicione o nome do aplicativo recém-criado na lista INSTALLED_APPS presente em flix_finder/settings.py .


 # flix_finder/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'recommender' ]


Com isso, criamos com sucesso nosso aplicativo recommender .


Agora, vamos criar nossa primeira view.


No Django, views são funções Python que recebem requisições HTTP e retornam respostas HTTP. As exibições desempenham um papel importante na apresentação de dados aos usuários com base em alguma lógica de negócios.


Crie um novo método em recommender/views.py . Esse método atenderia às solicitações provenientes de localhost:8000/ . Por enquanto, esse ponto de extremidade simplesmente retorna uma mensagem de saudação.


 from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!")


Criamos o método view para lidar com a solicitação, mas não especificamos (em nosso projeto) quais endpoints correspondem a essa view. Fazemos isso nos arquivos urls.py


Crie um novo arquivo dentro do aplicativo recomendador e nomeie-o como urls.py . Aqui, especificamos essa correspondência entre a URL e o método view.


 from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ]


Agora precisamos deixar o Django ciente desse novo arquivo de URL. Atualize o arquivo flix_finder/urls.py para o seguinte.


 from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ]


Inicie seu servidor, se ainda não estiver, e abra localhost:8000 em seu navegador. Você deve ver a mensagem de saudação.


Olá, mensagem do nosso aplicativo de recomendação!


Parabéns, você acabou de criar sua primeira visualização!

Vamos usar modelos…

Convenhamos… enviar uma string como resposta não é a coisa mais legal. Em vez disso, devemos enviar uma resposta HTML adequada. E para este exato propósito, estaremos usando Django Templates.


Crie um diretório templates sob o diretor recommender . O nome desta pasta recém-criada é especial, pois o padrão do Django procura por arquivos HTML nos diretórios denominados templates .


Crie um novo arquivo chamado index.html dentro do diretório recém-criado. Dentro desse arquivo, escreveremos o HTML que queremos renderizar quando os usuários visitarem localhost:8000 .


Como escrever HTML não é o foco principal aqui, vou pular a explicação dessa parte e você pode simplesmente copiar o HTML daqui .


Aqui estão algumas das coisas que você precisa saber sobre este arquivo HTML (ou modelo Django) -


(1) Este HTML exibe quatro itens na página da Web - barra de navegação, carrossel, formulário de pesquisa de filmes e resultados de pesquisa de filmes.


(2) Ele usa a linguagem de template Django para permitir o uso de variáveis Python diretamente dentro do HTML.


(3) Ele espera a variável featured_movies no contexto (dados passados para o modelo) e a usará para exibir o carrossel.


(4) Ele espera que a variável form seja preenchida com um objeto Formulário Django e o usará para exibir o Formulário de pesquisa de filme.


(5) Ele espera a variável filtered_movie_list e a usará para exibir os resultados da pesquisa.


(6) Também espera a variável no_result_error que indica se a busca resultou em uma resposta vazia.


Também precisaremos adicionar algum CSS para estilizar. Crie um diretório static sob o diretório recommender . Esta pasta conterá todos os arquivos estáticos.


Crie um novo arquivo chamado style.css e cole o CSS deste URL .


Com isso, temos todo o HTML e CSS necessários no lugar. Em seguida, precisamos criar o formulário de pesquisa de filmes.

Criando o formulário de pesquisa de filmes

Como nosso modelo exige que forneçamos um objeto de formulário, precisaremos criar um.

Não tem certeza do que são Formulários Django? Leia ChatGPT explicar isso -

Os formulários Django são um módulo no framework Django usado para criar e trabalhar com formulários HTML. Eles fornecem várias vantagens sobre o uso de formulários HTML simples:

  • Renderização automática de HTML. Você define uma classe de formulário Django e o Django a renderiza como um formulário HTML.
  • Validação de dados. Os formulários Django validam os dados enviados e os limpam antes de salvar.
  • Vinculando dados a formulários. Você pode vincular dados existentes a um formulário para exibição ao usuário para edição.

Crie um arquivo chamado forms.py dentro do diretório app do recomendador. Adicione o seguinte código a ele.


 from django import forms class MovieSearchForm(forms.Form): imdb_rating = forms.DecimalField(min_value=0.1, max_value=9.9, required=True, label='Minimum IMDB Rating') release_year = forms.IntegerField(required=True)


O que acabamos de fazer foi criar uma classe de formulário para nosso Formulário de Pesquisa de Filmes. Este formulário conterá dois campos conforme descrito na aula. Se você quiser saber mais sobre formulários, confira isso .

Atualizando a visualização do índice

Com todas as coisas necessárias para os modelos definidos, agora precisamos atualizar nosso método de exibição para usar este modelo recém-criado.


 from .forms import MovieSearchForm # We use a hard-code list here, we will make it dynamic in subsequent parts featured_movie_list = [ { "img_src": "https://images.thedirect.com/media/article_full/amazing-spider-man-3-andrew-garfield-movie-mcu.jpg", "img_alt": "...", "active": True }, { "img_src": "https://static1.colliderimages.com/wordpress/wp-content/uploads/2022/11/avatar-the-way-of-water-poster.jpg", "img_alt": "...", "active": False } ] def index(request): context = { "featured_movies": featured_movie_list, "form": MovieSearchForm() } return render(request, 'index.html', context)


Inicie seu servidor e vá para localhost:8000 . Você deve ver a página a seguir.


Página inicial do Flix-Finder


Dados do IMDB da BrightData

Com todas as exibições, URLs, modelos e formulários prontos, agora podemos considerar os dados nos quais nosso aplicativo irá operar. Nosso programa exigiria dados de várias agências de classificação (IMDB, para começar).


Infelizmente, não existe uma API bem definida por meio da qual possamos recuperar esses dados. Um método para obter essas informações é criar nossos próprios raspadores usando Python Selenium. No entanto, isso exigiria mais trabalho e nem todos se sentem confortáveis com essas tecnologias.


Uma solução melhor é usar serviços de terceiros como o BrightData. O BrightData facilita a obtenção de todas essas informações.


Para esta primeira parte, usaremos um conjunto de dados IMDB pré-curado da BrightData. Este é um dos muitos conjuntos de dados disponíveis no BrightData. É assim que podemos obtê-lo.


(1) Inscreva-se para uma conta no BrightData.


(2) Vá para brightdata.com/cp/datasets no navegador ou abra o menu Datasets & WebScraper IDE à esquerda.

Conjuntos de dados e menu IDE do WebScraper no BrightData

(3) Acesse o Dataset Marketplace e procure por IMDB media dataset .


(4) Clique em Exibir conjunto de dados e baixe o conjunto de dados de amostra no formato CSV.


Depois de baixado, renomeie o arquivo para IMDB.csv e coloque-o dentro da pasta recommender/static . Este CSV de amostra contém 28 atributos IMDB para mais de 1.000 filmes. Nosso aplicativo funcionará neste conjunto de dados IMDB para esta parte.

Atualizando a exibição de índice para receber um envio de formulário

Vamos atualizar o método view para processar solicitações de pesquisa.


Todas as solicitações de pesquisa do formulário chegam como solicitações POST. Depois de confirmar que o formulário está devidamente preenchido, listaremos todos os filmes do arquivo CSV baixado e filtraremos aqueles que não corresponderem aos critérios do filtro. Aqui está a aparência do código atualizado.


 def index(request): if request.method == 'POST': form = MovieSearchForm(request.POST) if form.is_valid(): movie_list = _getIMDBMovieDataList() filtered_movie_list = _filter_imdb_movie_list(movie_list, form) context = { "featured_movies": featured_movie_list, "form": MovieSearchForm(), "filtered_movie_list": filtered_movie_list, "no_result_error": len(filtered_movie_list)==0 } return render(request, 'index.html', context) context = { "featured_movies": featured_movie_list, "form": MovieSearchForm() } return render(request, 'index.html', context)


A implementação dos métodos _getIMDBMovieDataList e _filter_imdb_movie_list não é nada específico do Django e é puro Python. Assim, pulo de falar sobre isso aqui. Todo o arquivo views.py pode ser encontrado aqui .

Produto final

Parabéns por chegar a este ponto. Se você seguiu todas as etapas corretamente, poderá executar o servidor e realizar pesquisas por meio da interface do usuário. Veja como ficariam os resultados da pesquisa.


Página da Web mostrando o resultado da pesquisa para Classificação mínima do IMDB 8.0 e ano de lançamento 2022.


Código para esta série

Todo o código criado como parte desta série estará disponível neste repositório GitHub. O resultado final desta parte está contido nesta ramificação chamada Part1 .


É sempre uma boa ideia cruzar seu código com o presente no repositório para verificar se algo está errado.


Observações Finais

Com isso, chegamos ao final da primeira parte desta série de três partes. Na próxima parte, usaremos o IDE WebScraper da BrightData para coletar dados de outras agências de classificação. Em seguida, atualizaremos nosso formulário, permitindo assim que os usuários realizem pesquisas mais complexas.


Também tornaremos dinâmico o componente Carrossel!


Até a próxima… Até lá, Bom aprendizado! 🙂