paint-brush
Flix-Finder: Django와 BrightData를 사용하여 영화 추천 앱 구축 [1/3부]by@infinity
3,319
3,319

Flix-Finder: Django와 BrightData를 사용하여 영화 추천 앱 구축 [1/3부]

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

Django 애플리케이션을 사용하면 사용자는 여러 평가 기관의 평가를 기반으로 영화를 필터링할 수 있습니다. BrightData의 서비스를 사용하여 애플리케이션에 필요한 데이터를 가져옵니다. Django를 설치하고 Django 프로젝트를 설정하여 Flix-Finder 구축을 시작해 보겠습니다.
featured image - Flix-Finder: Django와 BrightData를 사용하여 영화 추천 앱 구축 [1/3부]
Rishabh Agarwal HackerNoon profile picture

다음에 어떤 TV 프로그램이나 영화를 볼지 고민한 적이 있나요? 다양한 스트리밍 제공업체에서 액세스할 수 있는 옵션이 너무 많기 때문에 다음 폭로 시청에 대한 결정을 내리는 것은 결코 쉽지 않습니다.


다음 영화를 결정할 때 우리는 주로 IMDB와 같은 여러 평가 기관의 리뷰와 평가에 의존합니다. 그러나 이러한 기관이 풍부하기 때문에 믿을 만한 등급을 선택하는 것이 어려울 수 있습니다.


하지만 이러한 여러 기관에서 좋은 평가를 받은 영화를 보는 것이 더 안전한 경우가 많습니다. 그런데 그런 영화를 찾는 게 어렵지 않나? 예, 그렇습니다!


세 개의 블로그로 구성된 이 시리즈에서 우리는 바로 이 문제를 해결하기 위한 소프트웨어 솔루션을 만들 것입니다! 우리가 Flix-Finder라고 부를 이 Django 애플리케이션을 사용하면 사용자는 여러 평가 기관의 평가를 기반으로 영화를 필터링할 수 있습니다.


BrightData의 서비스를 사용하여 응용 프로그램에 필요한 데이터를 가져옵니다.


그럼 더 이상 고민하지 말고 Flix-Finder 구축을 시작해 보겠습니다.

애플리케이션 설정

이 섹션을 시작하기 전에 Django가 시스템에 설치되어 있는지 확인하세요!


시스템에 Django가 설치되어 있으면 다음 명령이 작동합니다.

python3 -m django --version


시스템에 Django가 설치되어 있지 않은 경우 pip를 사용하여 Django를 설치하세요!

python3 -m pip install Django


Django 프로젝트를 설정하는 것부터 시작하겠습니다. 다음 명령을 사용하여 새 프로젝트를 만듭니다.


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


디렉터리를 새로 생성된 프로젝트 디렉터리 flix_finder 로 변경합니다. 여기에서 즐겨 사용하는 코드 편집기를 엽니다. 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


이러한 파일에 대한 자세한 내용은 Django에서 제공하는 설명을 참조하세요.


Django 서버를 실행하고 localhost:8000 에 접속하여 설정이 제대로 완료되었는지 확인해보세요!


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

새 앱 만들기 및 첫 번째 보기

Django 앱(또는 Django 애플리케이션)은 개별 기능을 캡슐화하는 대규모 Django 프로젝트의 구성 요소를 나타냅니다. Django 앱은 재사용 가능하고 독립적인 구성 요소입니다. 모델, 뷰, 템플릿, 테스트 및 기타 파일로 구성됩니다.

우리 프로젝트의 모든 추천자 로직은 recommender 자라는 애플리케이션에 있습니다. 이 앱을 만들려면 다음 명령을 실행하세요.


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


위 명령은 추천 recommender 새 폴더를 생성합니다. 우리 애플리케이션의 모든 로직은 이 폴더 안에 들어갑니다.


애플리케이션이 성공적으로 생성되었다고 말할 수 있으려면 한 단계가 더 남아 있습니다. flix_finder/settings.py 아래에 있는 INSTALLED_APPS 목록에 새로 생성된 앱의 이름을 추가하세요.


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


이로써 recommender 앱을 성공적으로 만들었습니다.


이제 첫 번째 뷰를 만들어 보겠습니다.


Django에서 뷰는 HTTP 요청을 수신하고 HTTP 응답을 반환하는 Python 함수입니다. 뷰는 일부 비즈니스 논리를 기반으로 사용자에게 데이터를 표시하는 데 중요한 역할을 합니다.


recommender/views.py 아래에 새 메서드를 만듭니다. 이 메소드는 localhost:8000/ 통해 들어오는 요청을 처리합니다. 현재 이 엔드포인트는 단순히 hello 메시지를 반환합니다.


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


요청을 처리하기 위한 뷰 메서드를 만들었지만 (프로젝트에서) 이 뷰에 해당하는 엔드포인트를 지정하지 않았습니다. urls.py 파일에서 이 작업을 수행합니다.


추천 앱 내에 새 파일을 만들고 이름을 urls.py 로 지정합니다. 여기서는 URL과 보기 메서드 간의 대응 관계를 지정합니다.


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


이제 우리는 Django가 이 새로운 URL의 파일을 인식하도록 해야 합니다. flix_finder/urls.py 파일을 다음과 같이 업데이트합니다.


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


아직 서버를 시작하지 않았다면 서버를 시작하고 브라우저에서 localhost:8000 엽니다. 안녕하세요 메시지가 표시되어야 합니다.


추천 앱의 안녕하세요 메시지입니다!


축하합니다. 첫 번째 뷰 생성을 완료했습니다!

템플릿을 사용하자…

동의합시다… 응답으로 문자열을 보내는 것은 가장 멋진 일이 아닙니다. 대신 적절한 HTML 응답을 보내야 합니다. 그리고 이 정확한 목적을 위해 우리는 Django 템플릿을 사용할 것입니다.


recommender 디렉터 아래에 디렉터리 templates 만듭니다. 새로 생성된 이 폴더의 이름은 Django가 기본적으로 templates 라는 디렉토리에서 HTML 파일을 검색하기 때문에 특별합니다.


새로 생성된 디렉터리 내에 index.html 이라는 새 파일을 생성합니다. 이 파일 안에는 사용자가 localhost:8000 방문할 때 렌더링할 HTML을 작성합니다.


여기서는 HTML 작성이 주요 초점이 아니므로 해당 부분에 대한 설명은 건너뛰고 여기 에서 HTML을 복사하면 됩니다.


다음은 이 HTML 파일(또는 Django 템플릿)에 대해 알아야 할 몇 가지 사항입니다.


(1) 이 HTML은 웹페이지에 네 가지 항목(내비게이션 바, 캐러셀, 영화 검색 양식, 영화 검색 결과)을 표시합니다.


(2) Django 템플릿 언어를 사용하여 HTML 내에서 직접 Python 변수를 사용할 수 있습니다.


(3) 컨텍스트(템플릿에 전달된 데이터)에서 featured_movies 변수를 예상하고 이를 사용하여 캐러셀을 표시합니다.


(4) form 변수가 Django Form 개체로 채워질 것으로 예상하고 이를 영화 검색 양식을 표시하는 데 사용합니다.


(5) filtered_movie_list 변수를 예상하고 이를 사용하여 검색 결과를 표시합니다.


(6) 검색 결과 빈 응답이 있는지 여부를 나타내는 no_result_error 변수도 필요합니다.


또한 스타일을 지정하기 위해 일부 CSS를 추가해야 합니다. recommender 디렉터리 아래에 static 디렉터리를 만듭니다. 이 폴더에는 모든 정적 파일이 보관됩니다.


style.css 라는 새 파일을 만들고 이 URL 에서 CSS를 붙여넣습니다.


이를 통해 필요한 모든 HTML과 CSS가 준비되었습니다. 다음으로 영화 검색 양식을 만들어야 합니다.

영화 검색 양식 만들기

템플릿에서는 양식 개체를 제공해야 하므로 양식 개체를 만들어야 합니다.

Django Forms가 무엇인지 모르시나요? ChatGPT를 읽고 이에 대해 설명하세요.

Django 양식은 HTML 양식을 만들고 작업하는 데 사용되는 Django 프레임워크의 모듈입니다. 일반 HTML 양식을 사용하는 것보다 몇 가지 장점이 있습니다.

  • HTML 자동 렌더링. Django 양식 클래스를 정의하면 Django는 이를 HTML 양식으로 렌더링합니다.
  • 데이터 검증. Django 양식은 제출된 데이터의 유효성을 검사하고 저장하기 전에 정리합니다.
  • 데이터를 양식에 바인딩합니다. 편집을 위해 사용자에게 표시하기 위해 기존 데이터를 양식에 바인딩할 수 있습니다.

추천자의 앱 디렉터리 내에 forms.py 라는 파일을 만듭니다. 여기에 다음 코드를 추가하세요.


 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)


방금 수행한 작업은 영화 검색 양식에 대한 양식 클래스를 생성한 것입니다. 이 양식에는 수업에서 설명한 대로 두 개의 필드가 포함됩니다. 양식에 대해 더 자세히 알고 싶다면 여기를 확인하세요.

인덱스 보기 업데이트

템플릿에 필요한 모든 사항이 설정되었으므로 이제 새로 생성된 템플릿을 사용하도록 보기 메서드를 업데이트해야 합니다.


 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)


서버를 시작하고 localhost:8000 으로 이동하세요. 다음 페이지가 표시됩니다.


Flix-Finder 홈페이지


BrightData의 IMDB 데이터

모든 보기, URL, 템플릿 및 양식이 준비되었으므로 이제 애플리케이션이 작동할 데이터를 고려할 수 있습니다. 우리 프로그램에는 여러 평가 기관(IMDB, 우선)의 데이터가 필요합니다.


불행하게도 우리가 이 데이터를 검색할 수 있는 잘 정의된 API는 없습니다. 이 정보를 얻는 한 가지 방법은 Python Selenium을 사용하여 자체 스크레이퍼를 만드는 것입니다. 그러나 이를 위해서는 더 많은 작업이 필요하며 모든 사람이 그러한 기술에 만족하는 것은 아닙니다.


더 나은 솔루션은 BrightData와 같은 타사 서비스를 사용하는 것입니다. BrightData를 사용하면 이러한 모든 정보를 쉽게 얻을 수 있습니다.


첫 번째 부분에서는 BrightData의 사전 선별된 IMDB 데이터 세트를 사용합니다. 이는 BrightData에서 사용할 수 있는 많은 데이터 세트 중 하나입니다. 이것이 우리가 그것을 얻을 수 있는 방법입니다.


(1) BrightData에 계정을 등록합니다.


(2) 브라우저에서 brightdata.com/cp/datasets 로 이동하거나 왼쪽에서 Datasets & WebScraper IDE 메뉴를 엽니다.

BrightData의 데이터 세트 및 WebScraper IDE 메뉴

(3) Dataset Marketplace로 이동하여 IMDB media dataset 검색합니다.


(4) 데이터세트 보기를 클릭하고, CSV 형식의 샘플 데이터세트를 다운로드합니다.


다운로드가 완료되면 파일 이름을 IMDB.csv 로 바꾸고 recommender/static 폴더에 넣습니다. 이 샘플 CSV에는 1000개 이상의 영화에 대한 28개의 IMDB 속성이 포함되어 있습니다. 우리 애플리케이션은 이 부분에 대한 IMDB 데이터 세트에서 작동합니다.

양식 제출을 수신하기 위해 인덱스 보기 업데이트

검색 요청을 처리하기 위해 보기 메서드를 업데이트하겠습니다.


양식의 모든 검색 요청은 POST 요청으로 도착합니다. 양식이 올바르게 작성되었는지 확인한 후 다운로드한 CSV 파일의 모든 영화를 나열하고 필터 기준과 일치하지 않는 영화를 필터링합니다. 업데이트된 코드는 다음과 같습니다.


 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_filter_imdb_movie_list 메소드의 구현은 Django에만 국한된 것이 아니며 순수한 Python입니다. 따라서 여기서는 이에 대해 이야기하지 않겠습니다. 전체 views.py 파일은 여기에서 찾을 수 있습니다.

최종 제품

이 지점에 도달한 것을 축하합니다. 모든 단계를 올바르게 수행하셨다면 서버를 실행하고 UI를 통해 검색을 수행하실 수 있습니다. 검색 결과는 다음과 같습니다.


최소 IMDB 등급 8.0 및 출시 연도 2022에 대한 검색 결과를 보여주는 웹 페이지입니다.


이 시리즈의 코드

이 시리즈의 일부로 생성된 모든 코드는 GitHub 저장소에서 사용할 수 있습니다. 이 부분의 최종 결과는 Part1 이라는 분기 에 포함되어 있습니다.


코드가 리포지토리에 있는 코드와 교차 검사되어 문제가 있는지 확인하는 것은 항상 좋은 생각입니다.


끝 맺는 말

이로써 우리는 3부작 시리즈의 첫 번째 부분을 마칩니다. 다음 부분에서는 BrightData의 WebScraper IDE를 사용하여 다른 평가 기관으로부터 데이터를 수집하겠습니다. 그런 다음 양식을 업데이트하여 사용자가 더 복잡한 검색을 수행할 수 있도록 합니다.


또한 Carousel 구성요소를 동적으로 만들 예정입니다!


다음에 또 만나요… 그때까지 Happy Learning! 🙂