파이썬 프로그래밍

파이썬 셀레니움 네이버 뉴스기사 제목 크롤링

코니코니 2022. 10. 1. 09:00
반응형

파이썬 셀레니움 네이버 뉴스기사 제목 크롤링


비트코인 자동매매를 개발하다가 코인에 관심이 생겼었던 시절에 코인에 관련된 뉴스도 꾸준하게 보면서 시장의 흐름과 변동성을 미리 파악하는 것도 중요하다는 얘기를 들었습니다. 확실히 큰 이슈가 생기면 시세에 많은 변화가 생기곤 하더군요. 그래서 코인에 관련된 신규 기사가 뜰 때마다 알림이 오도록 코딩을 한 적이 있었는데요. 파이썬 셀레니움을 활용하면 아주 간단한 코드 몇 줄로 신규 뉴스기사를 받아볼 수 있습니다.

import selenium
from selenium.webdriver.common.by import By
import time
import chromedriver_autoinstaller
import os
 
 
os.system('taskkill /f /im chromedriver.exe')
os.system('cls')
 
 
class BitNews:
 
    def __init__(self):
        self.path = chromedriver_autoinstaller.install(True)
        self.options = selenium.webdriver.ChromeOptions()
        self.driver = None
        self.news_name = []
 
    def WhileStart(self):
 
        self.options.add_argument('--headless')
        self.options.add_argument(
            'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
            'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36')
        self.driver = selenium.webdriver.Chrome(self.path, options=self.options)
        self.driver.implicitly_wait(3)
 
        while True:
            self.driver.get(f'https://search.naver.com/search.naver?where=news&query={"비트코인"}'
                            f'&sm=tab_srt&sort=1&photo=0&field=0&reporter_article=&pd=0&ds=&de=&'
                            f'docid=&nso=so%3Add%2Cp%3Aall%2Ca%3Aall&mynews=0&refresh_start=0&related=0')
 
            news_tit = self.driver.find_elements_by_class_name('news_tit')
 
            for i_1 in news_tit:
 
                if not self.news_name.count(i_1.text):
                    self.news_name.append(i_1.text)
                    print(i_1.text, i_1.get_attribute('href'))
            time.sleep(600)
 
 
if __name__ == "__main__":
    main = BitNews()
    main.WhileStart()

전체 코드는 총 40줄 정도로 아주 짧습니다. 사실 클래스가 필요한 상황은 아니지만 그 당시에 습관적으로 클래스를 사용했었나 봅니다.

os.system('taskkill /f /im chromedriver.exe')
os.system('cls')

클래스 밖의 이 os 모듈의 기능은 프로그램 작동 시 기존에 켜져있던 크롬드라이버를 전체 종료시키는 용도인데 특히 크롬드라이버을 사용하는 경우 프로그램을 구동하다 강제로 종료를 한다거나 콘솔창을 꺼버리는 경우 백그라운드에 그대로 켜져 있는 상태에서 메모리만 잡아먹는 현상이 있어서 이러한 코드를 넣어줬습니다.

self.path = chromedriver_autoinstaller.install(True)

__init__ 생성자 안에 이 코드는 크롬드라이버를 따로 설치하지 않더라도 알아서 버전을 체크한 후 자동으로 다운로드까지 해주는 유용한 모듈입니다. 내장된 기능이 아니기 때문에 따로 설치를 해줘야 합니다! cmd 창에서 pip install chromedriver_autoinstaller을 작성하여 설치를 해줍니다.

self.options.add_argument('--headless')
self.options.add_argument(
    'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36')
self.driver = selenium.webdriver.Chrome(self.path, options=self.options)
self.driver.implicitly_wait(3)

def WhileStart() 클래스 내 함수에 보면 두가지 드라이버 옵션이 들어갑니다. --headless의 경우 백그라운드에서 크롬드라이버를 실행시킵니다. 웹 창이 보이지 않는 것이죠. 두번째는 user-agent를 넣어주는 것인데 크롤링을 할 때 user-agent가 없다면 대부분 차단을 당하게 됩니다. 간단한 뉴스기사를 가져오는 것이기 때문에 이 두가지만으로도 충분하겠죠.

while True:
    self.driver.get(f'https://search.naver.com/search.naver?where=news&query={"비트코인"}'
                    f'&sm=tab_srt&sort=1&photo=0&field=0&reporter_article=&pd=0&ds=&de=&'
                    f'docid=&nso=so%3Add%2Cp%3Aall%2Ca%3Aall&mynews=0&refresh_start=0&related=0')

    news_tit = self.driver.find_elements_by_class_name('news_tit')

    for i_1 in news_tit:

        if not self.news_name.count(i_1.text):
            self.news_name.append(i_1.text)
            print(i_1.text, i_1.get_attribute('href'))
    time.sleep(600)

사실 현재 상황에서 웹 창이 열려 있어야 하는 것이 정상이지만 --headless 기능으로 보이지만 않을 뿐입니다. driver.get을 활용하여 네이버 뉴스기사 최신글 순으로 열어줍니다 키워드는 비트코인으로 입력을 해뒀죠.

이제 news_tit라는 변수에 최신글 첫페이지에 있는 모든 기사를 가져오게 됩니다. 그 다음 for 문을 활용하여 하나씩 대입을 해주면 되는 것인데요. self.news_name 이라는 리스트에 뉴스기사 제목들을 넣어주는 이유는 지속적으로 최신 뉴스기사를 가져올 때 기존에 가져왔던 기사는 걸러내기 위한 용도로 사용이 됩니다.

if문을 사용하여 만약 self.news_name 데이터에 없는 기사 제목이라면 제목과 링크를 출력 시키면서 리스트에 해당 기사 제목을 추가하게 되는 것이죠.

그렇게 최신글 페이지를 한번 크롤링 한 이후 time.sleep에 해당 되는 초만큼 대기를 한 후 다시 최신글 페이지에 들어가 기존에는 없던 새로운 기사를 가져오는 것을 반복되게 작업하는 코드입니다.

[비트코인 지금] 단기 조정 돌입…7500만원대에서 횡보 https://view.asiae.co.kr/article/2021102515272429739
[코인뉴스] 일론 머스크 “비트·이더·도지 YES! 시바는 NO!” https://www.dailian.co.kr/news/view/1045595/?sc=Naver
[오전 주요 국제금융뉴스] (25일) http://news.einfomax.co.kr/news/articleView.html?idxno=4173288
"초 단위에도 돈이 오가는데" KT 통신장애에 주식투자자 '부글' https://www.news1.kr/articles/?4471539
사상 최고가 경신한 비트코인, 지지선 높아져 http://www.sportsseoul.com/news/read/1070148?ref=naver
[분석] 비트코인, 강한 조정에도 '낙관론' 팽배 왜? http://www.inews24.com/view/1415080
비트코인, 고점에서 11% 하락…조정 깊어질까 '한숨' http://www.newsis.com/view/?id=NISX20211025_0001625944&cID=10401&pID=10400
빗썸, 업비트와 격차 좁혔나...차별화 포인트는 '큰손 유치' https://www.ekn.kr/web/view.php?key=20211025010004022
비트코인·도지코인 시세 http://www.kjdaily.com/article.php?aid=1635137675558749227
[가상화폐 시세] 비트코인 7500만원선…이더리움 500만원선, 도지코인 330원선... http://www.econonews.co.kr/news/articleView.html?idxno=222078

프로그램은 지속적으로 구동이 되면서 신규로 기사가 올라올 때 기사 제목과 링크를 출력하게 됩니다. 단순히 콘솔에서 출력을 하는 방식으로 코딩을 했지만 이러한 기사를 개인 sns 채널이나 채팅 프로그램 등과 연동을 시켜서 직접적으로 받아볼 수도 있겠죠.

반응형