본문 바로가기
파이썬/주식

Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 1

by 행복론자 2019. 12. 15.

이번 포스팅에서는 Python으로 Naver Finance 국내 증시 기초 Data를 수집해보겠습니다.

코드나 내용은 이전에 포스팅 했던 유사한 부분이 많습니다.

 

오늘 크롤링해볼 페이지는,

이렇게 생긴 페이지입니다. URL은 https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1 입니다.

sise = 시세, sosok = 소속(코스피/코스닥)인 것 같군요.

 

이 페이지는 코스피/코스닥에 상장된 기업들의 주가 관련 정보들을 가지고 있습니다.

다만 한가지 불편한 것이 있다면 상단에 이런 탭에서 6개의 정보만 선택해서 볼 수 있습니다. 

 

 

기업을 눌러 보면 위의 모든 항목을 제공해주는 Naver이지만 크롤링해볼 페이지는 그렇게 한꺼번에 모아볼 수는 없고 필요한 항목 6개만 확인할 수가 있습니다.

 

크롤링에 필요한 Tag를 확인해보겠습니다. 이를 위해서 Chrome에서 F12를 눌러 개발자 탭을 켜도 되고

마우스 우클릭 > 검사(N)을 눌러 Tag를 확인하실 수 있습니다. 

 

 

크롤링할 부분만 떼어놓고 보겠습니다.

 

 

테이블 안에 있는 수치가  무엇을 의미하는지 나타내는 항목명들 (EX, 종목명, 현재가, 전일비, 등락률..)은 THEAD TAG밑에 TH TAG입니다.

종목마다 가지고 있는 번호는 시가총액을 기준으로 정렬한 순서로 TD TAG에서 CLASSNAME이 NO인 TAG들입니다.

 

이외 정보들은 모두 TD TAG에 담겨져 있지만 종목의 이름은 TD밑 A TAG,

다른 수치들은 CLASSNAME이 NUMBER인 TD TAG입니다.

따라서 TD TAG에서는 종목명/수치로 나눠서 크롤링했습니다. 

 

 

전체 코드입니다.

import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd

BASE_URL='https://finance.naver.com/sise/sise_market_sum.nhn?sosok='

KOSPI_CODE = 0
KOSDAK_CODE = 1
START_PAGE = 1

def main(code):
    # total_page을 가져오기 위한 requests
    res = requests.get(BASE_URL + str(code) + "&page=" + str(START_PAGE))
    page_soup = BeautifulSoup(res.text, 'lxml')

    # total_page 가져오기
    total_page_num = page_soup.select_one('td.pgRR > a')
    total_page_num = int(total_page_num.get('href').split('=')[-1])

    # page마다 정보를 긁어오게끔 하여 result에 저장
    result = [crawl(code,str(page)) for page in range(1,total_page_num+1)]

    # page마다 가져온 정보를 df에 하나로 합침
    df = pd.concat(result, axis=0,ignore_index=True)

    # 엑셀로 내보내기
    df.to_excel('NaverFinance.xlsx')

def crawl(code, page):
    res = requests.get(BASE_URL + str(code) + "&page=" + str(page))
    page_soup = BeautifulSoup(res.text, 'lxml')
    # 크롤링할 table html 가져오기
    table_html = page_soup.select_one('div.box_type_l')

    # Column명
    header_data = [item.get_text().strip() for item in table_html.select('thead th')][1:-1]

    # 종목명 + 수치 추출 (a.title = 종목명, td.number = 기타 수치)
    inner_data = [item.get_text().strip() for item in table_html.find_all(lambda x:
                                                                           (x.name == 'a' and
                                                                            'tltle' in x.get('class', [])) or
                                                                           (x.name == 'td' and
                                                                            'number' in x.get('class', []))
                                                                           )]

    # page마다 있는 종목의 순번 가져오기
    no_data = [item.get_text().strip() for item in table_html.select('td.no')]
    number_data = np.array(inner_data)

    # 가로 x 세로 크기에 맞게 행렬화
    number_data.resize(len(no_data), len(header_data))

    # 한 페이지에서 얻은 정보를 모아 DataFrame로 만들어 리턴 
    df = pd.DataFrame(data=number_data, columns=header_data)
    return df

main(KOSPI_CODE)

 

 

코드를 실행하면 BASE URL로 지정된 페이지의 총 32개 하위 페이지를 찾아 코스피에 상장된 1554개의 기업 및 ETF 정보가 'NaverFinance.xlsx'이란 이름으로 생성됩니다.

 

 

하지만 아래 여러 정보가 있음에도 기초 정보 (종목명, 현재가, 전일비, 등락률, 액면가)를 제외하고

최대 6개 밖에 추가로 가지고 오지 못하는 점이 아쉽습니다. 

 

 

다음 포스팅에서는 이 제한(?)을  깨고 전부 다 가져와보는 법을 다뤄보겠습니다. 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

 

 

다음 이야기

2019/12/16 - [파이썬/주식] - Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 2

 

Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 2

Python,BS4 Naver Finance 국내 증시 기초 Data 수집 2탄입니다. 1탄에서는 타겟 html를 가져와 필요한 정보를 파싱해 엑셀 형태로 만드는 것을 해보았습니다. 하지만 이 많은 정보들을 한꺼번에 가져오려

jsp-dev.tistory.com

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글