뉴스 매매할 때 조금이라도 빠르게 남들보다 뉴스를 받아보고 싶다는 생각으로 코드를 짠 적이 있었다.

    네이버 최신뉴스를 1초마다 확인해서 내가 원하는 키워드가 들어있으면 텔레그램 봇에게 메시지를 보내게 한 것이다.

    지금은 실시간 뉴스매매를 안하고 있어서 뉴스 채널 몇개를 쓸 뿐 직접적으로 크롤링 서버를 돌리진 않는다.

     

    하지만 혹시라도 필요로 하는 사람들이 있다면 사용하도록 코드를 공개하려고 한다.

    꼭 주식이 아니라 뉴스 크롤링이 필요한 사람이 있다면 변경해서 사용하면 될 것이다.

     

    텔레그램 메시지 받기

    텔레그램으로 메시지를 받기 위해서는 봇을 만들어야 한다.

    봇 파더를 이용해야 하는데 이 부분에 대해서는 내가 블로그에 따로 글을 적은 적이 없다.

    구글 1번 노출되는 블로그 글을 링크해두었으니 이대로 따라하면 될 것 같다.

     

    만약 텔레그램으로 메시지를 받는 걸 원치않는다면 이 부분은 안해도 된다.

    또 슬랙으로 받길 원한다면 아래 글을 참고해보길 바란다.

     

    슬랙 봇으로 알림 받기 파이썬 코드 클릭!

     

    네이버 뉴스 크롤링 코드

    굉장히 간단하게 짜져있다.

    유명한 크롤링 라이브러리인 뷰리풀숲을 이용했다.

    아침 8시부터 오후 4시까지만 뉴스를 보내도록 했다.

    그때만 주식 장이 열리므로 그렇게 해놨는데 원하는대로 변경하면 된다.

     

    import telegram
    import schedule
    import time
    import sys
    import io
    from bs4 import BeautifulSoup
    import requests
    from filterList import *
    import pytz
    import datetime
    
    recentSubject = ""
    token = "여러분의 텔레그램 토큰"
    bot = telegram.Bot(token=token)
    chat_id = 여러분이 받을 텔레그램 아이디
    
    
    def job():
        global recentSubject
    
        now = datetime.datetime.now(pytz.timezone('Asia/Seoul'))
        if now.hour >= 16 or now.hour <= 8:
            return
    
        sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')
        sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
    
        BASE_URL = "https://news.naver.com/main/list.naver?mode=LSD&mid=sec&listType=title&sid1=001"
    
        with requests.Session() as s:
            res = s.get(BASE_URL, headers={'User-Agent': 'Mozilla/5.0'})
            if res.status_code == requests.codes.ok:
                soup = BeautifulSoup(res.text, 'html.parser')
                article = soup.select_one(
                    '#main_content > div.list_body.newsflash_body > ul:nth-child(1) > li:nth-child(1) > a')
                articleText = article.text
                articleHref = article.attrs['href']
                for i in range(0, len(newsFilter)):
                    if (newsFilter[i] in articleText) and (articleText != recentSubject):
                        bot.sendMessage(chat_id=chat_id,
                                        text=articleText + articleHref)
                        recentSubject = articleText
    
    
    # 1초 마다 실행
    schedule.every(1).seconds.do(job)
    
    bot.sendMessage(chat_id=chat_id, text="감시 시작")
    
    # 파이썬 스케줄러
    while True:
        schedule.run_pending()
        time.sleep(1)

    주의사항은 headers 부분에 꼭 브라우저 정보를 넣어야 한다는 것이다.

    이 부분을 지우면 네이버가 봇으로 인식해 정보를 주지 않으니 절대 지우면 안된다.

     

    파이썬 bs4 네이버 뉴스 크롤링 오류 해결법 클릭!

     

     

    키워드리스트 만들기

    필자는 따로 키워드리스트 파일을 만들었다.

    filterList.py 라는 파일이고 위 코드를 보면 import 해주는 걸 알 수 있다.

     

    아래 내용은 같은 파일에 작성해도 상관없다.

    그냥 리스트만 편하게 관리하려고 그렇게 해둔 것이다.

    newsFilter = [
        "M&A",
        "경영권분쟁",
        "급등세",
        "매각",
        "특징주",
        "인수",
        "최대주주변경",
        "합병",
        "항암",
        "독점",
        "무증",
        "국책",
        "삼성",
        "임상",
        "치매",
        "면역",
        "FDA",
        "기술이전",
        "북한",
        "철도",
        "수소",
        "전기차",
        "코로나",
        "메타버스",
        "속보",
        "단독",
        "분할",
        "싸이월드",
        "NFT",
        "P2E",
        "오미크론",
        "관해",
        "최초",
        "완치",
        "탈모",
        "남북",
        "폐배터리",
        "추가상장",
        "mRNA",
        "디즈니",
        "토스",
        "야놀자",
        "마켓컬리",
        "리비안",
        "전고체",
        "그래핀",
        "오징어게임",
    ]

    예전에 이렇게 해놨는데 str으로 추가해야 한다.

    그래야 비교하는데 오류가 없다.

     

    요즘 같으면 우크라이나, 러시아, 식량, 밀, 원전 뭐 이런거 추가하면 될 것 같다.

     

    ※ 함께 보면 좋은 글

     

    셀레니움 네이버 로그인 캡챠 피하기 클릭!

    유튜브 재생목록 총 재생시간 구하는 코드 클릭!

    셀레니움 네이버 검색광고 API 활용 잔액확인 하는 법 클릭!

    셀레니움 최신버전 iframe 문법 클릭!

    크롬 굵은 폰트 번짐 해결하는 방법 클릭!

     

    파이썬 네이버 뉴스 크롤링 오류 해결법 클릭!

    파이썬 게시판 새 글 확인 코드 클릭!