프로젝트

Chapter 2 네이버 동적 스크랩핑,크롤러 프로젝트

Chansman 2025. 4. 15. 14:10

📌 네이버 블로그 크롤러 프로젝트

오늘 진행한 프로젝트는 네이버 블로그에서 원하는 키워드로 검색 후, 검색 결과를 크롤링하여 블로그 제목, 작성자, 링크, 요약 내용을 출력하는 작업입니다. 이 프로젝트는 SeleniumBeautifulSoup을 활용하여 웹 페이지를 자동으로 스크롤하고 데이터를 추출하는 방법을 실습했습니다.


🚦 프로젝트 설명

목표: 네이버에서 사용자 입력에 따른 키워드로 검색하고, 그 결과로 나타나는 블로그의 제목, 링크, 작성자, 요약을 자동으로 크롤링하여 출력하는 프로그램을 구현하는 것이었습니다.


💻 프로젝트 코드 분석

1. 필요한 라이브러리 설치

먼저, 웹 요청 처리HTML 파싱을 위해 필요한 라이브러리를 설치합니다:

  • requests: 웹 페이지의 HTML을 가져오는 데 사용.
  • selenium: 브라우저 자동화 도구로, 네이버 페이지의 동적 데이터를 가져오는 데 사용.
  • BeautifulSoup: 가져온 HTML을 파싱하고 원하는 데이터를 추출하는 데 사용.
  • time: 웹 페이지 로딩 시간을 기다리기 위한 시간 대기용.
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

2. 사용자 입력 처리

사용자에게 검색할 키워드를 입력받습니다.

# 사용자가 원하는 검색어 입력
keyword = input("검색할 키워드를 입력하세요: ")

3. 검색 URL 생성

사용자가 입력한 검색어를 바탕으로 네이버 검색 URL을 동적으로 생성합니다.

# URL에 입력된 검색어를 적용하여 네이버 검색 URL 생성
url = f"https://search.naver.com/search.naver?ssc=tab.blog.all&sm=tab_jum&query={keyword}"

4. 브라우저 자동화 및 옵션 설정

Selenium의 webdriver를 사용하여 크롬 브라우저를 자동으로 실행하고, 사용자 에이전트를 설정하여 브라우저를 사람처럼 보이게 만듭니다. 또한, 불필요한 로그와 자동 종료를 방지하는 설정을 추가합니다.

 
header_user = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"
options_ = Options()
options_.add_argument(f"User-Agent={header_user}")
options_.add_experimental_option("detach", True)  # 브라우저 종료되지 않게 설정
options_.add_experimental_option('excludeSwitches', ["enable-logging"])  # 불필요한 로그 제거

# Chrome WebDriver에 옵션 추가
driver = webdriver.Chrome(options=options_)

5. 웹 페이지 열기 및 스크롤 내리기

Selenium을 통해 네이버 검색 페이지에 접속하고, 5번 스크롤을 내립니다. 각 스크롤 후, 페이지 로딩을 기다리기 위해 2초의 대기 시간을 설정했습니다.

 
# 네이버 검색 URL로 접속
driver.get(url)
time.sleep(1)

# 스크롤 내리기 5번 실행
for i in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")  # 맨 아래로 스크롤
    time.sleep(2)  # 2초 대기 (페이지 로딩을 위해 조금 더 긴 시간 대기)

6. HTML 파싱 및 데이터 추출

BeautifulSoup을 사용하여 웹 페이지의 HTML을 파싱하고, 필요한 데이터(제목, 링크, 작성자, 요약)를 추출합니다. 각 블로그 글이 광고인지 확인하여 광고 글을 제외하고, 순차적으로 결과를 출력합니다.

 
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

result = soup.select(".view_wrap")  # 블로그 글이 있는 영역 선택

rank = 1
for i in result: 
    ad = i.select_one(".link_ad") # 광고 여부 확인
    
    if not ad :
        title = i.select_one(".title_link").text
        link = i.select_one(".title_link")["href"]
        writer = i.select_one(".name").text  # 작성자
        dsc = i.select_one(".dsc_link").text  # 요약 내용
        print(f"번호 : {rank}")
        print(f"제목 : {title}")
        print(f"링크 : {link}")
        print(f"작성자 : {writer}")
        print(f"글요약 : {dsc}")
        print('---------------')
        rank += 1

7. 프로그램 종료

이 프로그램은 웹 페이지를 자동으로 스크롤하고 데이터를 추출한 후, 브라우저를 종료하지 않고 계속 사용할 수 있도록 설정합니다. detach 옵션을 사용하여 브라우저가 자동으로 종료되지 않도록 설정했습니다.


✅ 최종 코드

import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time  # 파이썬 기본 패키지

# 사용자가 원하는 검색어 입력
keyword = input("검색할 키워드를 입력하세요: ")

# URL에 입력된 검색어를 적용하여 네이버 검색 URL 생성
url = f"https://search.naver.com/search.naver?ssc=tab.blog.all&sm=tab_jum&query={keyword}"

# User-Agent 설정
header_user = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"
options_ = Options()
options_.add_argument(f"User-Agent={header_user}")
options_.add_experimental_option("detach", True)  # 브라우저 종료되지 않게 설정
options_.add_experimental_option('excludeSwitches', ["enable-logging"])  # 불필요한 로그 제거

# Chrome WebDriver에 옵션 추가
driver = webdriver.Chrome(options=options_)  # options_를 전달하여 브라우저 설정을 적용

# 네이버 검색 URL로 접속
driver.get(url)
time.sleep(1)

# 스크롤 내리기 5번 실행
for i in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")  # 맨 아래로 스크롤
    time.sleep(2)  # 2초 대기 (페이지 로딩을 위해 조금 더 긴 시간 대기)

html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

result = soup.select(".view_wrap")  #select/find -> select로 찾아서 나오는 결과는 리스트와 동일한 형태다

rank = 1
for i in result: 
    ad = i.select_one(".link_ad") #값이 있어 -> True / False / 챌린지 힌트
    
    if not ad :
        title = i.select_one(".title_link").text
        link = i.select_one(".title_link")["href"]
        writer = i.select_one(".name").text #작성자
        dsc = i.select_one(".dsc_link").text #요약 내용
        print(f"번호 : {rank}")
        print(f"제목 : {title}")
        print(f"링크 : {link}")
        print(f"작성자 : {writer}")
        print(f"글요약 : {dsc}")
        print('---------------')
        rank += 1


# 필요한 추가 작업 (예: 특정 요소 클릭, 페이지의 데이터를 크롤링하는 작업 등)
# 예를 들어, 특정 블로그 제목을 추출하려면 아래와 같은 코드 추가 가능
# titles = driver.find_elements_by_css_selector('div.blog_section > div > div > div > a')
# for title in titles:
#     print(title.text)

# 브라우저를 종료하지 않고 계속 사용할 수 있음

 

✅ 결과 출력

프로그램이 실행되면, 검색된 블로그 글의 제목, 작성자, 링크, 요약콘솔에 출력됩니다. 예시 출력은 다음과 같습니다:

 
번호 : 1
제목 : 이정후 배리본즈 비교 스윙
링크 : https://example.com
작성자 : 블로거A
글요약 : 어제 양키스전에서 멋진 홈런을 기록한 이정후에 대한 분석...
---------------
번호 : 2
제목 : 이정후 뉴욕의 체질
링크 : https://example.com
작성자 : 블로거B
글요약 : 이정후 선수가 뉴욕에서 좋은 성적을 기록한 이유를...
---------------

✅ 결론

이 프로젝트를 통해 SeleniumBeautifulSoup을 활용하여 네이버 블로그 데이터를 크롤링하는 방법을 실습했습니다. 사용자가 원하는 키워드검색 결과를 자동으로 스크롤하며 데이터를 추출할 수 있었고, 크롤링 자동화동적 페이지 처리에 대한 이해를 돕는 프로젝트였습니다.

추가적으로, 스크롤을 내리면서 동적으로 로드되는 콘텐츠를 처리하고, 효율적으로 데이터를 추출하는 방법을 익힐 수 있었습니다.

 
 
 

 

 
 
검색