Web Crawling: 멜론 차트, 지니 차트 top100

코드싸개·2021년 1월 10일
0

Play with Data

목록 보기
2/2

1. Melon 크롤링 결과 엑셀 파일로 저장하기

from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Safari()
url_m = 'https://www.melon.com/chart/index.htm'
driver.get(url_m)

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
song_data = []
rank = 1
songs = soup.select('table > tbody > tr')
for song in songs:
    title = song.select('div.ellipsis.rank01 > span > a')[0].text
    singer = ""
    len_singer = len(song.select('div.ellipsis.rank02 > a'))
    for i in range(len_singer):
        singer += song.select('div.ellipsis.rank02 > span > a')[i].text + ", "
    song_data.append(['Melon', rank, title, singer])
    rank += 1
import pandas as pd
columns = ['사이트', '순위', '타이틀', '가수']
pd_data = pd.DataFrame(song_data, columns=columns)
pd_data.head()
사이트 순위 타이틀 가수
0 Melon 1 VVS (Feat. JUSTHIS) (Prod. GroovyRoom) 미란이 (Mirani), 먼치맨, Khundi Panda, 머쉬베놈 (MUSHVEN...
1 Melon 2 밤하늘의 별을(2020) 경서,
2 Melon 3 Dynamite 방탄소년단,
3 Melon 4 잠이 오질 않네요 장범준,
4 Melon 5 내일이 오면 (Feat. 기리보이, BIG Naughty (서동현)) 릴보이 (lIlBOI),
pd_data.to_excel('melon.xlsx', index=False)

2. bugs 크롤링 결과 엑셀 파일로 저장하기

driver = webdriver.Safari()
url_b = 'https://music.bugs.co.kr/chart?wl_ref=M_left_02_01'
driver.get(url_b)

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
songs = soup.select('tr')
print(len(songs))
104
songs = soup.select('tbody > tr')
print(len(songs))
103
songs = soup.select('table > tbody > tr')
print(len(songs))
103
songs = soup.select('table.byChart > tbody > tr')
print(len(songs))
100
print(songs[0])
<tr albumid="4022885" artistid="1501" multiartist="N" mvid="583598" rowtype="track" trackid="6046260">
<input name="_isStream" type="hidden" value="6046260"/>
<input name="_isDown" type="hidden" value="6046260"/>
<td class="check"><input buyminquality="T" disc_id="1" name="check" title="Your Lights" type="checkbox" value="6046260"/></td>
<td>
<div class="ranking">
<strong>1</strong>
<p class="change none"><em>0</em><span>변동없음</span></p>
</div>
</td>
<td>
<a class="thumbnail" href="https://music.bugs.co.kr/album/4022885?wl_ref=list_tr_07_chart" onclick="
">
<span class="mask"></span>
<img alt="Your Lights (바이크 원정대 OST Part.1) 대표이미지" onerror="bugs.utils.imgError(this);" src="https://image.bugsm.co.kr/album/images/50/40228/4022885.jpg?version=20210108002452.0"/>
</a>
</td>
<td>
<a class="trackInfo" href="https://music.bugs.co.kr/track/6046260?wl_ref=list_tr_08_chart" onclick="
">곡정보</a>
</td>
<th scope="row">
<p adult_yn="N" class="title">
<a adultcheckval="1" aria-label="새창" href="javascript:;" onclick="bugs.wiselog.area('list_tr_09_chart');bugs.music.listen('6046260',true);
" title="Your Lights">Your Lights</a>
</p>
</th>
<td class="left">
<p class="artist">
<a href="https://music.bugs.co.kr/artist/1501?wl_ref=list_tr_10_chart" onclick="
" title="이수 (엠씨더맥스)">이수 (엠씨더맥스)</a>
</p>
</td>
<td class="left">
<a class="album" href="https://music.bugs.co.kr/album/4022885?wl_ref=list_tr_11_chart" onclick="
" title="Your Lights (바이크 원정대 OST Part.1)">Your Lights (바이크 원정대 OST Part.1)</a>
</td>
<td>
<a adultcheckval="1" aria-label="새창" class="btn play" href="javascript:;" onclick="bugs.wiselog.area('list_tr_12_chart');bugs.music.listen('6046260',true);
">듣기</a>
</td>
<td>
<a adultcheckval="1" aria-label="새창" class="btn addPlaylist" href="javascript:;" onclick="bugs.wiselog.area('list_tr_13_chart');bugs.music.listen('6046260');
">재생목록에 추가</a>
</td>
<td>
<a class="btn addAlbum" href="javascript:;" onclick="bugs.wiselog.area('list_tr_14_chart');bugs.music.addTrackToMyAlbum(this,'6046260');
" track_title="Your Lights">내 앨범에 담기</a>
</td>
<td>
<a adultcheckval="1" aria-label="새창" class="btn download flac" href="javascript:;" onclick="bugs.wiselog.area('list_tr_15_chart');bugs.layermenu.down(this,'6046260','true','true','44.1','true','96', null );
"><em class="flac">flac </em>다운로드</a>
</td>
<td>
<a aria-label="새창" class="btn viewMV" href="javascript:;" onclick="bugs.wiselog.area('list_tr_16_chart');
bugs.layermenu.mv(this,6046260, 583598, 'Y', 'Y', 'Y', 'Y', 6046260, 'N','ALL', 'Y');
">영상 재생</a>
</td>
<td>
<a artist_disp_nm="이수 (엠씨더맥스)" artist_id="1501" class="btnActions" href="javascript:;" layer_type="CHART" layerpositiontarget="td" onclick="bugs.wiselog.area('list_tr_17_chart');
bugs.layermenu.trackMoreAction(this,'6046260','0','4022885','bugs.music.listenRadioFromSeed(\'6046260\',\'track\');','N', 'Y', '_chart');
" track_title="Your Lights">기타 기능</a>
</td>
</tr>
song = songs[0]
title = song.select('p.title > a')
len(title)
1
title = song.select('p.title > a')[0].text
title
'Your Lights'
singer = song.select('p.artist > a')[0].text.strip()
singer
'이수 (엠씨더맥스)'

반복문으로 순위 정보 가져오기

songs = soup.select('table.byChart > tbody > tr')
for song in songs:
    title = song.select('p.title > a')[0].text
    singer = song.select('p.artist > a')[0].text
    print(title, singer, sep=' | ')
Your Lights | 이수 (엠씨더맥스)
나로 바꾸자 (duet with JYP) | 비
우린 어쩌다 헤어진 걸까 | 허각
첫사랑 (feat.SOLE(쏠)) | 정준일
겨울잠 | 장덕철
Dynamite | 방탄소년단
For You (Feat. Crush) | 이하이
What Do I Call You | 태연 (TAEYEON)
VVS (Feat. JUSTHIS) (Prod. GroovyRoom) | 미란이
밤하늘의 별을(2020) | 경서
Lovesick Girls | BLACKPINK
Life Goes On | 방탄소년단
CREDIT (Feat. 염따, 기리보이, Zion.T) | 릴보이(lIlBOI)
입김 | 10CM
휘파람 | 싱어게인 63호 가수
서로를 위한 것 | 나얼(Na-Ul)
Black Mamba | aespa
잠이 오질 않네요 | 장범준
우리의 밤은 당신의 낮보다 아름답다 | 너도 나도 너드(싱어게인 17호 가수, 싱어게인 26호 가수)
Panorama | IZ*ONE(아이즈원)
가을밤에 든 생각 | 잔나비
Lovegame | 백예린 (Yerin Baek)
취기를 빌려 (취향저격 그녀 X 산들) | 산들
잘할게 | 이승기
내일이 오면 (Feat. 기리보이, BIG Naughty (서동현)) | 릴보이(lIlBOI)
에잇(Prod.&Feat. SUGA of BTS) | 아이유(IU)
Blueming | 아이유(IU)
I CAN’T STOP ME | TWICE (트와이스)
34+35 | Ariana Grande(아리아나 그란데)
나랑 같이 걸을래 (바른연애 길잡이 X 적재) | 적재
ON AIR (Feat. 로꼬, 박재범 & GRAY) | 릴보이(lIlBOI)
Achoo (Feat. pH-1, HAON) (Prod. GroovyRoom) | 미란이
악역 (Feat. 이하이 & 사이먼 도미닉) (Prod. 코드 쿤스트) | 스윙스(Swings)
Savage Love (Laxed - Siren Beat) (BTS Remix) | Jawsh 685
여백의 미 (Feat. Jessi, JUSTHIS) (Prod. GroovyRoom) | 머쉬베놈(MUSHVENOM)
오래된 노래 | 스탠딩 에그(Standing Egg)
Hate you | 백예린 (Yerin Baek)
딩가딩가 (Dingga) | 마마무(Mamamoo)
너도 아는 | 폴킴(Paul Kim)
흔들리는 꽃들 속에서 네 샴푸향이 느껴진거야 | 장범준
Playlist | 태연 (TAEYEON)
뿌리 (Feat. JUSTHIS) (Prod. GroovyRoom) | KHUNDI PANDA
힘든 건 사랑이 아니다 | 임창정
MAGO | 여자친구(GFRIEND)
How You Like That | BLACKPINK
사라진 모든 것들에게(with ELLE KOREA) | 코드 쿤스트
불면증 (Vocal by 윤하) | 에피톤 프로젝트(Epitone Project)
Dolphin | 오마이걸(OH MY GIRL)
When We Disco (Duet with 선미) | 박진영
모든 날, 모든 순간 (Every day, Every Moment) | 폴킴(Paul Kim)
사랑이었나봐 | 기리보이
Square (2017) | 백예린 (Yerin Baek)
사랑은 (Feat.원슈타인) | 마미손
마음을 드려요 | 아이유(IU)
내 마음이 움찔했던 순간 (취향저격 그녀 X 규현) | 규현 (KYUHYUN)
이제 나만 믿어요 | 임영웅
요즘 | 양다일
어떻게 이별까지 사랑하겠어, 널 사랑하는 거지 | AKMU (악동뮤지션)
살짝 설렜어 (Nonstop) | 오마이걸(OH MY GIRL)
Snowman | Sia(시아)
주저하는 연인들을 위해 | 잔나비
Here I am | 조현아 (어반자카파)
METEOR | 창모(CHANGMO)
밤편지 | 아이유(IU)
혼술하고 싶은 밤 | 벤
Love poem | 아이유(IU)
어김없이 이 거리에 | 정승환
모든 밤 너에게 (연애혁명 X 민현 (뉴이스트)) | 민현 (뉴이스트)
Bad Boy | 청하
손님온다 | 중고등부 (성민지화자좋다)
어떻게 지내 (Prod. By VAN.C) | 오반 (OVAN)
고독하구만 (Feat. 수퍼비) (Prod. GroovyRoom) | 머쉬베놈(MUSHVENOM)
아로하 | 조정석
밝게 빛나는 별이 되어 비춰줄게 | 송이한
DON'T TOUCH ME | 환불원정대
한잔이면 지워질까 | 황인욱
늦은 밤 너의 집 앞 골목길에서 | 노을
시작 | 가호(Gaho)
작은 것들을 위한 시 (Boy With Luv) (Feat. Halsey) | 방탄소년단
미리 메리 크리스마스 (feat. 천둥 Of MBLAQ) | 아이유(IU)
parachute | John K
놀이공원 (Amusement Park) | 백현(BAEKHYUN)
밤새 (취향저격 그녀 X 카더가든) | 카더가든
적외선 카메라 | 원슈타인
미운 사내 | 아이돌부 (느낌좋지윤)
제발 | 싱어게인 29호 가수
Memories | Maroon 5(마룬 파이브)
홀로 | 이하이
동거 (in the bed) | 선우정아(Sunwoojunga)
CRY FOR ME | TWICE (트와이스)
이루리 | 우주소녀
가다 (Feat. 사이먼 도미닉, The Quiett) (Prod. SLO) | 머쉬베놈(MUSHVENOM)
Freak (Prod. Slom) | 릴보이(lIlBOI)
Santa Tell Me | Ariana Grande(아리아나 그란데)
우선순위 | 더보이즈(THE BOYZ)
Sorry | 2F (신용재, 김원주)
SO BAD | STAYC(스테이씨)
90's Love | NCT U
마리아 (Maria) | 화사(Hwa Sa)
HERO | 임영웅
song_data = []
rank = 1
songs = soup.select('table.byChart > tbody > tr')
for song in songs:
    title = song.select('p.title > a')[0].text
    singer = song.select('p.artist > a')[0].text
    song_data.append(['Bugs', rank, title, singer])
    rank += 1

pd_data = pd.DataFrame(song_data, columns=columns)
pd_data.to_excel('bugs.xlsx', index=False)

3. 크롤링 결과 파일 통합하기

import pandas as pd
excel_names = ['bugs.xlsx', 'melon.xlsx']
append_data = pd.DataFrame()
for name in excel_names:
    pd_data = pd.read_excel(name)
    append_data = append_data.append(pd_data)
append_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 200 entries, 0 to 99
Data columns (total 4 columns):
사이트    200 non-null object
순위     200 non-null int64
타이틀    200 non-null object
가수     200 non-null object
dtypes: int64(1), object(3)
memory usage: 7.8+ KB
append_data.to_excel('music_total.xlsx', index=False)

직장인을 위한 데이터 분석 실무 with 파이썬 / 위키북스

profile
데이터 분석 공부용 벨로그

0개의 댓글