멜론 플레이리스트 가져오기
들고양이

Lv.1 들고양이 (39.♡.127.109)

2024년 9월 19일 AM 08:00 · 수정됨(19:04)

조회 2,368 공감 0

최근에 애플뮤직을 2개월 무료로 사용하게 됐는데, 막상 즐기려니 일일이 노래 정리하기도 버겁더군요.

멜론에는, 여러 DJ(?)님들이 나름 엄선한 노래들이 많이 있어서 가져 올 방법을 찾다가 한 블로거님의 글을 참고로 노래들을 가져와서 txt파일로 정리하는 파이썬 코드를 하나 짜집기 해 봤습니다.

혹시라도, 누군가 도움이 되시면 좋겠다 싶어서 올립니다.

사용법 : 
멜론 > 멜론DJ로 들어가셔서 적절한 노래모음이 있다면 링크에서 마지막 숫자를 따 줍니다.

예 : https://www.melon.com/mymusic/dj/mymusicdjplaylistview_inform.htm?plylstSeq=531670163

# 플레이리스트 ID 리스트
plylstSeq_list= ['439213662', '517415328', '531670163']
이 부분에 필요한 만큼 넣어 줍니다.


그리고, 실행하시면 txt파일이 생성됩니다. 

생성된 파일을 TuneMyMusic 에서 소스선택 > 자유텍스트(복사 - 붙여넣기) or 파일 업로드해서 각자 필요한 곳(애플뮤직, 스포티파이, 유튜브 등 등...)으로 가져가시면 되겠습니다.


[code=python]# -*-coding: utf-8-*-

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

from webdriver_manager.chrome import ChromeDriverManager

import time

import re


def get_song_artist_data():

song_list_len = len(driver.find_elements(By.XPATH, '//*[@id="frm"]/div/table/tbody/tr'))

for i4 in range(1, song_list_len + 1):

song_name_elements = driver.find_elements(By.XPATH, f'//*[@id="frm"]/div/table/tbody/tr[{i4}]/td[5]/div/div/div[1]/span/a')

if song_name_elements:

song_name = song_name_elements[0].text.strip()

song.append(song_name)

else:

song.append("Unknown Song")


artist_name_elements = driver.find_elements(By.XPATH, f'//*[@id="frm"]/div/table/tbody/tr[{i4}]/td[5]/div/div/div[2]/a')

if artist_name_elements:

artist_name = artist_name_elements[0].text.strip()

singer.append(artist_name)

else:

singer.append("Unknown Artist")



def scrape_page_and_navigate():

get_song_artist_data()


for i in range(1, len(driver.find_elements(By.CSS_SELECTOR, '#pageObjNavgation > div > span.page_num > a')) + 1):

driver.find_element(By.XPATH, f'//*[@id="pageObjNavgation"]/div/span/a[{i}]').click()

driver.implicitly_wait(2)

time.sleep(0.3)

get_song_artist_data()


try:

next_button = driver.find_element(By.XPATH, '//*[@id="pageObjNavgation"]/div/a[@class="next"]')

if next_button:

next_button.click()

driver.implicitly_wait(2)

time.sleep(0.3)

scrape_page_and_navigate()

except Exception as e:

print("더 이상 'next' 버튼이 없습니다.")

pass


def scrape_playlist(plylstSeq):

# 멜론 플레이리스트 링크로 접속

base_url = 'https://www.melon.com/mymusic/dj/mymusicdjplaylistview_inform.htm'

url = f'{base_url}?plylstSeq={plylstSeq}'

driver.get(url)

driver.implicitly_wait(2)


# 플레이리스트 제목 가져오기

playlist_title = re.sub(r'[\/:*?"<>|]', '', driver.find_element(By.XPATH, '//*[@id="conts"]/div[2]/div/div[2]/div[1]/div[1]').text.strip())


# 데이터 수집 리스트 초기화

global song, singer

song = []

singer = []


# 데이터 수집 시작

scrape_page_and_navigate()


# 파일 저장

filename = f'./{playlist_title}.txt'

with open(filename, 'w', encoding='utf-8') as f:

for song_name, artist_name in zip(song, singer):

f.write(f"{artist_name} - {song_name}\n")

print(f"파일 생성 완료: {filename}")


# 크롬 드라이버 설정

chrome_options = Options()

chrome_options.add_argument("--headless")

chrome_options.add_argument("--no-sandbox")

chrome_options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

driver.implicitly_wait(2)


# 플레이리스트 ID 리스트

plylstSeq_list = ['439213662', '517415328', '480011338'] # ID리스트는 ['439213662', '517415328', '480011338'] 이런 식으로 넣어 줄 것.


# 여러 개의 플레이리스트 처리

for plylstSeq in plylstSeq_list:

scrape_playlist(plylstSeq)


# 드라이버 종료

driver.quit()[/code]

댓글 (6)

  • Ortega

    Ortega Lv.1

    24.09.19 · 118.♡.89.31

    플레이리스트를 텍스트화해서 긁어와선
    그 텍스트파일을 어떻게 쓰는방식인가요?
    유튜브뮤직 삼성뮤직 애플뮤직
    멜론 벅스 지니등
    핸폰마다 플레이앱이 달라서
  • 들고양이

    들고양이 Lv.1 → Ortega 작성자

    24.09.19 · 39.♡.127.109

    글의 링크 부분(TuneMyMusic)을 들어가 보시면 각각의 스트리밍 서비스로 옮길 수 있어요.
    저도 TuneMyMusic를 통해서 애플뮤직으로 옮겨서 듣고 있습니다.
  • 이슬이

    이슬이 Lv.1

    24.09.19 · 112.♡.193.176

    감사합니다. 잘 쓰겠습니다.
  • 이슬이

    이슬이 Lv.1 → 이슬이

    24.09.19 · 39.♡.143.57

    지금 사용하고 있는데.. 정말 좋네요... 덕분에 멜론에서 이것저것 가져오고 있습니다. ^^

    @sdk님.. 이런 좋은 글은 자유게시판에 있는 것보다 강좌 및 팁 게시판에서 많은 분들이 보실 수 있는게 좋지 않을까 싶네요.
  • 들고양이

    들고양이 Lv.1 → 이슬이 작성자

    24.09.19 · 39.♡.127.109

    감사합니다. 잘 된다니 저도 기분이 좋네요. ㅎㅎㅎ
  • 월하가연 Lv.1

    24.09.19 · 115.♡.251.148

    감사합니다~ 저도 잘 쓰겠습니다~

댓글을 작성하려면 이 필요합니다.