paint-brush
Flix-Finder: Erstellen einer Filmempfehlungs-App mit Django und BrightData [Teil 1/3]by@infinity
3,319
3,319

Flix-Finder: Erstellen einer Filmempfehlungs-App mit Django und BrightData [Teil 1/3]

Rishabh Agarwal9m2023/06/22
Read on Terminal Reader
Read this story w/o Javascript

Die Django-Anwendung würde es dem Benutzer ermöglichen, Filme basierend auf Bewertungen mehrerer Ratingagenturen zu filtern. Wir werden die Dienste von BrightData nutzen, um die erforderlichen Daten für unsere Anwendung abzurufen. Beginnen wir mit der Erstellung von Flix-Finder, indem wir Django installieren und unser Django-Projekt einrichten.
featured image - Flix-Finder: Erstellen einer Filmempfehlungs-App mit Django und BrightData [Teil 1/3]
Rishabh Agarwal HackerNoon profile picture

Haben Sie schon einmal darüber nachgedacht, welche Fernsehsendung oder welchen Film Sie als nächstes ansehen möchten? Die Entscheidung für Ihren nächsten Binge-Watch zu treffen, ist nie einfach, da bei verschiedenen Streaming-Anbietern so viele Optionen verfügbar sind.


Bei der Entscheidung für unseren nächsten Film verlassen wir uns in erster Linie auf Rezensionen und Bewertungen verschiedener Ratingagenturen (wie IMDB). Angesichts der Fülle dieser Institutionen könnte es jedoch schwierig sein, sich für ein Rating zu entscheiden, an das man glauben soll.


Allerdings ist es oft sicherer, einen Film anzusehen, der von mehreren dieser Organisationen gute Noten erhalten hat. Aber ist es nicht schwierig, einen solchen Film zu finden? Ja ist es!


In dieser dreiteiligen Blogserie werden wir eine Softwarelösung entwickeln, um genau dieses Problem zu lösen! Diese Django-Anwendung, die wir Flix-Finder nennen werden, würde es ihrem Benutzer ermöglichen, Filme basierend auf Bewertungen mehrerer Ratingagenturen zu filtern.


Wir werden die Dienste von BrightData nutzen, um die erforderlichen Daten für unsere Anwendung abzurufen.


Beginnen wir also ohne weitere Umschweife mit der Entwicklung von Flix-Finder.

Einrichten der Anwendung

Bevor Sie mit diesem Abschnitt beginnen, stellen Sie sicher, dass Django auf Ihrem System installiert ist!


Der folgende Befehl sollte funktionieren, wenn Django auf Ihrem System installiert ist.

python3 -m django --version


Verwenden Sie pip, um Django zu installieren, wenn es nicht auf Ihrem System installiert ist!

python3 -m pip install Django


Beginnen wir mit der Einrichtung unseres Django-Projekts. Erstellen Sie mit dem folgenden Befehl ein neues Projekt.


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


Wechseln Sie das Verzeichnis in das neu erstellte Projektverzeichnis flix_finder . Öffnen Sie hier Ihren bevorzugten Code-Editor. In diesem Verzeichnis sollten Sie die folgenden Dateien sehen, die automatisch von Django erstellt wurden.


 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


Weitere Informationen zu diesen Dateien finden Sie in dieser Erklärung von Django.


Versuchen Sie, den Django-Server auszuführen und auf localhost:8000 zuzugreifen, um sicherzustellen, dass die Einrichtung ordnungsgemäß abgeschlossen wurde!


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

Erstellen einer neuen App und unsere erste Ansicht

Eine Django-App (oder Django-Anwendung) bezieht sich auf eine Komponente eines größeren Django-Projekts, die ein einzelnes Feature oder eine einzelne Funktionalität kapselt. Django-Apps sind wiederverwendbare und unabhängige Komponenten. Sie bestehen aus Modellen, Ansichten, Vorlagen, Tests und anderen Dateien.

Die gesamte Empfehlungslogik für unser Projekt würde sich in einer Anwendung namens recommender befinden. Führen Sie den folgenden Befehl aus, um diese App zu erstellen.


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


Mit dem obigen Befehl wird ein neuer Ordner mit dem Namen recommender erstellt. Die gesamte Logik unserer Anwendung würde in diesem Ordner abgelegt werden.


Es bleibt noch ein weiterer Schritt, bevor wir sagen können, dass unsere Anwendung erfolgreich erstellt wurde. Fahren Sie fort und fügen Sie den Namen der neu erstellten App in die Liste INSTALLED_APPS unter flix_finder/settings.py ein.


 # 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' ]


Damit haben wir unsere recommender App erfolgreich erstellt.


Lassen Sie uns nun unsere erste Ansicht erstellen.


In Django sind Ansichten Python-Funktionen, die HTTP-Anfragen empfangen und HTTP-Antworten zurückgeben. Ansichten spielen eine wichtige Rolle bei der Darstellung von Daten für Benutzer basierend auf einer Geschäftslogik.


Erstellen Sie eine neue Methode unter recommender/views.py . Diese Methode würde Anfragen bearbeiten, die über localhost:8000/ eingehen. Im Moment gibt dieser Endpunkt lediglich eine Hallo-Nachricht zurück.


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


Wir haben die Ansichtsmethode zur Bearbeitung der Anfrage erstellt, aber wir haben (in unserem Projekt) nicht angegeben, welche Endpunkte dieser Ansicht entsprechen. Wir tun dies in den urls.py Dateien.


Erstellen Sie in der Empfehlungs-App eine neue Datei und nennen Sie sie urls.py . Hier spezifizieren wir diese Entsprechung zwischen der URL und der Ansichtsmethode.


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


Wir müssen Django nun auf die Datei dieser neuen URL aufmerksam machen. Aktualisieren Sie die Datei flix_finder/urls.py wie folgt.


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


Starten Sie Ihren Server, falls noch nicht geschehen, und öffnen Sie localhost:8000 in Ihrem Browser. Sie sollten die Hallo-Nachricht sehen.


Hallo Nachricht von unserer Recommender App!


Herzlichen Glückwunsch, Sie haben gerade Ihre erste Ansicht erstellt!

Lassen Sie uns Vorlagen verwenden ...

Wir sind uns einig, dass das Senden einer Zeichenfolge als Antwort nicht gerade die coolste Sache ist. Stattdessen sollten wir eine richtige HTML-Antwort senden. Und genau zu diesem Zweck werden wir Django-Vorlagen verwenden.


Erstellen Sie ein templates unter dem recommender . Der Name dieses neu erstellten Ordners ist besonders, da Django standardmäßig in den Verzeichnissen mit dem Namen templates nach HTML-Dateien sucht.


Erstellen Sie im neu erstellten Verzeichnis eine neue Datei mit dem Namen index.html . In diese Datei schreiben wir den HTML-Code, den wir rendern möchten, wenn Benutzer localhost:8000 besuchen.


Da das Schreiben von HTML hier nicht im Vordergrund steht, überspringe ich die Erläuterung dieses Teils und Sie können den HTML-Code einfach von hier kopieren.


Hier sind einige Dinge, die Sie über diese HTML-Datei (oder Django-Vorlage) wissen müssen:


(1) Dieser HTML-Code zeigt vier Dinge auf der Webseite an: Navigationsleiste, Karussell, Filmsuchformular und Filmsuchergebnisse.


(2) Es verwendet die Django-Vorlagensprache, um die Verwendung von Python-Variablen direkt im HTML zu ermöglichen.


(3) Es erwartet die Variable featured_movies im Kontext (an die Vorlage übergebene Daten) und verwendet sie zur Anzeige des Karussells.


(4) Es wird erwartet, dass die form mit einem Django-Formularobjekt gefüllt wird, und es wird zur Anzeige des Filmsuchformulars verwendet.


(5) Es erwartet die Variable filtered_movie_list und verwendet sie, um die Suchergebnisse anzuzeigen.


(6) Es wird außerdem die Variable no_result_error erwartet, die angibt, ob die Suche zu einer leeren Antwort geführt hat.


Wir müssen auch etwas CSS für das Styling hinzufügen. Erstellen Sie ein static Verzeichnis unter dem recommender . Dieser Ordner enthält alle statischen Dateien.


Erstellen Sie eine neue Datei mit dem Namen style.css und fügen Sie das CSS von dieser URL ein.


Damit verfügen wir über das gesamte erforderliche HTML und CSS. Als nächstes müssen wir das Filmsuchformular erstellen.

Erstellen des Filmsuchformulars

Da unsere Vorlage die Bereitstellung eines Formularobjekts erfordert, müssen wir eines erstellen.

Sie sind sich nicht sicher, was Django-Formulare sind? Lesen Sie ChatGPT und erklären Sie dies -

Django-Formulare sind ein Modul im Django-Framework, das zum Erstellen und Arbeiten mit HTML-Formularen verwendet wird. Sie bieten mehrere Vorteile gegenüber der Verwendung einfacher HTML-Formulare:

  • Automatisches Rendern von HTML. Sie definieren eine Django-Formularklasse und Django rendert sie als HTML-Formular.
  • Validierung von Daten. Django-Formulare validieren die übermittelten Daten und bereinigen sie vor dem Speichern.
  • Daten an Formulare binden. Sie können vorhandene Daten an ein Formular binden, um sie dem Benutzer zur Bearbeitung anzuzeigen.

Erstellen Sie eine Datei mit dem Namen forms.py im App-Verzeichnis des Empfehlungsgebers. Fügen Sie den folgenden Code hinzu.


 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)


Wir haben gerade eine Formularklasse für unser Filmsuchformular erstellt. Dieses Formular enthält zwei Felder, wie in der Klasse beschrieben. Wenn Sie mehr über Formulare erfahren möchten, schauen Sie sich hier an.

Aktualisieren der Indexansicht

Nachdem alle für die Vorlagen erforderlichen Dinge festgelegt sind, müssen wir jetzt unsere Ansichtsmethode aktualisieren, um diese neu erstellte Vorlage zu verwenden.


 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)


Starten Sie Ihren Server und gehen Sie zu localhost:8000 . Sie sollten die folgende Seite sehen.


Startseite von Flix-Finder


IMDB-Daten von BrightData

Nachdem alle Ansichten, URLs, Vorlagen und Formulare vorhanden sind, können wir nun die Daten berücksichtigen, mit denen unsere Anwendung arbeiten wird. Unser Programm würde Daten von mehreren Ratingagenturen erfordern (zunächst IMDB).


Leider gibt es keine genau definierte API, über die wir diese Daten abrufen können. Eine Methode, diese Informationen zu erhalten, besteht darin, mit Python Selenium eigene Scraper zu erstellen. Dies würde jedoch mehr Arbeit erfordern, und nicht jeder ist mit solchen Technologien vertraut.


Eine bessere Lösung ist die Nutzung von Drittanbieterdiensten wie BrightData. BrightData macht es einfach, all diese Informationen zu erhalten.


Für diesen ersten Teil verwenden wir einen vorkuratierten IMDB-Datensatz von BrightData. Dies ist einer der vielen Datensätze, die auf BrightData verfügbar sind. So können wir es bekommen.


(1) Eröffnen Sie ein Konto bei BrightData.


(2) Gehen Sie entweder im Browser zu brightdata.com/cp/datasets oder öffnen Sie das Menü Datasets & WebScraper IDE auf der linken Seite.

Datensätze und WebScraper-IDE-Menü auf BrightData

(3) Gehen Sie zum Dataset Marketplace und suchen Sie nach IMDB media dataset .


(4) Klicken Sie auf „Datensatz anzeigen“ und laden Sie den Beispieldatensatz im CSV-Format herunter.


Benennen Sie die Datei nach dem Herunterladen in IMDB.csv um und platzieren Sie sie im Ordner recommender/static . Diese Beispiel-CSV enthält 28 IMDB-Attribute für über 1000 Filme. Unsere Anwendung wird für diesen Teil mit diesem IMDB-Datensatz arbeiten.

Aktualisieren der Indexansicht zum Empfangen einer Formularübermittlung

Lassen Sie uns die Ansichtsmethode aktualisieren, um Suchanfragen zu verarbeiten.


Alle Suchanfragen aus dem Formular kommen als POST-Anfragen an. Nachdem wir bestätigt haben, dass das Formular ordnungsgemäß ausgefüllt ist, werden wir alle Filme aus der heruntergeladenen CSV-Datei auflisten und diejenigen herausfiltern, die nicht den Filterkriterien entsprechen. So sieht der aktualisierte Code aus.


 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)


Die Implementierung der Methoden _getIMDBMovieDataList und _filter_imdb_movie_list ist nichts Django-spezifisches, sondern reines Python. Ich verzichte daher darauf, hier darüber zu sprechen. Die gesamte Datei views.py finden Sie hier .

Endprodukt

Herzlichen Glückwunsch, dass Sie diesen Punkt erreicht haben. Wenn Sie alle Schritte ordnungsgemäß ausgeführt haben, sollten Sie in der Lage sein, den Server auszuführen und Suchvorgänge über die Benutzeroberfläche durchzuführen. So würden die Suchergebnisse aussehen.


Webseite mit Suchergebnissen für die IMDB-Mindestbewertung 8.0 und das Erscheinungsjahr 2022.


Code für diese Serie

Der gesamte im Rahmen dieser Serie erstellte Code wird in diesem GitHub-Repository verfügbar sein. Das Endergebnis dieses Teils ist in diesem Zweig mit dem Namen Part1 enthalten.


Es ist immer eine gute Idee, Ihren Code mit dem im Repo vorhandenen Code zu vergleichen, um festzustellen, ob etwas nicht stimmt.


Abschließende Bemerkungen

Damit sind wir am Ende des ersten Teils dieser dreiteiligen Serie angelangt. Im nächsten Teil werden wir die WebScraper-IDE von BrightData verwenden, um Daten von anderen Ratingagenturen zu sammeln. Anschließend werden wir unser Formular aktualisieren, sodass Benutzer komplexere Suchen durchführen können.


Wir werden auch die Karussellkomponente dynamisch gestalten!


Bis zum nächsten Mal ... Bis dahin viel Spaß beim Lernen! 🙂