2. 데이터 인프라/① 데이터 인프라 : 데이터 수집

3-2. 시장데이터 수집 : 네이버 카페 크롤링 (selenium)

모딜리아니 연구실 (Lab, Modigliani) 2024. 8. 24. 14:25

특정 주제에 대해서 시장트렌드나 사람들의 니즈를 확인하기 위해서 다양한 데이터가 활용된다. 그중에 가장 흔히 사용되는 온라인 커뮤니티, 그중에서도 네이버 카페 크롤링 방법을 알아보자.
파이썬 라이브러리 버전 등 환경설정 문제를 피하기 위해서 Colab 같은 클라우드 환경을 주로 사용하지만, 네이버 카페의 경우 보안로그인(CAPTCHA) 과정이 필요해서 온프레미스 환경에서 구현되도록 했다.

1) 네이버 로그인

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time

# Chrome WebDriver 설정
options = Options()
# options.add_argument('--headless')  # headless 모드를 비활성화하여 브라우저가 실제로 실행되도록 설정 (주석 처리)
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')

# Chromedriver의 경로를 지정
chromedriver_path = r"C:\Users\user\Downloads\chromedriver.exe"  # 실제 Chromedriver 경로로 교체
service = Service(executable_path=chromedriver_path)

# WebDriver 초기화
driver = webdriver.Chrome(service=service, options=options)

# 네이버 로그인 페이지로 이동
driver.get("https://nid.naver.com/nidlogin.login")

# 페이지 로드 대기
time.sleep(2)

# 사용자 상호작용 대기: CAPTCHA가 발생하면 사용자가 직접 해결
input("CAPTCHA를 해결하고 나서 엔터 키를 누르세요")
윈도우에 깔린 구글 크롬브라우저 버전과 크롬드라이버(크롤링 시 사용되는 가상의 크롬) 버전이 맞지 않으면 오류가 날 수 있어 버전을 맞춰주는 사전 작업이 필요하다. 윈도우 크롬버전 확인과 그에 맞는 크롬드라이버 다운로드는 인터넷에 많이 소개되어 있으니 참고하면 된다. 이때 다운로드한 chromedriver.exe파일의 경로를 코드 상에 지정해줘야 한다. 아래는 예시이니 경로확인 후 변경해줘야 한다.
chromedriver_path = r"C:\Users\user\Downloads\chromedriver.exe" "

위 코드를 실행하면 새 크롬창이 뜨면서 로그인 화면이 나타나고, 여기서 평소처럼 로그인 한 뒤 코드로 돌아가서 엔터를 눌러주면 로그인까지 됐다. 이 화면을 닫으면 코드가 중단되니 창을 유지해놓아야 한다. 참고로 코드 진행상황을 해당창에서 확인할 수 있다.


2) 원하는 네이버 카페에서 키워드 검색하기

크롤링하고자 하는 카페에 들어가서 원하는 키워드로 검색까지 진행해 보자. 카페 주소를 입력하고, 검색어를 넣어준다. 검색어 입력과 검색버튼 클릭은 공통적인 템플릿이어서 코드를 카페마다 변경하지 않아도 된다.

카페명과 검색하고자 하는 키워드를 넣어주면 된다
cafe_url = "https://cafe.naver.com/카페이름"
search_box.send_keys('검색키워드')
# 이후 스크립트가 자동으로 다시 실행
cafe_url = "https://cafe.naver.com/카페이름"
driver.get(cafe_url)

# 검색어 입력란 찾기 및 검색어 입력
search_box = driver.find_element(By.ID, 'topLayerQueryInput')
search_box.send_keys('검색키워드')

# 검색 버튼 클릭
search_button = driver.find_element(By.CSS_SELECTOR, 'button.btn')
search_button.click()

# 검색 결과 페이지 로드 대기
time.sleep(2)

 위 코드에서 카페명과 검색키워드만 바꿔서 실행하면 1단계에서 로그인했던 화면이 해당 카페의 검색결과 화면으로 바뀐 것을 볼 수 있다.



3) 게시글 제목 가져오기
이제 검색결과를 수집할 차례다. 아래 코드를 실행하면 게시글 제목과 작성날짜가 (첫 페이지부터 마지막 페이지까지) 크롤링되어 엑셀파일로 저장된다.

코드 상에서 엑셀파일을 저장할 경로를 미리 정해줘야 한다
excel_path = r"C:\Users\user\Downloads\naver_cafe_posts.xlsx"
# iframe으로 전환
driver.switch_to.frame("cafe_main")

# 게시글 데이터를 저장할 리스트 초기화
data = []

# 페이지 번호를 관리할 변수 초기화
page_number = 1

while True:
    # 게시글 제목과 날짜 크롤링
    titles = driver.find_elements(By.CSS_SELECTOR, 'a.article')
    dates = driver.find_elements(By.CSS_SELECTOR, 'td.td_date')

    # 데이터 리스트에 저장
    for title, date in zip(titles, dates):
        data.append({
            '제목': title.text.strip(),
            '날짜': date.text.strip()
        })

    # 제목과 날짜 출력
    for title, date in zip(titles, dates):
        print(f"제목: {title.text.strip()}")
        print(f"날짜: {date.text.strip()}")
        print("-" * 40)

    # 다음 페이지로 이동
    try:
        next_page = driver.find_element(By.XPATH, f'//a[text()="{page_number + 1}"]')
        next_page.click()
        page_number += 1
        time.sleep(2)  # 페이지 로드 대기
    except:
        print("더 이상 페이지가 없습니다.")
        break

# driver.quit()

# 데이터프레임으로 변환
df = pd.DataFrame(data)

# 엑셀 파일로 저장
excel_path = r"C:\Users\user\Downloads\naver_cafe_posts.xlsx"  # 저장할 파일 경로를 지정
df.to_excel(excel_path, index=False)

print(f"데이터가 {excel_path}에 저장되었습니다.")
반응형