Chapter 3-2 Web Scraping 과제 (find_all)

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을 함께 사용하여 웹 페이지에서 데이터를 추출하는 기본적인 방법.

'웹스크래핑과 데이터 수집' 카테고리의 다른 글

Chapter 3-4 Web Scraping 과제 (멜론차트 Top100 1위부터 100위까지)  (0) 2025.04.16
Chapter 3-3 Web Scraping 과제 (CGV 사이트에 있는 무비차트)  (0) 2025.04.16
Chapter 3-1 Web Scraping 과제 (광고 x)  (0) 2025.04.16
Chapter 2-1 사람이 접속한것 처럼 보이는 방법  (0) 2025.04.15
Chapter 1-6 사람이 접속한것 처럼 보이는 방법  (0) 2025.04.15
'웹스크래핑과 데이터 수집' 카테고리의 다른 글
  • Chapter 3-4 Web Scraping 과제 (멜론차트 Top100 1위부터 100위까지)
  • Chapter 3-3 Web Scraping 과제 (CGV 사이트에 있는 무비차트)
  • Chapter 3-1 Web Scraping 과제 (광고 x)
  • Chapter 2-1 사람이 접속한것 처럼 보이는 방법
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (793) N
      • Python (32)
      • 프로젝트 (113) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    life reflection
    global politics
    뷔
    remittance
    RM
    livebroadcast
    classaction
    chinanightlife
    travel ban
    btsdischarge
    youngprofessionals
    americanlaw
    bts
    trumpmuskclash
    homebartrend
    lawsuitculture
    gpterror
    btsreunion
    hotcoffeecase
    chatgpterror
    newpoliticalparty
    basalcellcarcinoma
    btscomeback
    americaparty
    self-growth
    college reunions
    smartphonedurability
    titaniumcase
    btsjungkook
    urbantrends
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 3-2 Web Scraping 과제 (find_all)
상단으로

티스토리툴바