현재 진행하고 있는 프로젝트는 페스트 캠퍼스에서 듣고 있는 인강인
한승수 강사님의 데이터 엔지니어링 강의를 다시한번 복습하고
내재화하고자 진행하는 프로젝트인 점 참고바란다.
이 프로젝트에서의 수집해야되는 정보를 가져오기 위한
코드를 만들었다.
이번 프로젝트에서의 가상의 목표는 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 데이터를 가져오는 파이프를
코드로 구현하면서 이를 더욱 느낀 한주가 되었다.
'데이터 엔지니어링 프로젝트 및 인강 > 3. Spotify Project' 카테고리의 다른 글
Spotify Project 06. Spotify - AWS Data 수집 프로세스 구축 2 (0) | 2020.07.05 |
---|---|
Spotify Project 05. Spotify - AWS Data 수집 프로세스 구축 (0) | 2020.06.28 |
Spotify Project 03. 프로젝트 진행위한 API 관련 사항 (0) | 2020.06.09 |
Spotify Project 02. aws 사용하기에 앞서 설정해두어야 할 것(aws cli) (0) | 2020.06.07 |
Spotify Project 01. 이번 프로젝트의 목표 (0) | 2020.06.06 |