본문 바로가기
One/시스템 트레이딩

리포트 크롤링 (1)

by DH Father 2024. 1. 13.

리포트 크롤링 (1)

증권 리포트(네이버)들을 크롤링하여

자동으로 내 텔레그램으로 전송하기 방법에 대해 작성한 내용이다.

 

매일 주식 리포트(종목, 산업, 경제 등) 수십개가 나오는데

매번 사이트를 들어가서 보는게 매우 번거롭다.

리포트를 제공해주는 텔레그램이 있지만

뭔가 내 입맛에 맞지 않아서 

네이버 증권에 올라오는 리포트 정보들을 크롤링해서

내 텔레그램으로 전송해 보려고 한다. 

 

 

리포트 크롤링

크롤링은 웹페이지에 있는 정보를 수집하는 프로세스이다.

쉽게 말해 웹페이지에서 내가 원하는거를 자동으로 수집하는 것을 말한다.

 

이것을 하려면 HTML, CSS, 크롤링 방법등을 알아야하지만

난 잘모른다.

인터넷 검색을 해보니 Chatgpt를 사용해서 금방 만들 수 있다고한다. 

 

 

네이버 증권 종목분석 리포트 사이트 크롤링

먼저, 내가 크롤링 하려는 사이트는 아래와 같다. 

나는 여기에서 종목명, 제목, 증권사, 첨부, 작성일에 해당하는 부분을 크롤링하려고한다. 

https://finance.naver.com/research/company_list.naver?&page=1

Chatgpt에게 링크 주소와 함께, 파이썬 기반의 코드를 작성해달라고 하면 파이썬 기반으로 설명해준다. 

좀 더 구체적으로 설명하기 위해서는 

해당 창에서 F12 버튼을 누르면 HTML 창이 나온다.

HTML 창의 코드 위에 마우스르 갔다데면, 파란색으로 표시되는데, 이것을 통해 내가 원하는 부분을 찾아가면된다.

그리고 그 해당 부분에 대해 ChatGPT에게 자세히 물어보면된다. 

 

크롤링을 위해서는 request, beautifulsoup 모듈이 필요해 아래의 명령어로 설치해 주었다. 

pip install requests beautifulsoup4

 

아래의 코드는 현재 시간을 계산하여 8시 45분에 실행되며, 

오늘날짜와 동일한 리포트가 있는 경우, 

[종목명] [제목] [증권사] [날짜] 를 출력하며, [제목]에 리포트에 해당하는 링크를 걸어주었다. 

import requests
from bs4 import BeautifulSoup

from datetime import datetime




if __name__ == '__main__':
    
    
    printed_titles = set()    
    while True:
        current_time = datetime.now()

        if current_time.hour == 8 and current_time.minute == 45:
            # 크롤링할 페이지의 URL
            urls = ["https://finance.naver.com/research/company_list.naver?&page=1", 
                    "https://finance.naver.com/research/company_list.naver?&page=2", 
                    "https://finance.naver.com/research/company_list.naver?&page=3"]


            for url in urls:
                # 페이지 요청
                response = requests.get(url)

                if response.status_code == 200:
                    # 페이지 내용을 파싱
                    soup = BeautifulSoup(response.text, 'html.parser')

                    # "box_type_m" 클래스를 가진 div 안의 table 선택
                    table = soup.find('div', class_='box_type_m').find('table')

                    # tbody가 없는 경우, table을 사용
                    if table:
                        rows = table.find_all('tr')
                    else:
                        rows = []

                    # 종목명, 제목, 증권사, 작성일 및 첨부 파일 다운로드
                    for row in rows:
                        columns = row.find_all('td')
                        if len(columns) >= 4:
                            company_name = columns[0].text.strip()
                            title = columns[1].text.strip()
                            securities_firm = columns[2].text.strip()
                            date = columns[4].text.strip()
                            
                            # 현재 날짜 가져오기
                            today_date = datetime.now().strftime("%y.%m.%d")
                            
                            # 오늘 날짜와 작성일 비교
                            if date == today_date and title not in printed_titles:
                                printed_titles.add(title)
                                
                                # 첨부 파일 다운로드 링크 추출
                                attachment_link = columns[3].find('a')
                                
                                if attachment_link:
                                    attachment_url = attachment_link.get('href')
                                    attachment_response = requests.get(attachment_url)
                                    print(f"{company_name} [{title}]({attachment_url}) {securities_firm} {date}")
                                    
                                    # # 첨부 파일 저장
                                    # with open(f"{company_name}.pdf", "wb") as attachment_file:
                                    #     attachment_file.write(attachment_response.content)

                                else:
                                    print(f"{company_name}, {title}, {securities_firm}, {date}, 첨부 파일 없음")
                            

                else:
                    print("페이지를 가져올 수 없습니다.")

 

 

'One > 시스템 트레이딩' 카테고리의 다른 글

리포트 크롤링 (2) - 텔레그램봇  (0) 2024.01.17