( 참고 : “FastCampus, 데이터 엔지니어링 올인원” )
[ Data Engineering ]
Pymysql (2)
( 앞선 Post에 이어지는 내용이다 )
4. Artist 테이블에 가수 정보 넣기
artists.csv에는 가수명들이 있다.
해당 파일에 있는 가수들과 관련된 정보들을 artists 테이블에 담는다.
try:
conn = pymysql.connect(host, user=username, passwd=password, db=database, port=port, use_unicode=True, charset='utf8')
cursor = conn.cursor()
except:
logging.error("could not connect to rds")
sys.exit(1)
headers = get_headers(client_id, client_secret)
artists = []
with open('artist_list.csv') as f:
raw = csv.reader(f)
for row in raw:
artists.append(row[0])
for a in artists:
params = {
"q": a,
"type": "artist",
"limit": "1"
}
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
raw = json.loads(r.text)
artist = {}
try:
artist_raw = raw['artists']['items'][0]
if artist_raw['name'] == params['q']:
artist.update(
{
'id': artist_raw['id'],
'name': artist_raw['name'],
'followers': artist_raw['followers']['total'],
'popularity': artist_raw['popularity'],
'url': artist_raw['external_urls']['spotify'],
'image_url': artist_raw['images'][0]['url']
}
)
insert_row(cursor, artist, 'artists')
except:
logging.error('something wrong')
continue
conn.commit()
5. 배치 형식으로 데이터를 불러오기!
- 아래의 코드를 통해서 가져와지는 artists는,
- 가수 명 (X) ….. ex) BTS
- 가수의 ID (O) …. ex) ef34kTdkjl342
- 해당 artists id를 batch로 묶는다 ( batch size = 50 )
cursor.execute("SELECT id FROM artists")
artists = []
for (id, ) in cursor.fetchall():
artists.append(id)
artist_batch = [artists[i: i+50] for i in range(0, len(artists), 50)]
- artists_id가 50개 마다 하나의 batch
- 해당 id들을 하나의 string으로 연결한다
- ex) ‘3g5t345,3424sasdfew,gher234,….,f43153sa’
- artist_genres에 다 담아두고, 한번에 insert를 한다
artist_genres = []
for i in artist_batch:
ids = ','.join(i)
URL = "https://api.spotify.com/v1/artists/?ids={}".format(ids)
r = requests.get(URL, headers=headers)
raw = json.loads(r.text)
for artist in raw['artists']:
for genre in artist['genres']:
artist_genres.append(
{
'artist_id': artist['id'],
'genre': genre
}
)
for data in artist_genres:
insert_row(cursor, data, 'artist_genres')
conn.commit()
cursor.close()
sys.exit(0)
위의 코드로써, MySQL DB에 위의 데이터들이 전부 담기게 되었다!