본문 바로가기
Study/Python

[Python] 크롤링 멜론차트 데이터 수집

by YoungD 2023. 8. 29.
import requests as req
from bs4 import BeautifulSoup as bs
In [2]:
# 1. req를 통해서 멜론차트 정보를 요청(클라이언트(사용자))
#   - 서버(웹페이지): 요청받은 값에 대한 정보를 클라이언트에게 제공
#                    이미지, 동영상, 글자, 화면 / html 문서로 넘어옴
# python의 requests가 하는 건 중간에 넘어오고 있는 html문서 가져오기
head = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'}
res = req.get("https://www.melon.com/chart/index.htm", headers = head)
res
# 프로그래밍 언어로 접근을 하면 웹페이지가 접근을 막음
# header = 가면(크롬의 가면을 쓴 프로그래밍언어로 접근)
Out[2]:
<Response [200]>
In [3]:
# 2. bs을 통해서 문자열 데이터를 html데이터로 변형
soup = bs(res.text, "lxml")
In [4]:
# 3. 노래제목 수집
# 클래스값 중간에 공백이 있다는 건 -> 클래스가 복수개다
# 공백을 지우고 반드시 . 으로 이어준다
# ex) div class = ellipsis rank01 --> ellipsis 와 rank01 이라는 두 개의 클래스를 의미 --> ellipsis.rank01
# 노래 제목을 가지고 있는 태그들을 가져오기
song = soup.select("div.ellipsis.rank01 > span > a")
song
Out[4]:
In [5]:
for s in song : #에는 1개의 태그정보가 담겨있음
    print(s.text) # s에 담겨있는 content 가져오기
Seven (feat. Latto) - Clean Ver.
Super Shy
ETA
헤어지자 말해요
Fast Forward
사막에서 꽃을 피우듯
퀸카 (Queencard)
I AM
모래 알갱이
Steal The Show (From “엘리멘탈”)
사랑은 늘 도망가
우리들의 블루스
Spicy
Love Lee
Still With You
이브, 프시케 그리고 푸른 수염의 아내
New Jeans
다시 만날 수 있을까
Hype boy
Kitsch
.
.
.
In [6]:
# 4. 가수이름 수집 (span.checkEllipsis -> 가수 이름이 두 번씩 출력되는 걸 방지)
singer = soup.select("div.ellipsis.rank02 > span.checkEllipsis")
singer
Out[6]:
In [7]:
# 데이터의 개수가 정해진 경우에는 반드시 데이터 검증이 필요하다
# (데이터의 길이, 데이터의 중복여부)
len(song)
len(singer)
Out[7]:
100
In [8]:
# 5. 수집된 데이터를 텍스트 정보만 추출해서 저장
song_list = []
singer_list = []
for i in range(len(song)) :
    song_list.append(song[i].text)
    singer_list.append(singer[i].text)
In [9]:
# 6. 표를 제작
import pandas as pd
In [10]:
dic = {"가수이름" : singer_list, "노래제목" : song_list}
melon = pd.DataFrame(dic)
melon
Out[10]:
가수이름노래제목01234...9596979899
정국 Seven (feat. Latto) - Clean Ver.
NewJeans Super Shy
NewJeans ETA
박재정 헤어지자 말해요
전소미 Fast Forward
... ...
김호중, 송가인 당신을 만나
NCT DREAM Yogurt Shake
던 (DAWN) 빛이 나는 너에게
NCT DREAM Broken Melodies
김호중 나의 목소리로

100 rows × 2 columns

In [11]:
# 7. 파일로 제작
# 인코딩 작업 -> 한글이 깨지지 않게 반드시 해줘야한다
# 1. utf-8
# 2. euc-kr
# 3. utf-8-sig
melon.to_csv("멜론차트.csv", encoding = "euc-kr")
In [12]:
melon.to_html("멜론차트.html", encoding = "euc-kr")