방탄소년단이 연일 KPOP의 역사를 갱신하고 있다.

 

그래서 기념으로 bs4 모듈로 빌보드 차트 스크레이핑을 해본다.

 

스크레이핑하기 위한 도구는 파이썬과 billboard 웹사이트이다.

 

빌보드 1위는 미국의 음악차트로써 전세계 모든 대중가수들의 목표다. 여기 1위하는 것은 한 가수의 인기,돈,명예, 팬 그 모든 것이라고 할 수 있다.

 

 

빌보드 차트 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권�

namu.wiki

 

우선 billboard 웹사이트에 접속해서 웹문서의 구조를 들여다본다.

 

www.billboard.com/

 

Billboard - Music Charts, News, Photos & Video

1 FranchiseTravis Scott Featuring Young Thug & M.I.A.

www.billboard.com

 

가장 핫한 순위는 역시 Hot 100 차트이다. 주간 단위 순위를 집계한다. 보통 빌보드 순위를 이야기할 때 이 HOT 100을 말하는 것이다.

 

www.billboard.com/charts/hot-100

 

The Hot 100 Chart | Billboard

 

www.billboard.com

 

지난주는 10월4일 ~ 10일까지 집계 결과이다. 달력으로 이동할 수 있다.

 

www.billboard.com/charts/hot-100/2020-10-10

 

클릭하면 주소란이 변경된 것을 볼 수 있다. 주소의 마지막에 날짜를 쓰는 방식이다.

 

그 전주를 클릭하면 주소가 바뀐다. 10월3일 주간에 BTS의 Dynamite 가 1위를 했다. 10월10일 주간에는 franchise에 1위를 내주고 2위를 했다.

 

www.billboard.com/charts/hot-100/2020-10-03

 

주소를 알았다면 무슨 내용을 가져올 것인가 확인한다. 차트순위만 가져올 것이다.

 

 

 

마우스 우클릭 -> 검사로 요소를 확인한다. 아래의 버튼을 누르고 dynamite에 커서를 가져가면 오른쪽 소스코드가 활성화된다. 다시 마우스 우클릭으로 요소를 복사한다.

 

span 태그의 클래스를 확인한다. 이 클래스가 바로 1~100위까지의 정보를 담는 클래스다.

 

<span class="chart-element__information__song text--truncate color--primary">Dynamite</span>

 


이제 웹페이지의 주소와 html 파일 분석이 끝났으니 파이썬 코드를 작성해야 할 차례다.

 

import bs4,requests

billboard = "https://www.billboard.com/charts/hot-100/2020-10-03"

print("빌보드 스크레이핑...")
res = requests.get(billboard)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,"html.parser")

elem1 = soup.find_all('span',{'class':'chart-element__information__song text--truncate color--primary'})

for i in range(len(elem1)):
    print(i+1 , " : " , elem1[i].getText())

bs4나 requests 모듈은 다운로드 받아야 한다. pip install 을 활용한다.

 

billboard 변수에 보면 마지막 주소가 날짜다. 날짜를 변형하면 다른 주간의 순위도 가져올 수 있다.

 

날짜 규칙은 그 주의 마지막 일자로 되어있다. (웹사이트에서 그렇게 결정한 것이다) 그러니까 날짜 모듈을 사용하여 7일간격으로 뽑을 수 있다. 이 포스팅에서 거기까지 다루진 않겠다.

 

request 해서 soup 객체까지 받아오는 부분은 공통의 코드이다. HTML 파싱이 되었다면 soup.find_all 하여 조건에 맞는 class만 가져온다. 

 

마지막 코드는 가져온 요소의 수만큼 텍스트를 출력한다. 

 

10월3일 주간

 

 

10월10일 주간

 

노래 제목이 있는데 아티스트가 빠져서 아쉽다. 그러면 아래와 같이 코드를 추가한다.

 

import bs4,requests

billboard = "https://www.billboard.com/charts/hot-100/2020-10-03"

print("빌보드 스크레이핑...")
res = requests.get(billboard)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,"html.parser")

elem1 = soup.find_all('span',{'class':'chart-element__information__song text--truncate color--primary'})
elem2 = soup.find_all('span',{'class':'chart-element__information__artist text--truncate color--secondary'})

for i in range(len(elem1)):
    print("No. ",i+1)
    print("    Song : " , elem1[i].getText())
    print("    Artist :",elem2[i].getText())

아까 위의 방식으로 아티스트 class를 알아낸다. 마찬가지로 soup 으로 찾는다. 출력을 조금 다듬어서 출력한다.

 

 

빌보드 웹사이트에는다양한 차트를 제공한다. 다른 차트도 Hot 100을 한 방식으로 스크레이핑하면 된다. 

가져온 순위는 텍스트 파일에 저장하거나 CSV 파일에 저장해서 엑셀로 불러올 수도 있다.

 

CSV에 관련한 포스팅을 참고한다.

 

 

파이썬 | CSV 파일 조작하기| 엑셀 스프레드시트 | 튜토리얼 사이트

CSV 파일은 Comma Separated Values 의 줄임말이고 뜻은 콤마 , 로 구분하는 값을 말한다. 엑셀파일에서 열 수 있다. 회사나 기관에서 엑셀을 많이 쓰는데 xlsx 파일만 있는게 아니라 csv 파일도 있다. 엑셀

digiconfactory.tistory.com

KPOP이 1~3위까지 싹슬이한 글로벌 200 차트도 주소만 바꾸면 된다.

 

import bs4,requests

billboard = "https://www.billboard.com/charts/billboard-global-200"

print("빌보드 스크레이핑...")
res = requests.get(billboard)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,"html.parser")

elem1 = soup.find_all('span',{'class':'chart-element__information__song text--truncate color--primary'})
elem2 = soup.find_all('span',{'class':'chart-element__information__artist text--truncate color--secondary'})

for i in range(len(elem1)):
    print("No. ",i+1)
    print("    Song : " , elem1[i].getText())
    print("    Artist :",elem2[i].getText())

글로벌 200차트를 KPOP 이 싹쓸이 했다. 사상 최초라니 웬지 신기하다. 

공유하기

facebook twitter kakaoTalk kakaostory naver band