데이터 엔지니어링 프로젝트 및 인강/3. Spotify Project

Spotify Project 04. Spotify 에서 artists , album 정보 가져오기

쟈누이 2020. 6. 14. 01:25
반응형

현재 진행하고 있는 프로젝트는 페스트 캠퍼스에서 듣고 있는 인강인

한승수 강사님의 데이터 엔지니어링 강의를 다시한번 복습하고

내재화하고자 진행하는 프로젝트인 점 참고바란다.

 

이 프로젝트에서의 수집해야되는 정보를 가져오기 위한 

코드를 만들었다. 

이번 프로젝트에서의 가상의 목표는 spotify의 api 를 활용하여

간단한 챗봇 서비스를 만들어 보는 것이므로, artists 정보, album 등 

우리가 spotify 라는 음원 서비스를 이용하면서 많이 찾는 정보를 우선 수집하고자 한다.

 

특히 이중에서 artist 와 ablum 정보는 전 세계 모든 아티스트들이 공통적으로 

생성하는 정보이며, spotify 서비스를 이용하는 유저들이 가장 많이 

참고하는 데이터이기에 위 데이터를 먼저 수집하는 것이 좋겠다는 판단 하에

위 정보를 수집하기 위한 코드를 짜기로 했다.

 

우선 이 코드는 artists 와 album 정보를 얻기 위해 3단계를 거친다.

 

# 1. search api 에서 가수 아이디 가져오기

search api에는 spotify 에 등록된 artists 들의 아이디가 저장되어 있기 때문에 꼭 필요한 api 이다.

왜냐하면 artists api 에는 artists 와 albums 에 대한 정보를 얻을 수 있기 때문이다.

그 api 에서 정보를 가져오기 위해 꼭 필요한 파라미터가 id 이다.

# search api 에서 가수 목록 가져오기 테스트(BTS)
    headers = get_access_token(client_id,client_secret)
    endpoint = 'https://api.spotify.com/v1/search'
    query_params = {
        'q' : 'BTS',
        'type' : 'album',
        'limit' : 5
    }
    r = requests.get(url=endpoint,params=query_params,headers=headers)

 

인증을 받고 api 에서 정보를 가져온다. 

 

그리고 이 과정에서 가장 중요한 것이 있는데, 그것은 바로 이 과정을 반복해서 실행할 경우

발생할 수 있는 에러를 어떻게 대처하는 것이냐이다. 

 

강의에서는 이 에러를 대처하는 것이 엔지니어에게 있어서 매우 중요하다고 말한다.

왜냐하면, 에러에 대처할 수 있어야 효율적인 파이프라인을 만들 수 있고, 유지보수를 수월하게 

할 수 있기 때문이다.

무엇보다도, 파이프라인 구축에 있어서 에러가 적게 발생한다는 것은 해당 파이프라인의 신뢰도를

향상시킬 수 잇는 매우 중요한 요인 중 하나이기 때문에, 데이터 엔지니어에게 있어서 에러 컨트롤은 매우 중요하다. 

 

이 에러를 컨트롤 하기 위해서 try - except 문을 활용하여 발생할 수 있는 

주요 에러를 컨트롤하고자 했다.

 

 	try:
        r = requests.get(url=endpoint, params=query_params, headers=headers)
    except:
        logging.error(r.text)
        sys.exit(0)


    # r.status_code 를 통한 에러 체크, 200이면 그냥 통과
    if r.status_code != 200:
        logging.error(json.loads(r.text))
        if r.status_code == 429:

            retry_after = json.loads(r.headers)['retry-After']
            time.sleep(int(retry_after))

            r = requests.get(url=endpoint, params=query_params, headers=headers)

        elif r.status_code == 401:

            headers = get_access_token((client_id, client_secret))
            r = requests.get(url=endpoint, params=query_params, headers=headers)
        else:
            sys.exit(1)

    # 에러 체킹 결과 이상 없음
    # print(r.status_code)
    # print(r.text)

spotify의 api 를 참고하여 각 status code 에 따라 발생하는 에러를 체크하고

컨트롤 할 수 있는 프로세스를 구축하고자 노력했다.

 

이러한 코드를 작성하면서, 에러가 발생하더라도 이를 코드를 통해 

자동으로 컨트롤 하여 파이프라인 프로세스를 효율적으로 운영할 수 있다면 

그것을 통해 효율적인 파이프라인을 만들 수 있으며, 신뢰도를 높일 수 있겠구나 라고 느꼇다.

(그렇기 때문에 데이터 엔지니어에게 에러를 컨트롤 하는 것은 매우 중요하다)

 

위 코드를 바탕으로 artists, BTS 의 정보를 얻을 수 있었다.

 

# 2. artist의 정보를 바탕으로 album 정보 전부 가져오기

 

사이트마다 다르지만, API 마다 한번에 가져올 수 있는 정보의 양은 제한된 경우가 많아, 

while 과 for 문을 사용하여 여러번에 걸쳐 가져와야 될 때가 많다.

그럴때 페이지를 컨트롤하는 key를 활용하면 제한을 극복하고 필요한 정보를 원하는 만큼 가져올 수 있다.

이렇게 페이지를 컨트롤 하는 api 를 사용하여 정보를 원하는 만큼 가져오도록 컨트롤하는 것을 페이지네이션 이라고 한다.

 

spotify 의 경우에는 api 자체에 페이지네이션을 하는 방법이 잘 설명되어 있어 참고하면서 페이지네이션을

진행하면 된다.

이 페이징 오브젝트를 참고하여 페이지 네이션을 진행했다.

 

# 3. 페이지네이션을 통해 album 정보 전부 가져오기

    # search api 에서 가져온 artist id 정보를 토대로
    # artist albums 정보를 가져온다.

    # get bts's albums
    r = requests.get(url=endpoint, headers=headers)
    raw = json.loads(r.text)

    # 필요한 값 선별
    total = raw['total']
    offset = raw['offset']
    limit = raw['limit']
    next = raw['next']

    # 가려오려는 앨범에 대한 정보를 따로 list 형식으로
    # 모아서 DB 에 저장해야한다
    albums = []
    albums.extend(raw['items'])
    print(len(albums))
    print('==='*10)

    # 아티스트의 앨범이 얼마나 많건 난 100개정도만 가져오겠다.
    count = 0
    while count < 100 and next:

        r = requests.get(raw['next'], headers=headers)
        raw = json.loads(r.text)
        raw['next']

        albums.extend(raw['items'])
        count = len(albums)
        if raw['next'] == None:
            break

        print(len(albums))

    print(albums)

raw['next'] 를 참고해 다른 페이지에 있는 BTS 의 앨범정보들을 가져오는 코드를 작성했다. 

while 문을 활용해 페이지네이션을 반복하여 원하는 정보를 가져오고 extend 함수를 바탕으로 

albums 이라는 빈 리스트에 담길 수 있도록 했다.

 

그리고 None 이 나오면 에러가 뜨면서 더이상의 정보가 담기지 않기에 None이 나오면

while 문을 자동으로 빠져나오게 설계함으로써 추출한 정보가 

완전하게 담길 수 있도록 조치했다.

 

위의 이미지와 같이 정보를 추출하는데 성공했다.

 

# 4. 프로젝트 1주차 결과

프로젝트 1주차에는 데이터를 AWS DB 에 쌓는 작업을 하기에 앞서 api 에서 정보를 가져오는

파이프를 구성해보았다. 

DB 에 정보를 쌓는 것도 중요한 것이지만, 그것보다 앞서 목표로 하는 api 에서 정보를

원활하게 가져오는 것이 더 중요하다고 생각한다. 왜냐하면, 데이터 파이프라인이 존재하는 이유 자체는

데이터를 원활하게 가져오는 것이기 때문이다.

 

그러기에 이 부분에서 에러를 컨트롤하고, 페이지네이션을 통해 데이터를 원활하게 가져오는

파이프를 구축하는 것이 매우 중요하다고 생각해왔고, 실제로 api 데이터를 가져오는 파이프를

코드로 구현하면서 이를 더욱 느낀 한주가 되었다.

반응형