python

[혼자하는 파이썬] 네이버 뉴스 칼럼 카테고리 크롤링 코드

알세지 2024. 3. 5. 15:24

혼자한다.

아니다. 지피티와 함께 한다.


네이버 뉴스 카테고리에는 오피니언이 있고, 그 밑에 칼럼 카테고리가 따로 있다.

이 칼럼카데고리의 칼럼에 대한 크롤링 코드다

다른 크롤링에 비해서 별다를 건 없다.

한페이지에 다 보여지지 않으니, 셀레니움 써서 스크롤 몇번 해야 한다.

 

 

[아래는 코드 전문]

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
import pandas as pd
from datetime import datetime
from selenium.common.exceptions import NoSuchWindowException

# Selenium 웹 드라이버를 시작합니다.
driver = webdriver.Chrome()  # Chrome 드라이버를 사용합니다. Chrome 버전에 맞는 드라이버가 필요합니다.

# 엑셀 파일 생성을 위한 데이터 프레임 초기화
df = pd.DataFrame(columns=['날짜', '언론사', '제목', '링크', '미리보기'])

try:
    # 네이버 칼럼 메인 페이지 URL
    url = "https://news.naver.com/opinion/column"
    
    # 페이지에 접속합니다.
    driver.get(url)

    # 페이지 스크롤을 화면 끝까지 내립니다.
    for _ in range(10):  # 10번 스크롤합니다.
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1)  # 스크롤 간 시간 간격을 줍니다.

    # 페이지 소스를 가져옵니다.
    html = driver.page_source

    # BeautifulSoup을 사용하여 파싱합니다.
    soup = BeautifulSoup(html, 'html.parser')

    # 뉴스 정보 찾기
    news_list = soup.find_all('li', class_='opinion_column_item')

    # 결과 출력 및 엑셀 파일에 저장
    for news in news_list:
        title = news.select_one('a > div.content_area > strong')
        if title:
            title = title.text.strip()

        link = news.select_one('a')['href']

        description = news.select_one('.content_area > p.description')
        if description:
            description = description.text.strip()

        press_name = news.select_one('div.sub_info > span.sub_item:nth-child(1)')
        if press_name:
            press_name = press_name.text.strip()

        date = news.select_one('div.sub_info > span.sub_item:nth-child(2)')
        if date:
            date = date.text.strip()

        # 결과 출력
        print("날짜:", date)
        print("언론사:", press_name)
        print("제목:", title)
        print("링크:", link)
        print("미리보기:", description)        
        print()

        # 엑셀 파일에 저장
        df = df.append({'언론사': press_name, '제목': title, '미리보기' :description, '링크': link, '날짜': date}, ignore_index=True)
except NoSuchWindowException:
    print("NoSuchWindowException: WebDriver가 이미 닫힌 창을 타겟으로 합니다. 프로그램이 종료됩니다.")

# Selenium 드라이버를 종료합니다.
driver.quit()

# 현재 날짜 및 시간을 가져옵니다.
current_date = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")

# 엑셀 파일로 저장합니다.
file_name = f"{current_date}_네이버칼럼.xlsx"
df.to_excel(file_name, index=False)

print("검색 결과가 엑셀 파일로 저장되었습니다:", file_name)