본문 바로가기

자동화/Selenium

네이버부동산 특정날짜 주요뉴스 목록 추출하기

728x90

내집 마련을 위해 돈을 모으면서 뉴스를 찾아서 보게되는데요.

요즘은 금리 인상으로 집값 하락에 대한 뉴스가 많아 시장 흐름을 알기 위해 부동산 뉴스를 많이 보게 됩니다.

부동산이나 경제 뉴스를 찾아 보게 되는데 그러다 뉴스를 자동화로 추출해서 정리하면 좋을듯 하여 공부도 할겸 구현을 해보았습니다.

 

네이버 부동산 URL을 보니 URL 마지막에 날짜 형식으로 되어 있는 걸 확인할 수 있었습니다.

그래서 console로 특정날짜를 YYYYMMDD 형식으로 입력하여 특정 날짜 뉴스 목록 URL로 이동할 수 있게 구현하였습니다.

 

# 날짜 입력
input_day = input("날짜를 입력하세요. : ")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

driver.get('https://land.naver.com/news/headline.naver?bss_ymd=' + input_day)

 

네이버부동산 URL을 통해 진입시 상단에 뉴스가 2개 노출되는데 해당 데이터를 추출하기 위해 find_elements를 중심으로 구현하였습니다.

제목과 요약은 text로 추출한 뒤 split 함수를 통해 문자열을 잘라서 구현하였으며,

링크는 get_attribute('href')을 통해 쉽게 구현할 수 있었습니다.

 

# TopNews 2개 데이터 추출
for i in range(2):
    test = driver.find_elements(By.CLASS_NAME, 'news_list')[i].text
    test_list = test.split('\n')
    link = driver.find_elements(By.CLASS_NAME, 'news_list')[i].find_element(By.TAG_NAME, 'a').get_attribute('href')
    ws.append([count, test_list[0], test_list[1], link])
    count = count + 1

 

나머지 head 기사를 추출하기 위해 보니 타이틀과 링크 데이터 / 요약을 따로 구분하는 방법이 편해보여서 2개를 구분하여 구현하였습니다.

find_elements > a 태그로 목록을 추출하고 보니 사진도 a 링크가 걸려있는걸 확인하였습니다.

사진 a 태그는 텍스트로 뽑을 때 빈칸 데이터로 노출되기 때문에

빈칸 데이터인 경우에는 반복문을 넘기고 빈칸 데이터가 아닌 경우에만 타이틀과 링크 데이터를 저장할 수 있게 구현하였습니다.

 

이번에는 리스트 형식으로 엑셀에 저장하는게 아닌 특정 위치에 데이터를 넣는 방식으로 구현하였습니다.

(타이틀과 내용 요약을 서로 다른 반복문에서 구현하였기 때문에 해당 방식을 사용하였습니다.)

 

# head 기사 데이터 추출
headline_title_list = driver.find_element(By.CLASS_NAME, 'headline_list').find_elements(By.TAG_NAME, 'a')

# 타이틀과 링크 데이터 추출
for i in headline_title_list:
    if i.text != "":
        ws['A' + str(count+1)] = count
        ws['B' + str(count+1)] = i.text
        ws['D' + str(count+1)] = i.get_attribute('href')
        count = count + 1

 

내용 요약 데이터 추출도 위와 비슷한 방식으로 구현하였는데 문자열을 자르지 않으면 뒤에 뉴스발행사와 날짜가 같이 나오기 때문에

split 함수를 통해 '...' 구분자로 요약을 잘라서 구현하였습니다.

 

headline_main_list = driver.find_element(By.CLASS_NAME, 'headline_list').find_elements(By.TAG_NAME, 'dd')

count = 3

# 요약 데이터 추출
for i in headline_main_list:
    test = i.text.split('...')
    ws['C' + str(count+1)] = test[0]
    count = count + 1

 

전체 코드입니다. 단순하게 구현하였는데 특정달 데이터를 뽑거나 뉴스발행사까지도 추가하여 좀 더 데이터를 보강할 수 있을것으로 보입니다.

구현한 결과는 엑셀 파일을 통해 편하게 확인할 수 있습니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from openpyxl import Workbook

# Workbook 생성
wb = Workbook()

# 시트 활성화
ws = wb.active

ws.append(['번호', '뉴스 제목', '내용 요약', 'URL'])

# 날짜 입력
input_day = input("날짜를 입력하세요. : ")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

driver.get('https://land.naver.com/news/headline.naver?bss_ymd=' + input_day)

count = 1

# TopNews 2개 데이터 추출
for i in range(2):
    test = driver.find_elements(By.CLASS_NAME, 'news_list')[i].text
    test_list = test.split('\n')
    link = driver.find_elements(By.CLASS_NAME, 'news_list')[i].find_element(By.TAG_NAME, 'a').get_attribute('href')
    ws.append([count, test_list[0], test_list[1], link])
    count = count + 1

# head 기사 데이터 추출
headline_title_list = driver.find_element(By.CLASS_NAME, 'headline_list').find_elements(By.TAG_NAME, 'a')

# 타이틀과 링크 데이터 추출
for i in headline_title_list:
    if i.text != "":
        ws['A' + str(count+1)] = count
        ws['B' + str(count+1)] = i.text
        ws['D' + str(count+1)] = i.get_attribute('href')
        count = count + 1

headline_main_list = driver.find_element(By.CLASS_NAME, 'headline_list').find_elements(By.TAG_NAME, 'dd')

count = 3

# 요약 데이터 추출
for i in headline_main_list:
    test = i.text.split('...')
    ws['C' + str(count+1)] = test[0]
    count = count + 1

wb.save('/Users/user/Desktop/news.xlsx')

driver.close()

 

엑셀 파일로 편하게 내용을 확인할 수 있습니다.

 

728x90