paint-brush
Flix-Finder: Django ve BrightData ile Film Önerisi Uygulaması Oluşturma [Bölüm 1/3]ile@infinity
3,348 okumalar
3,348 okumalar

Flix-Finder: Django ve BrightData ile Film Önerisi Uygulaması Oluşturma [Bölüm 1/3]

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

Çok uzun; Okumak

Django uygulaması, kullanıcının filmleri çeşitli derecelendirme kuruluşlarından alınan derecelendirmelere göre filtrelemesine olanak tanıyacak. Uygulamamız için gerekli verileri almak için BrightData hizmetlerini kullanacağız. Django'yu kurup Django projemizi kurarak Flix-Finder'ı oluşturmaya başlayalım.
featured image - Flix-Finder: Django ve BrightData ile Film Önerisi Uygulaması Oluşturma [Bölüm 1/3]
Rishabh Agarwal HackerNoon profile picture

Hangi diziyi veya filmi izleyeceğinize karar vermekte hiç zorlandınız mı? Bir sonraki art arda izlemeniz hakkında karar vermek hiçbir zaman kolay değildir çünkü farklı yayın sağlayıcılarında erişilebilen çok fazla seçenek vardır.


Bir sonraki filmimize karar verirken öncelikle çeşitli derecelendirme kuruluşlarının (IMDB gibi) incelemelerine ve derecelendirmelerine güveniyoruz. Ancak bu kurumların çokluğu göz önüne alındığında hangi derecelendirmeye inanılacağını seçmek zor olabilir.


Bununla birlikte, bu kuruluşların bir kısmından iyi not almış bir filmi izlemek çoğu zaman daha güvenlidir. Peki böyle bir filmi bulmak zor değil mi? Evet öyle!


Bu üç blog serimizde tam da bu sorunu çözecek bir yazılım çözümü oluşturacağız! Flix-Finder adını vereceğimiz bu Django uygulaması, kullanıcının filmleri çeşitli derecelendirme kuruluşlarından aldığı derecelendirmelere göre filtrelemesine olanak tanıyacak.


Uygulamamız için gerekli verileri almak amacıyla BrightData'nın hizmetlerini kullanacağız.


Lafı daha fazla uzatmadan Flix-Finder'ı oluşturmaya başlayalım.

Uygulamanın Kurulumu

Bu bölüme başlamadan önce sisteminizde Django'nun kurulu olduğundan emin olun!


Sisteminizde Django yüklüyse aşağıdaki komut çalışmalıdır.

python3 -m django --version


Sisteminizde yüklü değilse Django'yu yüklemek için pip kullanın!

python3 -m pip install Django


Django projemizi kurarak başlayalım. Aşağıdaki komutu kullanarak yeni bir proje oluşturun.


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


Dizini yeni oluşturulan proje dizini flix_finder ile değiştirin. Favori kod düzenleyicinizi burada açın. Django tarafından otomatik olarak oluşturulan bu dizinde aşağıdaki dosyaları görmelisiniz.


 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


Bu dosyalar hakkında daha fazla bilgi edinmek için Django tarafından sağlanan bu açıklamaya bakın.


Kurulumun düzgün bir şekilde tamamlandığından emin olmak için Django sunucusunu çalıştırmayı ve localhost:8000 erişmeyi deneyin!


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

Yeni Bir Uygulama Oluşturmak ve İlk Görünümümüz

Bir Django uygulaması (veya Django uygulaması), bireysel bir özelliği veya işlevselliği kapsayan daha büyük bir Django projesinin bir bileşenini ifade eder. Django uygulamaları yeniden kullanılabilir ve bağımsız bileşenlerdir. Modeller, görünümler, şablonlar, testler ve diğer dosyalardan oluşurlar.

Projemiz için öneri mantığının tümü, recommender adı verilen bir uygulamada bulunacaktır. Bu uygulamayı oluşturmak için aşağıdaki komutu çalıştırın.


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


Yukarıdaki komut, recommender adında yeni bir klasör oluşturacaktır. Uygulamamızın tüm mantığı bu klasörün içine girecektir.


Uygulamamızın başarıyla oluşturulduğunu söyleyebilmemiz için bir adım daha kaldı. Devam edin ve yeni oluşturulan uygulamanın adını flix_finder/settings.py altında bulunan INSTALLED_APPS listesine ekleyin.


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


Bununla recommender uygulamamızı başarıyla oluşturduk.


Şimdi ilk view’ımızı oluşturalım.


Django'da görünümler, HTTP isteklerini alan ve HTTP yanıtlarını döndüren Python işlevleridir. Görünümler, bazı iş mantıklarına dayalı olarak verilerin kullanıcılara sunulmasında önemli bir rol oynar.


recommender/views.py altında yeni bir yöntem oluşturun. Bu yöntem localhost:8000/ üzerinden gelen istekleri karşılayacaktır. Şimdilik bu uç nokta yalnızca bir merhaba mesajı döndürüyor.


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


İsteği işlemek için görünüm yöntemini oluşturduk, ancak hangi uç noktaların bu görünüme karşılık geldiğini (projemizde) belirtmedik. Bunu urls.py dosyalarında yapıyoruz.


Tavsiye uygulamasının içinde yeni bir dosya oluşturun ve onu urls.py olarak adlandırın. Burada URL ile view metodu arasındaki bu eşleşmeyi belirtiyoruz.


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


Şimdi Django'nun bu yeni URL dosyasından haberdar olmasını sağlamamız gerekiyor. flix_finder/urls.py dosyasını aşağıdaki şekilde güncelleyin.


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


Henüz yapmadıysanız sunucunuzu başlatın ve tarayıcınızda localhost:8000 açın. Merhaba mesajını görmelisiniz.


Tavsiye Uygulamamızdan merhaba mesajı!


Tebrikler, ilk görünümünüzü oluşturmayı az önce tamamladınız!

Şablonları Kullanalım…

Kabul edelim… yanıt olarak bir dize göndermek pek hoş bir şey değil. Bunun yerine uygun bir HTML yanıtı göndermeliyiz. Ve tam da bu amaç için Django Şablonlarını kullanacağız.


recommender yöneticisinin altında bir dizin templates oluşturun. Yeni oluşturulan bu klasörün adı, Django'nun varsayılan olarak templates adlı dizinlerde HTML dosyalarını araması nedeniyle özeldir.


Yeni oluşturulan dizinin içinde index.html adında yeni bir dosya oluşturun. Bu dosyanın içine kullanıcılar localhost:8000 ziyaret ettiğinde oluşturmak istediğimiz HTML'yi yazacağız.


Burada asıl odak nokta HTML yazmak olmadığından bu kısmı açıklamayı atlayacağım ve buradan HTML'yi kolayca kopyalayabilirsiniz.


Bu HTML dosyası (veya Django şablonu) hakkında bilmeniz gereken bazı şeyler şunlardır:


(1) Bu HTML, web sayfasında dört şeyi görüntüler: Gezinme çubuğu, Atlıkarınca, Film Arama Formu ve Film Arama Sonuçları.


(2) Python değişkenlerinin doğrudan HTML içinde kullanılmasına izin vermek için Django şablon dilini kullanır.


(3) Bağlamda featured_movies değişkenini bekler (şablona aktarılan veriler) ve bunu atlı karıncayı görüntülemek için kullanır.


(4) form değişkeninin bir Django Form nesnesiyle doldurulmasını bekler ve bunu Film Arama Formunu görüntülemek için kullanır.


(5) filtered_movie_list değişkenini bekler ve bunu arama sonuçlarını görüntülemek için kullanır.


(6) Ayrıca, aramanın boş bir yanıtla sonuçlanıp sonuçlanmadığını gösteren no_result_error değişkenini de bekler.


Ayrıca stillendirme için biraz CSS eklememiz gerekecek. recommender dizini altında static bir dizin oluşturun. Bu klasör tüm statik dosyaları tutacaktır.


style.css adında yeni bir dosya oluşturun ve bu URL'deki CSS'yi yapıştırın.


Bununla birlikte, gerekli tüm HTML ve CSS'ye sahibiz. Daha sonra Film Arama formunu oluşturmamız gerekiyor.

Film Arama Formu Oluşturma

Şablonumuz bir form nesnesi sağlamamızı gerektirdiğinden bir tane oluşturmamız gerekecek.

Django Formlarının ne olduğundan emin değil misiniz? ChatGPT'yi okuyun, bunu açıklayın -

Django formları, Django çerçevesinde HTML formları oluşturmak ve bunlarla çalışmak için kullanılan bir modüldür. Düz HTML formlarını kullanmaya göre çeşitli avantajlar sağlarlar:

  • HTML'nin otomatik olarak oluşturulması. Bir Django form sınıfı tanımlarsınız ve Django bunu bir HTML formu olarak işler.
  • Verilerin doğrulanması. Django formları gönderilen verileri doğrular ve kaydetmeden önce temizler.
  • Verileri formlara bağlama. Mevcut verileri, düzenleme amacıyla kullanıcıya görüntülenmek üzere bir forma bağlayabilirsiniz.

Tavsiye edenin uygulama dizininde forms.py adında bir dosya oluşturun. Aşağıdaki kodu buna ekleyin.


 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)


Az önce yaptığımız şey, Film Arama Formumuz için bir form sınıfı oluşturmaktı. Bu form sınıfta anlatıldığı gibi iki alan içerecektir. Formlar hakkında daha fazla bilgi edinmek istiyorsanız buna göz atın.

Dizin Görünümünü Güncelleme

Şablonlar için gereken her şey ayarlandığında, artık bu yeni oluşturulan şablonu kullanmak için görünüm yöntemimizi güncellememiz gerekiyor.


 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)


Sunucunuzu başlatın ve localhost:8000 adresine gidin. Aşağıdaki sayfayı görmelisiniz.


Flix-Finder'ın ana sayfası


BrightData'dan IMDB Verileri

Tüm görünümler, URL'ler, şablonlar ve formlar mevcut olduğundan artık uygulamamızın üzerinde çalışacağı verileri dikkate alabiliriz. Programımız, başlangıçta birden fazla derecelendirme kuruluşundan (IMDB) veri gerektirecektir.


Ne yazık ki bu verileri alabileceğimiz iyi tanımlanmış bir API yok. Bu bilgiyi elde etmenin bir yöntemi Python Selenium kullanarak kendi kazıyıcılarımızı oluşturmaktır. Ancak bu daha fazla çalışma gerektirecektir ve herkes bu tür teknolojilerden memnun değildir.


BrightData gibi üçüncü taraf hizmetleri kullanmak daha iyi bir çözümdür. BrightData tüm bu bilgilerin elde edilmesini kolaylaştırır.


Bu 1. bölüm için BrightData'nın önceden seçilmiş bir IMDB veri kümesini kullanacağız. Bu, BrightData'da bulunan birçok veri kümesinden biridir. Bu şekilde elde edebiliriz.


(1) BrightData'da bir hesap için kaydolun.


(2) Tarayıcıdan brightdata.com/cp/datasets adresine gidin veya soldan Datasets & WebScraper IDE menüsünü açın.

BrightData'da Veri Kümeleri ve WebScraper IDE Menüsü

(3) Dataset Marketplace'e gidin ve IMDB media dataset arayın.


(4) Veri Kümesini Görüntüle'ye tıklayın ve örnek veri kümesini CSV formatında indirin.


İndirdikten sonra dosyayı IMDB.csv olarak yeniden adlandırın ve recommender/static klasörün içine yerleştirin. Bu örnek CSV, 1000'den fazla film için 28 IMDB özelliği içerir. Uygulamamız bu kısım için bu IMDB veri seti üzerinde çalışacaktır.

Form Gönderimi Almak İçin Dizin Görünümünü Güncelleme

Arama isteklerini işlemek için görünüm yöntemini güncelleyelim.


Formdaki tüm arama istekleri POST istekleri olarak gelir. Formun doğru şekilde doldurulduğunu onayladıktan sonra indirilen CSV dosyasındaki tüm filmleri listeleyeceğiz ve filtre kriterlerine uymayanları filtreleyeceğiz. Güncellenen kodun nasıl göründüğü aşağıda açıklanmıştır.


 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)


_getIMDBMovieDataList ve _filter_imdb_movie_list yöntemlerinin uygulanması Django'ya özgü bir şey değildir ve yalnızca saf Python'dur. Bu nedenle burada bunun hakkında konuşmayı atlıyorum. views.py dosyasının tamamını burada bulabilirsiniz.

Son ürün

Bu noktaya ulaştığınız için tebrikler. Tüm adımları doğru bir şekilde izlediyseniz, sunucuyu çalıştırabilmeniz ve kullanıcı arayüzü üzerinden arama yapabilmeniz gerekir. Arama sonuçlarının nasıl görüneceği aşağıda açıklanmıştır.


Minimum IMDB Derecelendirmesi 8.0 ve Yayın Yılı 2022 için arama sonucunu gösteren web sayfası.


Bu Serinin Kodu

Bu serinin bir parçası olarak oluşturulan tüm kodlar bu GitHub deposunda mevcut olacaktır. Bu bölümün nihai sonucu Part1 adlı bu dalda yer almaktadır.


Bir şeylerin yanlış olup olmadığını kontrol etmek için kodunuzu depoda bulunan kodla çapraz kontrol etmek her zaman iyi bir fikirdir.


Son sözler

Böylelikle üç bölümlük serimizin ilk bölümünün sonuna gelmiş bulunuyoruz. Bir sonraki bölümde diğer derecelendirme kuruluşlarından veri toplamak için BrightData'nın WebScraper IDE'sini kullanacağız. Daha sonra formumuzu güncelleyeceğiz, böylece kullanıcıların daha karmaşık aramalar yapmasına olanak tanıyacağız.


Ayrıca Carousel bileşenini de dinamik hale getireceğiz!


Bir dahaki sefere görüşürüz… O zamana kadar, Mutlu Öğrenmeler! 🙂