본문 바로가기
DEV/Web 개발

Web 개발 :: Django rest framework, 추천 시스템 _TIL#46

by 올커 2022. 11. 8.

■ JITHub 개발일지 46일차

 

□  TIL(Today I Learned) ::

파이썬 Django Rest Framework, Front-end, 추천서비스 기능 구현

  - html 프론트엔드 작업을 할 때 전날과 같이 여전히 버튼을 눌렀을 때 로드하는 데 문제가 있었다.

 버튼은 a태그이거나, button으로 구성했었다. 또, 링크는 onclick을 통해 함수를 호출하거나, href를 통해 템플릿을 불러왔다.

<a onclick="function()">버튼01</a>
<a href='/song_rcm_list.html'>버튼02</a>

  - 실행했을 때 콘솔창을 보면, 새로 페이지를 로드할 때 전혀 변화가 없었고, F5키를 누르거나, 주소창에 url을 다시 입력 후 로드할 때에 동작하게 되었다. 아마도 자바스크립트 문법 또는 템플릿과의 충돌일 가능성이 높은데 정확하게 어떤 부분인지는 확인하지 못했다. 하지만 아래 코드를 사용하여 해결할 수 있었다.

<a onclick="location.href='/song_rcm_list.html'">버튼03</a>

  - 위에서 시도했던 onclick과 href가 조합된 모습의 코드였다. 페이지를 로드할 때 onclick="location.href='url'" 또는 onclick="window.open('url')" 등과같이 로드하는 방법이 있다. 같은 듯 다른듯한 코드들.. Javascript를 더 깊이 공부하면 이해할 수 있을지 싶다.


 - 프로젝트 막바지에 와서 유튜브 웹 크롤링을 할 수 있을까 고민하게 되었다. 아니, 1500개나 되는 각 노래에 유튜브 링크를 달아야 했다. 직접 달려면 엄청난 노가다가 필요했다. 그래서 크롤링을 찾아보니, selenium, 그리고 beautifulsoup를 많이 사용하는 듯 했고, 찾아보니 좋은 방법들이 있었다. 아래는 찾아보았던 코드를 직접 커스터마이징했던 부분이다.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import time
import random
import pandas as pd

import sqlite3


import sys
import os
import django

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Music_Recommend.settings')
django.setup()

from songs.models import Song

from selenium.webdriver.chrome.service import Service
service = Service(ChromeDriverManager().install())


# DB에서 데이터 가져오기
data = pd.DataFrame(list(Song.objects.values()))

print(data.title[0])

data_f = pd.DataFrame()

for i in range(len(data.title)):
    SEARCH_KEYWORD = data.title[i].replace(' ', '+')

    driver = webdriver.Chrome(service=service)
    URL = "https://www.youtube.com/results?search_query=" + SEARCH_KEYWORD
    driver.get(URL)
    time.sleep(3)

    # 페이지 소스 추출
    html_source = driver.page_source
    soup_source = BeautifulSoup(html_source, 'html.parser')

    # 콘텐츠 모든 정보
    content_total = soup_source.find_all(class_ = 'yt-simple-endpoint style-scope ytd-video-renderer')
    # # 콘텐츠 제목만 추출
    content_total_title = list(map(lambda data: data.get_text().replace("\n", ""), content_total))
    # 콘텐츠 링크만 추출
    content_total_link = list(map(lambda data: "https://youtube.com" + data["href"], content_total))


    # content_record_src = soup_source.find_all(class_ = 'style-scope ytd-video-meta-block')


    # 딕셔너리 포맷팅
    content_total_dict = {'title'       : content_total_title, 
                        'link'        : content_total_link, 
                        }


    # 데이터 프레임 포맷팅
    df = pd.DataFrame(content_total_dict)
    df.to_csv(f"./data/content{i}.csv", encoding='utf-8-sig')
    # data_f.append(df)


# # 데이터 저장
# df.to_csv("./data/content_total.csv", encoding='utf-8-sig')

# youtube Data 이동

 - 최상단에 보면 많은 것들을 임포트해온다. pip 설치도 미리 해두어야 한다.  - django를 사용하기 때문에 이전처럼 import sys, os, django와 BASE_DIR과 환경설정을 꼭 해준다. (그렇지 않으면 사용할 모델을 임포트해오지 못한다.) - 위의 코드로 진행을 하였지만, 최종적으로는 사용하지 못했다. 그 이유는, 1500개 되는 데이터를 for문을 통해 계속 진행하다보니 약 39번째 순서에서 error가 발생했고, 에러 내용이 gpu 관련된 내용이었다. 사실 좀 더 확인이 필요했으나 시간관계상 확인하지 못했다.  - 또 아쉬웠던 점은, 특정 키워드로 검색한 유튜브 페이지를 돌면서 해당되는 페이지에 뜨는 모든 영상 제목과 링크를 가져오는데, 우리의 목적은 하나의 검색당 하나의 영상정보들만 가져와서 1500개를 차곡차곡 csv파일로 쌓는 것이었다. 하지만 지금의 코드는 하나의 페이지에 약 20개이상의 동일한 검색어에 대한 검색결과가 쌓이고 있었다. (*1500개를 완료하면 csv를 모두 또 한번 돌려서 제일 첫 행을 불러와서 하나로 합치는 작업을 생각하고 있었다.)

 - 계속해서 코딩을 할 수록 느끼는 점은 나의 코딩실력이 느는 느낌보다는 점점 어떻게 코드를 풀어나갈까 고민을 많이하고, 이에 대한 해결책을 내는 사고가 커지는 느낌이 든다는 것이다. 사실 부끄럽지만 나는 코딩은 안쓰면 며칠 지나면 명령어도 잘 기억이 안난다.(자주 반복하는 것이 필요@!) 그래도 문제를 해결할 때 '어떻게 사고해서 해결해나가면 되겠구나' 라는 생각은 점점 커지는 것 같다. (물론 이번 프로젝트에서도 하나의 에러로 몇 시간 째 고민했던 점은 똑같다..)

 - 또 팀장을 2번 연임하면서, 그리고 발표도 계속하게 되면서 아직도 많이 부족하지만 계속 단단히 다져지는 듯 하다. 발표 전에는 아직 떨리는 느낌이 있지만, 발표를 시작하면 말을 하면서 긴장이 풀리는 느낌을 받는다. 또는 좋은 멘트를 하였을 때 기분이 많이 안정된다.

 - 앞으로도 꾸준한 노력을 통해 좋은 기회들을 내 것으로 만들어나가야겠다.

반응형

댓글