Ex02 멜론차트

박산해·2025년 3월 25일

import requests as req
from bs4 import BeautifulSoup as bs

#1. 사이트 정보 요청
req.get("https://www.melon.com/chart/index.htm")

응답이 406이 나온 이유 = 서버에서 브라우저가 아님을 감지

요청을 할 때 브라우저의 정보를 담아서 재 요청한다.

개발자도구 -> 네트워크 -> document문서 -> headers탭에 user-agent값을 불러온다.

요청을 할 때 해당 정보를 동반해서 보낸다 * headers안에 담아서 보내자!

browser = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"}

res = req.get("https://www.melon.com/chart/index.htm",headers = browser)

#2. HTMl 데이터로 변환
soup = bs(res.text, "lxml")

#3 가수 100명, 노래 100곡 수집 = 요소 수집

노래제목 수집

선택자를 분석할 때 class,id 구분자가 없다면 자식 선택자를 활용하자.

* 부모가 구분자가 있을 때 까지 분석해야한다. -> 범위를 좁히기 위해서

* 클래스값 중간에 공백 존재 = 클래스가 여러개 -> 공백을 지우고 클래스를 .으로 이어준다.

title = soup.select("div.ellipsis.rank01 > span > a")

가수이름 수집

singer = soup.select("div.ellipsis.rank02 > span")

#4. 데이터 검증(데이터의 개수, 중복여부)

데이터의 개수가 중요하다면 반드시 검증을 먼저하고 진행한다.

len(title)

크롤링 1회차 정리

  1. 크롤링 = 인터넷 상에 존재하는 데이터를 수집하는 기술
  2. requests = 파이썬에서 브라우저 역할을 대신하는 라이브러리
    • get("url") = 특정 사이트의 정보를 요청
    • .text = HTML 데이터만 추출은 가능 (타입이 String)
  3. bs = req로 받아온 text데이터를 HTML 데이터로 변환(파싱)
    • bs(res.text, "lxml")
    • String데이터가 HTML데이터로 변환
    • bs 객체화
  4. 요소 수집 = select("선택자")
    • 선택자는 최대한 정확하게 적는다(범위를 좁힌다.)
    • class, id가 있다면 바로 사용이 가능
    • 없는 경우에는 부모 태그를 활용한 계층선택자
    • 반드시 부모태그도 구분자가 있을 때 까지 분석한다
    • 클래스 중간에 공백이 있다면 = 복수의 클래스
    • 해결책 : 공백을 지우고 .으로 클래스를 연결한다.
  5. 데이터 검증
    • 수집하고자 하는 데이터가 개수가 중요한 경우
    • 데이터의 개수, 데이터의 중복여부
  6. 오후 수업내용
    • 멜론차트 수집 -> 데이터프레임 -> 파일로 저장
    • 환율정보 수집(수집이 안된다.) -> 숨은 데이터 찾기

반복문을 통해서 리스트 값들을 확인

for i in singer :
print(i.text)

데이터를 수집할때 원하는 결과가 나오지 않는다면, 반드시 주변 태그들을 살펴보자

크롤링은 다른 사람이 만들어놓은 코드를 분석해서 수집만 가능 -> 코드의 수정을 불가능

가수이름, 노래제목을 컨텐츠만 저장

title_list에 title안에 값을 하나씩 꺼내서 글자만 저장한다.

title_list = []
singer_list = []
for i in title :
title_list.append(i.text)
for i in singer :
singer_list.append(i.text)

반복문을 합치기

코드를 완성할 땐 효율성과 유지보수성을 늘 생각하자.

title_list = []
singer_list = []
for i in range(len(title)) :
title_list.append(title[i].text)
singer_list.append(singer[i].text)

pandas를 통해서 표를 제작

import pandas as pd

컬럼과 데이터 구조를 만들기 위해서 딕셔너리를 활용

리스트 vs 딕셔너리

리스트 = 데이터를 인덱스로 조회 = 같은 의미의 데이터만 저장

딕셔너리 = 데이터를 키값으로 조회 = 다른 의미의 데이터를 저장

data = {"가수" : singer_list, "제목" : title_list}

melon = pd.DataFrame(data)

파일로 저장

대화 : melon을 csv로

파일을 저장할 때 주의할 점!

1) 파일이름, 확장자를 작성하자

2) 한글이 포함된 경우에는 인코딩을 해주자 utf-8, euc-kr, utf-8-sig

melon.to_csv("멜론차트.csv",encoding="utf-8-sig")

0개의 댓글