728x90
SMALL
2024.09.22 - [Backend/Python] - [Python] 네이버 크롤링(검색 결과, 뉴스)
* 멜론 차트 크롤링
멜론 차트 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 |
---|
댓글