Chapter 3-3 Web Scraping 과제 (CGV 사이트에 있는 무비차트)

2025. 4. 16. 10:29·웹스크래핑과 데이터 수집

최종 코드

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"}

url = "http://www.cgv.co.kr/movies/?lt=1&ft=0"
req = requests.get(url, headers=header_user)
html = req.text
soup = BeautifulSoup(html, "html.parser")

# 영화 목록 추출
movies = soup.select(".sect-movie-chart > ol > li")
for move in movies:
    # 영화 순위
    rank = move.select_one(".rank")
    if rank:
        # 영화 제목
        title = move.select_one(".title")
        # 예매율
        percent = move.select_one(".percent > span")
        # 개봉일자
        txt_info = move.select_one(".txt-info > strong").text
        
        # 출력
        print(f"순위 : {rank.text.strip()}")
        print(f"제목 : {title.text.strip()}")
        print(f"예매율 : {percent.text.strip()}")
        print(f"개봉일자 : {txt_info.strip()[:10]}")  # 개봉일자는 날짜만 추출
        print()

📌 개념 정리

이번 과제는 CGV 영화 차트 페이지에서 영화 순위, 제목, 예매율, 개봉일자를 추출하는 작업입니다. requests 라이브러리로 HTML을 가져오고, BeautifulSoup으로 데이터를 파싱하여 필요한 정보를 추출합니다.


🚦 동작 원리 및 구조

  1. 웹 요청 및 HTML 파싱:
    requests.get()을 사용하여 CGV의 영화 차트 페이지에 접근하고, HTML 데이터를 받아옵니다. 이후 BeautifulSoup을 이용해 HTML을 파싱하여 필요한 정보를 추출할 수 있도록 트리 구조로 변환합니다.
  2. 영화 목록 추출:
    soup.select(".sect-movie-chart > ol > li")를 사용하여 각 영화의 정보를 포함하는 li 요소를 추출합니다. 이 li 요소들은 영화 순위, 제목, 예매율, 개봉일자 등을 포함합니다.
  3. 필요한 정보 추출:
    • 영화 순위는 .rank 클래스를 통해,
    • 영화 제목은 .title 클래스를 통해,
    • 예매율은 .percent > span 클래스를 통해,
    • 개봉일자는 .txt-info > strong 클래스를 통해 추출합니다.
  4. 결과 출력:
    각 영화에 대해 순위, 제목, 예매율, 개봉일자를 출력합니다. 개봉일자는 .strip()을 사용하여 불필요한 공백을 제거한 후, 날짜만 출력하도록 처리합니다.

💻 코드 예시 및 흐름 분석

1. 웹 요청 및 HTML 파싱

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

설명:
requests.get()을 사용하여 URL에서 HTML 페이지를 요청하고, BeautifulSoup을 사용해 HTML을 파싱합니다.

2. 영화 목록 추출

movies = soup.select(".sect-movie-chart > ol > li")

설명:
.sect-movie-chart > ol > li 선택자를 사용하여 영화 차트에 있는 각 영화를 포함하는 li 요소들을 리스트로 추출합니다.

3. 필요한 정보 추출 및 출력

for move in movies:
    rank = move.select_one(".rank")
    if rank:
        title = move.select_one(".title")
        percent = move.select_one(".percent > span")
        txt_info = move.select_one(".txt-info > strong").text
        
        print(f"순위 : {rank.text.strip()}")
        print(f"제목 : {title.text.strip()}")
        print(f"예매율 : {percent.text.strip()}")
        print(f"개봉일자 : {txt_info.strip()[:10]}")
        print()

설명:

  • for 루프를 사용하여 각 영화 정보를 순차적으로 처리합니다.
  • select_one()을 사용하여 순위, 제목, 예매율, 개봉일자를 추출합니다.
  • 각 항목에서 .text.strip()을 사용하여 불필요한 공백을 제거하고, 예매율과 개봉일자 정보를 출력합니다.

🧪 실전 사례

예시 실행:

순위 : 1
제목 : 더 수사극
예매율 : 89%
개봉일자 : 2021.08.25

순위 : 2
제목 : 이터널스
예매율 : 84%
개봉일자 : 2021.11.03

위와 같이 각 영화의 순위, 제목, 예매율, 개봉일자를 출력할 수 있습니다.


🧠 고급 팁 or 자주 하는 실수

  • 선택자 정확성:
    HTML 구조가 변경될 경우, 기존에 사용하던 선택자가 작동하지 않을 수 있습니다. soup.select()나 select_one()을 사용할 때, HTML 구조를 반드시 확인하고, 필요한 태그나 클래스를 정확히 지정해야 합니다.
  • strip() 사용:
    .strip()을 사용하여 문자열에서 양쪽 공백을 제거하는 것이 중요합니다. 특히, HTML 태그 안에 포함된 불필요한 공백이나 줄바꿈을 처리할 때 유용합니다.

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

  1. 웹 스크래핑 기본: requests.get()을 통해 웹 페이지를 요청하고, BeautifulSoup을 사용하여 HTML을 파싱하고 원하는 정보를 추출합니다.
  2. 필요한 정보 추출: .select()와 .select_one()을 사용하여 HTML 요소에서 필요한 정보를 정확히 추출합니다.
  3. strip() 활용: 출력되는 정보에서 불필요한 공백을 제거하는 방법을 학습했습니다.

📚 복습할 개념 체크리스트

  • requests 라이브러리: HTTP 요청을 보내고 응답을 처리하는 방법.
  • BeautifulSoup: HTML을 파싱하여 특정 요소를 추출하는 방법.
  • select()와 select_one(): CSS 선택자를 사용하여 HTML 요소를 선택하는 방법.
  • strip(): 문자열에서 공백을 제거하는 방법.

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

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

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 3-3 Web Scraping 과제 (CGV 사이트에 있는 무비차트)
상단으로

티스토리툴바