웹스크래핑과 데이터 수집

Chapter 3-2 Web Scraping 과제 (find_all)

Chansman 2025. 4. 16. 10:26

최종 코드

import requests
from bs4 import BeautifulSoup

header_user = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}

base_url = "https://www.melon.com/chart/index.htm"
req = requests.get(base_url, headers=header_user)
html = req.text
soup = BeautifulSoup(html, "html.parser")

# find_all을 이용하여 lst50, lst100을 한 줄로 결합
lst_all = soup.find_all(class_=["lst50", "lst100"])

# 순위, 제목, 가수, 앨범 출력
for rank, i in enumerate(lst_all, 1):
    title = i.select_one(".ellipsis.rank01 a")
    singer = i.select_one(".ellipsis.rank02 a")
    album = i.select_one(".ellipsis.rank03 a")
    print(f"[순위] {rank}")
    print(f"제목 : {title.text}")
    print(f"가수 : {singer.text}")
    print(f"앨범 : {album.text}")
    print()

📌 개념 정리

이번 과제에서는 find_all() 메서드를 사용하여 멜론 차트 페이지에서 **"lst50"**과 "lst100" 클래스를 가진 요소들을 한 줄로 결합하여 처리하는 방법을 학습합니다. find_all()은 지정된 클래스나 태그를 모두 찾아 반환하는 메서드입니다.


🚦 동작 원리 및 구조

  1. 웹 요청 및 HTML 파싱:
    requests.get()을 사용하여 멜론 차트 페이지에서 HTML을 가져온 뒤, BeautifulSoup을 사용하여 HTML을 파싱합니다.
  2. find_all() 사용:
    find_all(class_=["lst50", "lst100"])을 사용하여 **"lst50"**과 "lst100" 클래스를 가진 모든 요소들을 한 번에 추출합니다.
  3. 데이터 추출:
    추출된 각 요소에서 제목, 가수, 앨범을 select_one()을 사용하여 가져옵니다. 각 항목에 대해 .text를 사용하여 텍스트 값을 추출합니다.
  4. 결과 출력:
    순위와 함께 제목, 가수, 앨범 정보를 출력합니다. 순위는 enumerate()를 사용하여 자동으로 증가시킵니다.

💻 코드 예시 및 흐름 분석

1. 웹 요청 및 HTML 파싱

req = requests.get(base_url, headers=header_user)
html = req.text
soup = BeautifulSoup(html, "html.parser")

설명:
requests.get()을 사용하여 멜론 차트 페이지를 요청하고, 반환받은 HTML 텍스트를 BeautifulSoup으로 파싱하여 처리합니다.

2. find_all()을 사용하여 리스트 결합

lst_all = soup.find_all(class_=["lst50", "lst100"])

설명:
find_all() 메서드를 사용하여 **"lst50"**과 "lst100" 클래스를 가진 모든 요소들을 한 번에 찾습니다. 이 결과는 하나의 리스트로 결합되어 lst_all에 저장됩니다.

3. 각 항목 추출 및 출력

for rank, i in enumerate(lst_all, 1):
    title = i.select_one(".ellipsis.rank01 a")
    singer = i.select_one(".ellipsis.rank02 a")
    album = i.select_one(".ellipsis.rank03 a")
    print(f"[순위] {rank}")
    print(f"제목 : {title.text}")
    print(f"가수 : {singer.text}")
    print(f"앨범 : {album.text}")
    print()

설명:
enumerate()를 사용하여 순위를 추출하고, 각 블록에서 제목, 가수, 앨범을 select_one()을 통해 추출합니다. 그 후, .text를 사용하여 텍스트 값을 출력합니다.


🧪 실전 사례

예시 실행:

[순위] 1
제목 : Dynamite
가수 : 방탄소년단
앨범 : BE

[순위] 2
제목 : Savage Love
가수 : Jawsh 685, Jason Derulo
앨범 : Savage Love

...

위와 같이 각 곡의 순위, 제목, 가수, 앨범 정보가 출력됩니다.


🧠 고급 팁 or 자주 하는 실수

  • find_all()과 select()의 차이점:
    find_all()은 HTML 요소를 태그 이름, 클래스, 속성 등을 기반으로 여러 개를 찾을 때 유용하고, select()는 CSS 선택자를 사용하여 더 정밀하게 특정 요소를 선택할 수 있습니다. 이 예제에서는 find_all()을 사용하여 클래스를 기준으로 요소를 추출했습니다.
  • HTML 구조 변경:
    웹 페이지의 구조가 바뀌면, 기존에 사용하던 클래스나 ID가 변경될 수 있으므로, 이를 주기적으로 점검하고 수정하는 것이 중요합니다.

✅ 마무리 요약 및 복습 포인트

  1. 웹 스크래핑의 기본: requests.get()으로 데이터를 요청하고, BeautifulSoup으로 HTML을 파싱하여 원하는 정보를 추출합니다.
  2. find_all() 메서드: 한 번에 여러 클래스를 처리할 수 있도록 class_ 매개변수를 리스트로 전달하여 여러 요소를 추출할 수 있습니다.
  3. 데이터 추출: select_one()을 사용하여 각 요소에서 제목, 가수, 앨범 등의 정보를 추출하고 출력합니다.

📚 복습할 개념 체크리스트

  • find_all() 메서드: 여러 클래스를 한 번에 처리하는 방법.
  • select_one(): CSS 선택자를 사용하여 특정 요소를 선택하는 방법.
  • HTML 파싱: BeautifulSoup을 사용하여 HTML을 트리 구조로 변환하고 데이터를 추출하는 방법.
  • 웹 스크래핑 기초: requests와 BeautifulSoup을 함께 사용하여 웹 페이지에서 데이터를 추출하는 기본적인 방법.