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.
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
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.
Tebrikler, ilk görünümünüzü oluşturmayı az önce tamamladınız!
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.
Ş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:
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.
Ş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.
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.
(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.
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.
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.
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.
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! 🙂