훈훈훈

파이썬 : API를 이용한 최신 음악 리스트 크롤러(Crawler) 만들기 본문

파이썬/Python

파이썬 : API를 이용한 최신 음악 리스트 크롤러(Crawler) 만들기

훈훈훈 2020. 2. 11. 21:38

파이썬(python) 언어로 최신 음악 리스트를 가져오는 크롤러를 만들어보았다.

크롤러 대상 사이트는 음원 사이트인 FLO를 이용하였고 웹 사이트에서 제공하는 API를 이용하였다.

 

# 사이트

https://www.music-flo.com/new/track?sortType=KPOP

 

위 사이트에 접속하면 아래와 같이 최신 음악을 볼 수 있는 페이지가 출력이 된다.

해당 페이지에서 개발자 모드(F12) 접속 후 Network 탭에 있는 API를 사용하려고 한다.

- API URL : https://www.music-flo.com/api/meta/v1/track/KPOP/new?page=1&size=100×tamp=1581420059879

 

위 주소로 접속 하면 아래와 같이 Json 형태의 데이터를 볼 수 있다.

이제 이 데이터를 이용하여 최신 음악을 크롤랑 하려고 한다.

 

참고로 Chrome 브라우저는 확장 프로그램에서 JSON Viewer를 받아야 아래와 같이 정상적으로 확인할 수 있다.

- 다운로드 URL : https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh?hl=ko

 

# 전체 코드

전체 코드는 아래와 같으며 이제 부분 부분 살펴보려고 한다.

import requests
from bs4 import BeautifulSoup

req  = requests.get('https://www.music-flo.com/api/meta/v1/track/KPOP/new?page=1&size=100&timestamp=1581420059879')
data = req.json()

new_musics = data['data']['list']
result     = []

for new_music in new_musics:
    result.append({
        'title'   : new_music['name'],
        'artist'  : new_music['artistList'][0]['name']
        })

for value in result:
    print(value)

 

# 모듈

import requests
from bs4 import BeautifulSoup

크롤링을 하기위해 'requests' 'BeautifulSoup' 모듈을 사용하였다. 해당 모듈은 pip install로 다운 받을 수 있다.

requests 모듈은 HTTP 통신 요청을 할때 사용되며 BeautifulSoup은 HTML 데이터를 불러오고 가공할때 사용된다.

 

# 변수

req  = requests.get('https://www.music-flo.com/api/meta/v1/track/KPOP/new?page=1&size=100&timestamp=1581420059879')
data = req.json()

new_musics = data['data']['list']

먼저 API UR로 get 요청을 보내 받은 response 데이터를 data에 저장 후, new_musics 라는 리스트를 만들었다.

해당 리스트에는 아래와 같은 정보가 입력된 것을 확인할 수 있다.

 

# 데이터 가공

result     = []

for new_music in new_musics:
    result.append({
        'title'   : new_music['name'],
        'artist' : new_music['artistList'][0]['name']
        })

for value in result:
    print(value)

이제 Json 형태로 전달 받은 데이터를 가공하기 위해 result 라는 리스트를 만들어 'title'과 'artist' 데이터만 추출하려고한다.

artist 데이터는 리스트안에 튜블이 있는 형태로 아래와 같은 형식으로 저장되어있기 때문에 인덱스 0번에서 'name'으로 추출하였다.

>>> a['artistList']
[{'id': 44811, 'name': '이브 (Eve)'}]
>>> a['artistList'][0]
{'id': 44811, 'name': '이브 (Eve)'}
>>> a['artistList'][0]['name']
'이브 (Eve)'

 

# 결과

실행하면 다음과 같이 정보를 추출할 수 있다.

{'title': '무릎을 탁 치고 (Hands Up)', 'artist': '체리블렛 (Cherry Bullet)'}
{'title': '밤하늘의 별을 11 (With 배윤진, 권주영)', 'artist': '양정승 (Kiroy Y)'}
{'title': '가시나무 (Live Ver.)', 'artist': '정승환'}
{'title': '이어폰', 'artist': '이천원'}
{'title': '몰랐어 니가 그렇게 힘들 줄은', 'artist': '파니니 브런치 (PANINI BRUNCH)'}
{'title': 'too late', 'artist': 'OuiOui (위위)'}
...
{'title': 'Zipper Bag (Prod. Ourealgoat)', 'artist': 'Ourealgoat (아우릴고트)'}
{'title': 'Gonna Go Far, Kid (Feat. Lil 9ap, KOR KASH) (Prod. Ourealgoat)', 'artist': 'Ourealgoat (아우릴고트)'}
{'title': 'IAMDDB (Prod. APRO)', 'artist': 'Changstarr*'}
{'title': 'Silver Bullet', 'artist': 'Jade.L'}
{'title': '참 예뻐요 ', 'artist': '이규형'}

 

Comments