( 참고 : “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에 위의 데이터들이 전부 담기게 되었다!