최종 코드
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으로 데이터를 파싱하여 필요한 정보를 추출합니다.
🚦 동작 원리 및 구조
- 웹 요청 및 HTML 파싱:
requests.get()을 사용하여 CGV의 영화 차트 페이지에 접근하고, HTML 데이터를 받아옵니다. 이후 BeautifulSoup을 이용해 HTML을 파싱하여 필요한 정보를 추출할 수 있도록 트리 구조로 변환합니다. - 영화 목록 추출:
soup.select(".sect-movie-chart > ol > li")를 사용하여 각 영화의 정보를 포함하는 li 요소를 추출합니다. 이 li 요소들은 영화 순위, 제목, 예매율, 개봉일자 등을 포함합니다. - 필요한 정보 추출:
- 영화 순위는 .rank 클래스를 통해,
- 영화 제목은 .title 클래스를 통해,
- 예매율은 .percent > span 클래스를 통해,
- 개봉일자는 .txt-info > strong 클래스를 통해 추출합니다.
- 결과 출력:
각 영화에 대해 순위, 제목, 예매율, 개봉일자를 출력합니다. 개봉일자는 .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 태그 안에 포함된 불필요한 공백이나 줄바꿈을 처리할 때 유용합니다.
✅ 마무리 요약 및 복습 포인트
- 웹 스크래핑 기본: requests.get()을 통해 웹 페이지를 요청하고, BeautifulSoup을 사용하여 HTML을 파싱하고 원하는 정보를 추출합니다.
- 필요한 정보 추출: .select()와 .select_one()을 사용하여 HTML 요소에서 필요한 정보를 정확히 추출합니다.
- 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 |