멜론 TOP 100 차트 크롤링과 스포티파이 검색 기능을 이용하여
Music DB를 검색하는 과정을 거쳤다.
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
from collections import defaultdict
from musics.models import Music
from bs4 import BeautifulSoup
import requests
def Top_100_list():
sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials(client_id="", client_secret=""))
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'}
response = requests.get('https://www.melon.com/chart/index.htm',headers=header) #멜론차트는 헤더정보를 입력해줘야 한다.
html = response.text
#BeautifulSoup import
soup = BeautifulSoup(html, 'html.parser') #html.parser를 사용해서 soup에 넣겠다
title = soup.find_all("div",{"class":"ellipsis rank01"}) #노래제목
singer = soup.find_all("div",{"class":"ellipsis rank02"}) #가수
real_title = []
real_singer = []
for i in title:
real_title.append(i.find('a').text)
for j in singer:
real_singer.append(j.find('a').text)
rank = 15 # 여기서 몇 위까지 띄울 예정인지 (최대:100위)
results = [] # Music [1위] [2] [3] [4] [5]
for r in range(rank):
# 검색하는 경우
search_result = sp.search(real_title[r],1,0,"track",market='KR')
name = search_result["tracks"]["items"][0]["name"]
music_image = search_result["tracks"]["items"][0]["album"]["images"][1]["url"]
album = search_result["tracks"]["items"][0]["album"]["name"]
year = search_result["tracks"]["items"][0]["album"]["release_date"][:4]
artist = search_result["tracks"]["items"][0]["album"]["artists"][0]["name"]
try: # 노래가 DB에 담겨 있다면
Music.objects.get(name=name) # get하고 pass한다.
pass
except: # 노래가 DB에 담겨있지 않다면
music = Music()
music.name = name
music.music_image = music_image
music.album = album
music.year = year
music.artists = artist
music.save() # DB에 저장해준다.
results.append(Music.objects.get(name=name)) # DB에 추가해준다!
return results
여기서 try/except를 사용하여 노래가 DB에 담겨있으면 그대로 get하여 가져오고
노래가 DB에 담겨있지 않다면 Music DB에 저장 후 추가를 해주는 과정이 중요하다!