DevSSOM

파이썬 크롤링 - 간단한 실습 : 벅스뮤직 음원차트 추출 본문

Python/크롤링

파이썬 크롤링 - 간단한 실습 : 벅스뮤직 음원차트 추출

데브쏨 2021. 6. 23. 18:23
반응형

bugs 실시간 음원차트 순위 추출하기

bugs 실시간 음원차트의 순위별로 곡명을 담은 리스트를 출력하기. https://music.bugs.co.kr/chart

 

슈퍼사운드 벅스

4천만곡 음악서비스, 슈퍼사운드, 고음질, FLAC, 최신 인기가요, 뮤직PD, 커넥트, 페이코, 추천 플레이리스트, 추천 선곡, 테마 음악

music.bugs.co.kr

 

출력 예시

[곡명1, 곡명2, 곡명3, ———]

  • \n은 개행문자(줄바꿈 문자). \n을 포함한 문자열 변수 text가 있을 때, \n을 제거하기 위해서는 text.replace("\n","") 활용.
  • str.replace("a", "b") : 문자열 str에 등장하는 "a"란 문자를 모두 "b"로 대체하는 함수
import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    return None
    
    


def main() :
    custom_header = {
        'referer' : 'https://music.bugs.co.kr/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    url = "https://music.bugs.co.kr/chart"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

    # crawling 함수의 결과를 출력
    print(crawling(soup))


if __name__ == "__main__" :
    main()

 

 

>>>

 

벅스차트를 구글 검사로 개발자 도구에서 HTML을 확인해보면, 차트 순위에 있는 노래 제목은 <p> 태그 안에 있고, 더 상위로 올라가보면 <tbody>에 벅스차트에 있는 노래들의 제목들이 전부 들어있음을 확인.

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    tbody = soup.find("tbody")
    print(tbody.find_all("p"))

    return None

그러면 실시간 1위인 브레이브걸스의 치맛바람, 2위인 트와이스 Alcohol-Free, 3위인 에스파의 Next Level.... 이렇게 쭉쭉쭉 html들이 긁어짐. 근데 너무 막 긁어졌잖아. 알아보기 힘들게. 그래서 곡 제목들의 class인 title 클래스로 한 번 더 특정시켜줄거야.

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    tbody = soup.find("tbody")
    print(tbody.find_all("p", class_="title"))

    return None

곡 제목만 있긴 한데, 아직도 더럽... get_text()를 써보자.

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    tbody = soup.find("tbody")
    
    for p in tbody.find_all("p", class_= "title"):
        print(p.get_text())

    return None

 

근데, 얘네가 또 줄바꿈이 심하잖아. 개행문자(줄바꿈 문자) \n이 쓰여서 그런거니까, \n을 없애줘야돼. text.replace("\n", "") 으로. \n을 비어있는 문자열로 바꿔주는거야.

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    tbody = soup.find("tbody")
    
    for p in tbody.find_all("p", class_="title"):
        print(p.get_text().replace("\n", ""))

    return None

 

그럼 이렇게 제목이 한 줄에 하나씩 나타나게 됨. 이제 마지막으로 얘네를 리스트 안에 넣어줘야 되니까 result 리스트 안에 append 함수로 넣어줘.

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    tbody = soup.find("tbody")
    
    result = []
    
    for p in tbody.find_all("p", class_="title"):
        result.append(p.get_text().replace("\n", ""))
    
    return result

그럼 끝!

최종 코드

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    tbody = soup.find("tbody")
    
    result = []
    
    for p in tbody.find_all("p", class_="title"):
        result.append(p.get_text().replace("\n", ""))
    
    return result
    
    


def main() :
    custom_header = {
        'referer' : 'https://music.bugs.co.kr/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    url = "https://music.bugs.co.kr/chart"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

    # crawling 함수의 결과를 출력합니다.
    print(crawling(soup))


if __name__ == "__main__" :
    main()

 

728x90
반응형
댓글