본문 바로가기
Python

여러 페이지 크롤링 자동화 - BeautifulSoup vs Selenium 완전 비교

by ramzee 2025. 3. 31.

0. 이 글은 무엇을 위한 글인가요?

  • 뉴스, 쇼핑몰, 블로그처럼 페이지가 여러 개인 데이터를 반복해서 수집하고 싶어요!
  • 페이지를 넘기며 자동으로 크롤링하는 방법이 궁금해요.
  • Selenium과 BeautifulSoup 중 뭘 써야 할까요?

이 글에서는 동일한 크롤링 작업을 BeautifulSoup과 Selenium으로 나눠서 비교하며 설명합니다.


1. 분석 대상: 네이버 뉴스 랭킹 (연예 뉴스)


방법 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
  • 상황에 따라 적절히 혼합하여 사용하는 것이 가장 효율적