이번 포스팅에서는 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 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.
2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄
다음 이야기
2019/12/16 - [파이썬/주식] - Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 2
'파이썬 > 주식' 카테고리의 다른 글
Python으로 모멘텀/가치 평가 주식 선정 , 종목 선정하기, Momentum Value Strategy by Python (13) | 2019.12.22 |
---|---|
Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 2 (25) | 2019.12.16 |
Python, Backtrader로 전략검증, RSI 이용한 매매 전략 백테스팅(BackTesting) (2) | 2019.12.08 |
Python으로 ETF목록 추출하기 / Naver ETF 목록 가져오기 (0) | 2019.12.08 |
Python으로 모멘텀 전략 구현, Python Momentum Strategy (2) | 2019.12.01 |
댓글