안녕하세요! 오늘은 크롤링에 대해 알아보도록 하겠습니다.
현재 지금 활동하고 있는 빅데이터 대외활동 '투빅스'에서 '가사 생성' 관련 팀 프로젝트를 진행하고 있습니다.
그래서 가사 데이터가 필요해 네이버 뮤직을 크롤링했습니다.
인터넷에 검색을 해보니, 음악 사이트 크롤링은 잘 없더라구요ㅠㅠㅠ(네이버 영화는 많은데ㅠㅠ)
그래서 제가 만든 코드를 공유하고자 합니다:)
**사용하실때 댓글 남겨주시면 큰 힘이 됩니다!**
**전체 코드는 맨 마지막 github 링크에 있습니다**
<본 크롤러는 노래 제목과 가사를 크롤링하는 코드 입니다>
기회가 되면 크롤링관련 기초 포스팅을 하고자 합니다:)
#도입
많고 많은 음악사이트 중에서 네이버 뮤직을 선택한 이유는
네이버 뮤직이 크롤링하기 쉬울 거 같아서 선택했습니다.
네이버뮤직은 아티스트마다 고유 번호를 부여해 페이지를 관리를 하더군요.
그래서 네이버 뮤직을 선택하게 되었습니다.
예시로 사용한 이문세님입니다.
보시면, url에 artistid가 188번임을 알 수 있습니다.
원하는 가수와 곡명 그리고 가사를 크롤링하기 위해,
네이버 뮤직 검색창에 해당 가수 이름을 써서 검색을 하고,
아티스트를 클릭해서
위에 보이는 url에서 artistid 번호를 바꿔주면 됩니다.
우선 필요한 모듈들을 불러옵니다.
저는 lxml과 beautifulsoup을 이용해 크롤링을 했습니다.
셀레니윰은 확인용으로 썼는데, 크롤러 코드에서는 사용하지 않았습니다.
패키지 설치법은 다른 블로그를 확인해주세용:) (특히나 셀레니윰은 더더욱!)
from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep
import requests
import re
import pandas as pd
from pandas import DataFrame
import numpy as np
import lxml.html
노래 제목과 곡 번호를 크롤링 합니다.
곡 번호를 크롤링하는 이유는,
네이버 뮤직에서 곡 번호 기준으로 가사를 크롤링 할 수 있기 때문입니다.
그래서 바로 가사를 크롤링하지 않고, 곡번호를 우선적으로 크롤링해, 후에 이를 사용하고자 합니다.
###################################
#가수마다 번호 부여. 다른 가수 번호 찾아서 바꾸기만 하면 됨
title_l = []
number_l = []
for i in range(1,11):
url_s = 'https://music.naver.com/artist/track.nhn?artistId=188&page=' + str(i)
#print(url_s)
res_s = requests.get(url_s, headers = {
'user-agent': ('Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/41.0.2228.0 Safari/537.36')})
e_s = lxml.html.fromstring(res_s.text)
title = e_s.cssselect('.track')
a = re.compile("[0-9]{2,}")
if len(title) == 50:
for i in range(0,50):
title_l.append(title[i].text_content())
number_l.append(a.findall(title[i].get('onclick')))
else:
for i in range(0,19):
title_l.append(title[i].text_content())
number_l.append(a.findall(title[i].get('onclick')))
이제 곡번호를 크롤링 했으니, 본격적으로 가사를 크롤링 할 차례입니다.
하지만, 잘 되었는 지 확인을 해볼까요
#잘 됬는지 확인. 둘이 len 똑같아야 함
print(len(title_l), len(number_l))
그런데, number_l을 보니, 이중리스트에 한 행에 2개씩 중복이 되어있는게 있네요.
이를 먼저 해결해주고 가겠습니다.
#중복 없애주고
#이중 리스트 풀자
#이중 리스트 안에 있는 중복 없애기
result = []
for i in range(0,len(number_l)):
result.append(list(set(number_l[i])))
result
#이중 리스트 풀기
unlist = [y for x in result for y in x]
unlist
이중 리스트 풀기는 리스트컴프리핸션 방법으로 리스트를 풀었습니다.
이.제! 가사를 크롤링해보도록 하겠습니다.
#곡 번호 기준으로 가사 크롤링 하기!
################찐 가사!
lyrics_l = []
for i in unlist:
url2 = 'https://music.naver.com/lyric/index.nhn?trackId=' + str(i)
#print(url2)
response = requests.get(url2)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
lyrics = soup.select('.section_lyrics')
#print(lyrics)
for n in lyrics:
try:
lyrics_l.append(n.text.strip())
except:
lyrics_l.append("NULL")
#결과 확인
lyrics_l
#잘 나온다!
#결과 확인. 앞에서 title과 number와 같은 값이여야 함
len(lyrics_l)
그럼 이제 dataframe으로 저장하겠습니다.
##################저장
save_df = DataFrame({"number" : unlist, "title" : title_l, "lyrics" : lyrics_l})
save_df_final = save_df[save_df.lyrics.apply(lambda x : len(x)) > 100]
save_df_final.to_csv("이문세.csv", index = False, encoding='utf-8-sig')
이상 마치도록하겠습니다!
전체 코드는 이곳에 있습니다:)
★star 눌러주시면 감사합니다!!★
https://github.com/yieun0408/Naver-Music-Crawling/blob/master/NaverMusic_Crawling_lyrics.ipynb
yieun0408/Naver-Music-Crawling
naver music crawling/네이버 뮤직 크롤링. Contribute to yieun0408/Naver-Music-Crawling development by creating an account on GitHub.
github.com