본문 바로가기

프로젝트 목록/ParseWEB

ParseWEB [1-12] 엠넷 차트 TOP 100 파싱

이번 강좌에서는 엠넷에서 제공하는 실시간 차트 TOP 100에 대한 정보를 가져와 보도록 하겠습니다.

사전 정보 수집

엠넷의 경우에도 모바일 페이지가 따로 존재하기 때문에 모바일 페이지에서 차트 정보를 파싱해보도록 하겠습니다.

엠넷의 모바일 차트 페이지의 경우 아래와 같은 URL을 가지고 있습니다.

http://m.mnet.com/chart/music/


그래서 해당 페이지에 접속하면 아래와 같은 화면을 보실 수 있습니다.


접속할 때 보면 잠깐 시간이 지난 다음에 차트 정보가 출력되는 것을 볼 수 있습니다.

이 사실을 통해서 이전에 살펴보았던 내용인 XHR 요청으로 응답을 받아와서 화면에 출력해준다고 추측을 할 수 있습니다.


그래서 XHR로 해당 응답을 필터링해 보면 아무런 내용도 나오지 않는 것을 볼 수 있습니다.


그러면 JS로 해당 응답을 필터링해 봅시다. 그러면 아래와 같이 여러 개의 응답이 나오는 것을 볼 수 있고 그중에서 hourly라는 의심스러운 응답을 볼 수 있습니다.


해당 응답에 대한 내용을 보면 아래와 같습니다.


응답 형식을 통해서 jsonp 형식으로 응답을 받아온다는 것을 알 수 있습니다.

해당 요청의 URL은 http://content.api.mnet.com/chart/total/hourly?pagenum=1&pagesize=100&callback=jQuery17103095764617990262_1549453349160입니다.

callback을 인자로 받아서 해당 응답을 jsonp 형태로 출력해준다는 것을 알 수 있습니다.


그래서 callback인자를 제외한 페이지인 http://content.api.mnet.com/chart/total/hourly?pagenum=1&pagesize=100로 접속을 하면 아래와 같은 화면을 볼 수 있습니다.


해당 응답은 JSON 형태를 가지고, 우리가 원하는 데이터인 제목 정보는 data[] > songnm에 있는 것을 알 수 있고, 가수 정보는 data[] > ARTIST_NMS에 있는 것을 알 수 있습니다.


그리고 해당 가수 정보에서 해당 곡을 부른 가수가 여러 명일 경우 ♩로 나뉘는 것을 볼 수 있습니다.


이 정보를 이용해서 코드를 작성해보도록 합시다.

구현하기

import json
import requests

def get_content():
    url = 'http://content.api.mnet.com/chart/total/hourly'
    params = {'page_num': 1, 'page_size': 100}
    req = requests.get(url, params=params)
    content = req.content

    items = json.loads(content)['data']

    titles = [item['songnm'] for item in items]
    # 여러 명의 아티스트를 처리
    singers = [item['ARTIST_NMS'].replace(chr(0x2669), ', ') for item in items]

    return list(zip(titles, singers))

result = get_content()

for index, item in enumerate(result):
    print('[{:2}위] {} - {}'.format(index + 1, item[0], item[1]))

시연 결과

아래 이미지와 같이 엠넷 차트 TOP 100의 내용을 가지고 오는 것을 볼 수 있습니다.


더 생각해보기

아래 내용은 직접 생각해서 구현을 해보시기 바라며 해당 내용에 대한 답안은 따로 제공하지 않습니다.


  1. 실시간 차트가 아닌 일간 차트나 주간 차트에 대한 정보를 출력해봅시다.
  2. JSON 데이터에서 다른 키값들이 어떤 의미를 가지는지 살펴봅시다.