0. 이 글은 무엇을 위한 글인가요?
- 뉴스, 쇼핑몰, 블로그처럼 페이지가 여러 개인 데이터를 반복해서 수집하고 싶어요!
- 페이지를 넘기며 자동으로 크롤링하는 방법이 궁금해요.
- Selenium과 BeautifulSoup 중 뭘 써야 할까요?
이 글에서는 동일한 크롤링 작업을 BeautifulSoup과 Selenium으로 나눠서 비교하며 설명합니다.
1. 분석 대상: 네이버 뉴스 랭킹 (연예 뉴스)
- URL : https://m.entertain.naver.com/ranking
- 관찰 결과: li.NewsItem_news_item__fhEmd, a.NewsItem_link_news__tD7x3 태그에 있
- 목표: 10개의 기사 제목과 링크 수집
방법 1: BeautifulSoup로 반복 크롤링
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 랭킹 뉴스 URL
url = "https://m.entertain.naver.com/ranking"
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 뉴스 아이템 선택
news_items = soup.select('li.NewsItem_news_item__fhEmd a.NewsItem_link_news__tD7x3')
# 결과 저장
news_list = []
for item in news_items:
title_tag = item.select_one('em.NewsItem_title__BXkJ6')
if title_tag:
title = title_tag.get_text(strip=True)
link = item['href']
# 모바일 링크를 PC용으로 변환하려면 'https://n.news.naver.com/article/... 형식'으로 조정 가능
news_list.append({'제목': title, '링크': link})
# DataFrame으로 변환
df = pd.DataFrame(news_list)
print(df.head())
출력 예시
Empty DataFrame
Columns: []
Index: []
장점: 빠르고 간단함
주의: JavaScript 렌더링된 내용은 수집 불가
-> HTML 구조가 JavaScript로 동적으로 렌더링되기 때문에
requests + BeautifulSoup으로는 뉴스 목록이 있는 <li class="NewsItem_news_item__fhEmd"> 요소를 가져올 수 없음
방법 2: Selenium으로 반복 크롤링
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd
import time
# 크롬 옵션 설정
options = Options()
options.add_argument('--headless') # 브라우저 안 띄움
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
# ✅ 크롬 드라이버 자동 다운로드 및 설정
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
# 네이버 연예 랭킹 뉴스 페이지 접속
url = "https://entertain.naver.com/ranking"
driver.get(url)
time.sleep(3) # 페이지 로딩 대기
# 뉴스 항목 가져오기
news_items = driver.find_elements(By.CSS_SELECTOR, 'li.NewsItem_news_item__fhEmd')
# 결과 저장
news_list = []
# 제목과 링크 추출
for item in news_items:
try:
a_tag = item.find_element(By.CSS_SELECTOR, 'a.NewsItem_link_news__tD7x3')
title = item.find_element(By.CSS_SELECTOR, 'em.NewsItem_title__BXkJ6').text.strip()
link = a_tag.get_attribute('href')
news_list.append({'제목': title, '링크': link})
except:
continue
# 브라우저 종료
driver.quit()
# DataFrame으로 정리
df = pd.DataFrame(news_list)
print(df.head())
출력 예시
번호 제목 링크
0 0 [단독]최여진, 결혼 날짜 잡았다..'7살 연상' ♥예비 신랑과 '동상이몽2' 합류 https://m.entertain.naver.com/ranking/article/108/0003313668
1 1 조갑경♥홍서범, 펜트하우스 90평대에 난장판 집 공개('다 컸는데') https://m.entertain.naver.com/ranking/article/109/0005266519
...
장점: 동적 콘텐츠 대응 가능
단점: 느리고 설정이 복잡
결과 저장 (공통)
df_selenium.to_csv('연예뉴스_Selenium.csv', index=False, encoding='utf-8-sig')
df_bs.to_csv('연예뉴스_BeautifulSoup.csv', index=False, encoding='utf-8-sig')
BeautifulSoup vs Selenium 비교 요약
항목 | BeautifulSoup | Selenium |
---|---|---|
속도 | 빠름 | 느림 |
설치 편의성 | 간단 | 드라이버 필요 |
동적 페이지 | 불가 | 가능 |
디버깅 편의성 | 낮음 | 브라우저로 직접 확인 가능 |
자동화/배포 | 가벼움 | 무거움 |
결론: 언제 무엇을 써야 할까?
- 정적 웹페이지 → BeautifulSoup
- 동적 콘텐츠 / 로그인 / 클릭 필요 → Selenium
- 상황에 따라 적절히 혼합하여 사용하는 것이 가장 효율적
'Python' 카테고리의 다른 글
네이버 블로그·카페 크롤링 + 키워드 & 날짜 필터링 자동화 (0) | 2025.04.02 |
---|---|
키워드 기반 뉴스 크롤링 자동화 프로젝트 (Selenium + BeautifulSoup) (0) | 2025.04.01 |
Python Selenium으로 동적 웹페이지 크롤링 완전 정복 (기초편) (0) | 2025.03.30 |
Python으로 웹 크롤링 시작하기 - BeautifulSoup 완전 입문 (0) | 2025.03.29 |
외부 CSV 파일 불러오기부터 분석, 저장까지 실전 예제 완전 정복 (0) | 2025.03.28 |