이번시간에는 실시간 멜론차트 1~10순위 곡-가수 정보를 받아와 보겠습니다.

구현하면 할수록 크롤링을 어떻게 해야할지 쉽게 감이 오고 실력도 많이 느는 것 같습니다.

특히 굳이 앱을 킬 필요도 없이 텔레그램에서 코로나정보/차트순위/영화 정보를 서비스 받을 수 있다는 게 정말 흥미롭지 않나요??

라즈베리파이 서버/아마존 Ec2 같은 시스템을 이용한다면 지금처럼 pc를 켠 상태가 아니어도 서비스를 이용가능합니다.

 

멜론 차트 순위는 아래 링크에서 확인할 수 있습니다.

멜론차트>TOP100>멜론 (melon.com)

 

Melon

음악이 필요한 순간, 멜론

www.melon.com

 

실시간 음원차트 순위는 곡 순위를 확인하는 게 제일 큰 목적이므로

곡 순위/가수/곡 이름 정보만 크롤링하였습니다.

보시면 ellipsis클래스에서 rank01이 제목, rank02가 가수 이름임을 알 수 있습니다. 

 

 

더 늘려보면 아래처럼 span 태그안에 곡 이름/가수 이름이 링크로 연결되어있음을 확인할 수 있습니다.

주의할 점은 곡명은 하나이고 가수는 한명 이상이기 때문에 크롤링 할 때 가수이름 목록과 곡 제목을 긁어오는 코드 구조를 똑같이 구성하면 안된다는 것입니다.

가령, 위 사진에서 1위 곡 가수가 2명으로 되어있는데 코드를 긁어오는 방법에 따라 두번째 인자인 Justin Bieber가 2위 곡인 신호등과 매칭될 수 있다는 것입니다. 

 

코드를 살펴 보겠습니다.

주의할 것은 7,8행인데 8행을 7행처럼 'span >a' 라고 작성한다면 출력할 때 "신호등-Justin Beiber"가 출력될 것입니다.

가수는 한명 이상이고 제목은 하나이기 때문에 'span>a'로 작성하면 한명의 가수이름만 출력됩니다. 저스틴 비버가 짤리게되죠.

가수명(8행)은 span 태그만 사용하여 모든 가수를 불러오도록 해야합니다.

 

또한 11행, 17행 반복문 (index, value)형식으로 출력하는데, 출력해보면 곡 명 앞에 01,02 처럼 순위가 같이 딸려오게됩니다. (ex. 02신호등-이무진)

30행 str(titles[i][2:])을 보면, 같이 출력되는 '01', '02' 등을 건너 뛰고 제목부터 출력되게끔 조절하고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def melon_chart_crawling():
    addr = 'https://www.melon.com/chart/index.htm'
 
    driver.get(addr)
    melon = driver.page_source
    soup = BeautifulSoup(melon, 'html.parser')
    title = soup.select('#frm > div div.ellipsis.rank01 > span > a')
    artist = soup.select('#frm > div div.ellipsis.rank02 > span')
 
    titles = []
    for i,j in enumerate(title):
        if i < 10:
            tts = str(i) + ' ' + j.get_text()
            titles.append(tts)
 
    artists = []
    for i, j in enumerate(artist):
        if i < 10:
            tts = j.get_text()
            artists.append(tts)
 
    key_val = [titles, artists]
    # rank_text = dict(zip(*key_val))
    
    #titles, artists 는 .text필드 없음, str로 파싱 후 title은 앞자리2번째부터
    output=" "
    #10개. 더 구하고싶으면 더 조절
    for i in range (0,10):
        
        output+=str(i+1)+'위: '+str(titles[i][2:])+"-"+str(artists[i])+'\n'
            
    return output
 
cs

 

메세지 송수신 부분 코드는 아래와 같습니다.

1
2
3
4
5
elif( user_text=="멜론"):
        bot.send_message(chat_id=id, text="조회 중 입니다...")
        melon_chart=melon_chart_crawling()
        bot.send_message(chat_id=id, text=melon_chart)
        bot.sendMessage(chat_id=id, text=info_message)
cs

 

실행을하고 "멜론"을 보내면 아래처럼 곡 정보가 잘 받아와 지는 것을 확인할 수 있습니다.

+ Recent posts