본문 바로가기
코딩 연습/코딩배우기

파이썬 웹 크롤링(Web Crawling) 알아보기 #6

by good4me 2020. 10. 25.

goodthings4me.tistory.com

 

■ 멜론차트에서 시대별 곡 추출해보기

멜론차트에서 시대별 곡 추출을 위해 페이지소스보기를 보았으나 관련 소스코드가 안보이는데, 개발자도구(F12) Network탭 XHR에서 관련 소스코드의 URL을 확인할 수 있다.

XHL - Request URL: https://www.melon.com/chart/age/list.htm?idx=1&chartType=AG&chartGenre=KPOP\
&chartDate=2000&moved=Y

소스에서 곡 정보 클릭 시, https://www.melon.com/song/detail.htm?songId=2012282 이며,
songId가 있는 <a> 태그는 javascript인 goSongDetail()와 playSong() 두 곳에 있음
# 시대
import requests
from bs4 import BeautifulSoup
import re

def melon_age_search(age):
    
    cnt = 0
    
    age_url = 'https://www.melon.com/chart/age/list.htm'
    params = {
        'idx': 2,
        'chartType': 'YE',
        'chartGenre': 'KPOP',
        'chartDate': age,
        'moved': 'Y',
    }
    
    headers = {
        'Referer': 'https://www.melon.com/index.htm',
        'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
                       (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36')
    }
    
    html = requests.get(age_url, params = params, headers = headers)
    print(html)
    soup = BeautifulSoup(html.text, 'html.parser')
    
    for tag in soup.select('.t_left'):
        try:
            playsong = tag.select_one('.rank01 a[href*=playSong]')
            title = playsong['title']
            js = playsong['href']
            
            artist_detail = tag.select_one('.rank02 .checkEllipsis a')
            artist = artist_detail.text
            
            album_detail = tag.select_one('.rank03 a')
            album = album_detail.text
            #print(title, js, album)
        except:
            continue
    
        # JavaScript 부분에서 songIds 추출 (정규표현식 사용)
        # 숫자 부분을 ()로 묶어 그룹화, ')'기호는 이스케이프 처리
        matched = re.search(r",'(\d+)'\);", js)
        if matched:
            song_id = matched.group(1)
            song_url = 'https://www.melon.com/song/detail.htm?songId=' + song_id
        
        #print(title, js, album, song_url)
        
        html = requests.get(song_url, headers = headers)
        soup = BeautifulSoup(html.text, 'html.parser')
        
        tag = soup.find(id='d_video_summary') # 가사
        tag = str(tag)
        tag = tag.replace('<div class="lyric" id="d_video_summary">', '').\
            replace('<!-- height:auto; 로 변경시, 확장됨 -->', '').\
            replace('<br/>', '/').replace('</div>', '').strip()
        
        print('\n가수: [{}]\n앨범: [{}]\n곡명: [{}]\n가사 URL: [{}]\n{}\n\n'\
              .format(artist, album, title, song_url, tag))
        
        ### 추출 건수 제어를 위해 if문에서 cnt 사용
        cnt += 1
        if cnt == 3:
            break
        ###

if __name__ == '__main__':
    line = input('검색 연도(yyyy)를 입력하시오> ')
    melon_age_search(line)

cnt 변수로 곡 정보의 건수 제어함 (최대 100곡, 검색 연도는 1964 ~ 2019)

 

good4me.co.kr

 

[실행 결과]

검색 연도(yyyy)를 입력하시오> 2019
<Response [200]>

가수: [임재현]
앨범: [사랑에 연습이 있었다면]
곡명: [사랑에 연습이 있었다면 (Prod. 2soo)]
가사 URL: [https://www.melon.com/song/detail.htm?songId=31324607]
사랑에 연습이 있었다면 /우리는 달라졌을까 /내가 널 만난 시간 혹은 그 장소 /상황이 달랐었다면 /우린 맺어졌을까 /하필 넌 /왜 내가 그렇게 철없던 시절에 /나타나서 그렇게 예뻤니 /너처럼 좋은 여자가 /왜 날 만나서 그런 /과분한 사랑 내게 줬는지/우리 다시 그때로 돌아가자는게 /그게 미친말인가 /정신나간 소린가 /나는 더 잘 할 수 있고 /다신 울리지 않을 /자신있는데 그게 왜 말이 안돼 /시간이 너무 흘러 알게되었는데 /너를 울리지 않고 아껴주는법 /세월은 왜 철없는 날 /기다려주지 않고 /흘러갔는지 야속해 /지금 너 만나는 그에게도 /내게 그랬던 것처럼 /예쁘게 웃어주니 /너처럼 좋은 여자의 /사랑 받는 그 남자 너무 부러워 /넌 행복하니/니옆에 지금 그 남자가 있는게 /우리 다시 맺어질수가 없는 이윤가 /나는 더 잘 할 수 있고/다신 울리지 않을/자신있는데 그게 왜 말이 안돼/시간이 너무 흘러 알게 되었는데/너를 울리지 않고 아껴주는 법/세월은 왜 널 잊는 법을/알려주지 않고 흘러갔는지/



가수: [케이시 (Kassy)]
앨범: [그때가 좋았어]
곡명: [그때가 좋았어]
가사 URL: [https://www.melon.com/song/detail.htm?songId=31524320]
이젠 내가 편하니/작은 설렘조차 욕심이겠지/항상 곁에 있어서/계속 함께 있을 줄 알았나 봐/음 반복되는 시간에 지쳐가/더 이상 함께 웃을 일도 없어/봄처럼 따뜻했던/그때가 좋았어/너 하나로 충분했던/그때가 좋았어/헤어지고 나서야/깨닫게 됐어/참 좋았구나/참 예뻤구나 우리/지난날에 그때가 참 좋았어/그때 그때/그때 그때 음/이미 너도 다 알잖아/돌이킬 수 없이 멀리 왔다는 거/억지로 더 노력해도/안되는 건 어쩔 수가 없더라/음 우리 언제 이렇게 됐을까/더는 너를 만날 자신이 없어/봄처럼 따뜻했던/그때가 좋았어/행복해서 눈물 나던/그때가 좋았어/헤어지고 나서야/깨닫게 됐어/참 좋았구나/참 예뻤구나 우리/지난날에 그때가 참 좋았어/가진 것도 없고 초라했어도/서로만으로 충분했으니까 우린/너라서 좋았어/행복했어/사랑이 전부였던/그때가 좋았어/그때 알았더라면/더 사랑할 걸/더 안아줄 걸/후회가 돼/사랑했던 우리가 참 그리워/그때 그때/그때 그때 음/



가수: [방탄소년단]
앨범: [MAP OF THE SOUL : PERSONA]
곡명: [작은 것들을 위한 시 (Boy With Luv) (Feat. Halsey)]
가사 URL: [https://www.melon.com/song/detail.htm?songId=31737197]
모든 게 궁금해/How’s your day/Oh tell me/뭐가 널 행복하게 하는지/Oh text me/Your every picture/내 머리맡에 두고 싶어/oh bae/Come be my teacher/네 모든 걸 다 가르쳐줘/Your 1 your 2/Listen my my baby 나는/저 하늘을 높이 날고 있어/그때 니가 내게 줬던 두 날개로/이제 여긴 너무 높아/난 내 눈에 널 맞추고 싶어/Yeah you makin’ me a boy with luv/Oh my my my oh my my my/I've waited all my life/네 전부를 함께하고 싶어/Oh my my my oh my my my/Looking for something right/이제 조금은 나 알겠어/I want something stronger/Than a moment/than a moment love/I have waited longer/For a boy with/For a boy with luv/널 알게 된 이후 ya/내 삶은 온통 너 ya/사소한 게 사소하지 않게/만들어버린 너라는 별/하나부터 열까지 모든 게 특별하지/너의 관심사 걸음걸이 말투와/사소한 작은 습관들까지/다 말하지 너무 작던/내가 영웅이 된 거라고/Oh nah/난 말하지 운명 따윈/처음부터 내 게 아니었다고/Oh nah/세계의 평화/No way/거대한 질서/No way/그저 널 지킬 거야 난/Boy with luv/Listen my my baby 나는/저 하늘을 높이 날고 있어/그때 니가 내게 줬던 두 날개로/이제 여긴 너무 높아/난 내 눈에 널 맞추고 싶어/Yeah you makin’ me a boy with luv/Oh my my my oh my my my/You got me high so fast/네 전부를 함께하고 싶어/Oh my my my oh my my my/You got me fly so fast/이제 조금은 나 알겠어/Love is nothing stronger/Than a boy with luv/Love is nothing stronger/Than a boy with luv/툭 까놓고 말할게/나도 모르게 힘이 들어가기도 했어/높아버린 sky/커져버린 hall/때론 도망치게 해달라며 기도했어/But 너의 상처는 나의 상처/깨달았을 때 나 다짐했던 걸/니가 준 이카루스의 날개로/태양이 아닌 너에게로/Let me fly/Oh my my my oh my my my/I've waited all my life/네 전부를 함께하고 싶어/Oh my my my oh my my my/Looking for something right/이제 조금은 나 알겠어/I want something stronger/Than a moment/than a moment love/Love is nothing stronger/Than a boy with luv/

 

[참고] askcompany.kr - 크롤링 차근차근 시작하기

 

 

댓글