본문 바로가기
Python/Data

[Python] 멜론 차트 크롤링(TOP100 곡 제목, 가수)

by JooRi 2024. 9. 23.
728x90
SMALL

 

2024.09.22 - [Backend/Python] - [Python] 네이버 크롤링(검색 결과, 뉴스)

 

[Python] 네이버 크롤링(검색 결과, 뉴스)

* 크롤링 기초 - GET 요청과 응답 확인해 보기# pip install requests# pip install beautifulsoup4 requests : GET, POST 등 HTTP 요청을 보내기 위한 라이브러리beautifulsoup4 : HTML 문서를 파싱하고 추출할 수 있는 라이

djjin02.tistory.com

 

* 멜론 차트 크롤링

F12

멜론 차트 TOP100의 곡 제목과 가수를 크롤링해 보겠다.

 

 

import requests
from bs4 import BeautifulSoup

 

  • requests: 웹 서버로부터 데이터를 요청하고 응답받는 데 사용하는 Python 라이브러리
  • BeautifulSoup: 가져온 HTML을 파싱 하고, 원하는 데이터를 추출하는 라이브러리

이 두 라이브러리를 설치하면 파이썬 코드로 웹 크롤링을 할 수 있다.

 

 

 

# 요청 헤더 지정
headers = {
     "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
}

 

이 HTTP 헤더는 요청이 웹 브라우저에서 이루어진 것처럼 멜론 웹사이트에 보이게 한다. 

이는 일부 웹사이트가 자동화된 스크립트에 의한 접근을 차단하기 때문에 필요하다.

 

 


req = requests.get(url, headers=headers)  # html 가져오기
html = req.text

soup = BeautifulSoup(html, "html.parser")  # html 파싱

 

  • url : 내가 크롤링할 멜론 차트 웹 주소
  • requests.get() : URL에 HTTP GET 요청을 보낸다. headers 인자를 통해 위에서 설정한 User-Agent를 포함시킨다.
  • req.text : 받은 웹 페이지의 HTML 내용을 문자열로 저장
  • BeautifulSoup 객체를 생성하여 HTML을 파싱 한다. html.parser는 파싱에 사용되는 파서의 종류이다.

 

# Top 100 노래 제목
lst50 = soup.select(".lst50")  # 1~50위 class
lst100 = soup.select(".lst100")  # 51~100위 class
lst = lst50 + lst100  # 1~100위

 

  • soup.select(".lst50") : CSS 선택자를 사용해 클래스명이 lst50인 html 요소를 모두 선택(1~50위)
  • soup.select(".lst100") : CSS 선택자를 사용해 클래스명이 lst100인 html 요소를 모두 선택(51~100위)

 

 

for rank ,i in enumerate(lst, 1):
    title = i.select_one(".ellipsis.rank01 a")  # 노래 제목 추출 class
    singer = i.select_one(".ellipsis.rank02 a")  # 가수 이름 추출 class
    print(f"{rank} : {title.text}")
    print(singer.text)
    print()

 

  • enumerate(lst, 1): lst 리스트를 반복하면서 rank 변수에 1부터 시작하는 인덱스 할당
  • i.select_one("ellipsis.rank01 a"): CSS 선택자를 사용해 각 곡 제목을 포함하는 <a> 태그 선택
  • i.select_one("ellipsis.rank02 a"): CSS 선택자를 사용해 각 가수명을 포함하는 <a> 태그 선택
  • print(f"{rank} : {title.text}"): '순위 : 곡제목' 형식으로 출력
  • print(singer.text) : 가수 이름만(텍스트만) 출력

 

출력

 

끝.

 

 

 

728x90
LIST

'Python > Data' 카테고리의 다른 글

[Python] 네이버 크롤링(검색 결과, 뉴스)  (3) 2024.09.22

댓글