파이썬과 주식/파이썬으로 주식하기

[파이썬 주식 분석] 2. 네이버 주식 크롤링으로 종목별 일별 시세 구하기

by seokii 2022. 3. 23.
728x90
반응형

이전 글

https://seokii.tistory.com/118

 

[파이썬 주식 분석] 1. 파이썬으로 주식 상장 목록 받아오기

주식 상장 기업 공식 홈페이지 https://kind.krx.co.kr/ 대한민국 대표 기업공시채널 KIND kind.krx.co.kr 주식 상장 기업들의 다양한 정보들을 제공하는 사이트입니다. 사이트를 통해 당일 공시, 시장조치,

seokii.tistory.com

증권 시장에 상장된 기업들의 목록을 확인하고 데이터프레임으로 만들어 보는 포스팅입니다.

 

사전 지식

requests

requests 라이브러리는 파이썬용 HTTP 라이브러리입니다.

HTTP, HTTPS 웹 사이트에 요청하기 위해 자주 사용하는 라이브러리이며,

크롤링(Crawling) 과정에서 requests 라이브러리를 사용해 웹의 소스 코드를 가져와 파싱하는 경우에 주로 사용하게 됩니다.

 

BeautifulSoup

뷰티풀 수프도 마찬가지로 HTML, XML 페이지로부터 데이터를 추출하는 파이썬 라이브러리입니다.

파이썬을 이용해 크롤링을 할 때 주로 사용합니다.

뷰티풀 수프가 설치되지 않았다면 명령 프롬프트 창에 다음과 같은 명령어를 입력해 설치할 수 있습니다.

pip install beautifulsoup4

 

네이버 주식 일별 시세

네이버 주식의 메인 화면입니다.

개별 종목을 클릭해 들어간 다음 위의 사진처럼 시세 버튼을 누르면,

시세 페이지에서 아래쪽에 위의 사진처럼 일별 시세 목록이 있는 것을 확인할 수 있습니다.

포스팅에서 해당 부분의 내용을 크롤링해 데이터프레임으로 만들어 보도록 하겠습니다.

해당 부분은 'https://finance.naver.com/item/sise_day.naver?code=종목코드번호' 의 주소를 통해

직접 확인할 수 있습니다.

종목코드 005930을 넣고 확인해보면, 삼성 전자의 일별 시세 페이지가 나옴을 확인할 수 있습니다.

여기서 Ctrl + U를 눌러 해당 페이지의 html코드를 확인할 수 있습니다.

이 html 코드를 불러와 일별 시세를 읽어 오는 것입니다.

 

실습(주피터 노트북)

In [1] : 

from bs4 import BeautifulSoup
import requests

위에서 언급한 라이브러리를 사용하기 위해 불러옵니다.

 

In [2] : 

code = '005930' # 삼성전자 코드
url = f'https://finance.naver.com/item/sise_day.naver?code={code}'
req = requests.get(url, headers={'User-agent': 'Mozilla/5.0'})
html = BeautifulSoup(req.text, "lxml")

위에서 설명한 코드번호, 네이버 일별 시세의 주소, request, BeautifulSoup를 사용해 원하는 정보가 있는 페이지를 크롤링합니다.

주의할 점은, 네이버 주식 페이지는 요청할 때 헤더를 반드시 요구하기 때문에

headers = {'User-agent' : Mozilla/5.0'}와 같이 헤더 정보를 반드시 기입해 페이지 요청을 해야합니다.

 

'삼성전자(005930)' 종목의 경우 시세의 맨 뒤 페이지가 647인 것을 확인할 수 있습니다.

페이지 별로 정보를 크롤링 해야하기 때문에, 맨 뒤 페이지를 알아내 반복을 하며 정보를 불러와야 합니다.

 

크롬에서 Ctrl + F를 눌러 맨뒤를 입력해 해당하는 부분의 태그를 살펴보면,

pgRR 클래스를 가진 <td> 태그의 <a> 태그에 해당 정보가 있음을 확인할 수 있습니다.

기본적인 html의 지식이 있지 않다면 간단한 태그 내용 정도만 구글링해 공부하시는 것을 추천드립니다.

 

In [3] : 

pgrr = html.find('td', class_='pgRR')
print(pgrr.a['href'])

뷰티풀수프의 .find() 함수를 통해 class가 pgRR인 td태그를 찾습니다.

그 후 pgrr의 <a>태그의 값을 출력해 결과를 확인할 수 있습니다.

 

In [4] : 

s = pgrr.a['href'].split('=')
print(s)

해당 값을 .split() 함수를 통해 '='을 기준으로 나누어 맨 뒤 페이지의 정보만 따로 나눌 수 있습니다.

 

In [5] : 

last_page = s[-1]
print(last_page)

정보가 담긴 리스트의 마지막 원소만 불러와 해당 정보를 잘 추출했음을 확인할 수 있습니다.

 

In [6] : 

code = '005930' # 삼성전자 코드
headers = {'User-agent': 'Mozilla/5.0'}
url = f'https://finance.naver.com/item/sise_day.naver?code={code}'
df = None

for page in range(1, int(last_page)+1):
    req = requests.get(f'{url}&page={page}', headers=headers)
    df = pd.concat([df, pd.read_html(req.text, encoding = 'euc-kr')[0]], ignore_index=True)

마지막 페이지를 구했으며, 페이지 별로 일별 시세 정보를 크롤링하는 코드를 깔끔하게 정리했습니다.

데이터프레임을 사용하기 위해 import pandas as pd도 따로 입력해주는 것을 잊지 맙시다.

 

In [7] : 

# 데이터가 없는 행 일괄 삭제
df.dropna(inplace = True)
# 인덱스 재배열
df.reset_index(drop=True, inplace=True)

데이터를 df 변수의 데이터프레임으로 저장하고 데이터가 없는 행을 일괄 삭제하며

삭제 후 인덱스를 재정렬하는 코드입니다.

 

In [8] : 

df

2022년 3월 22일 기준으로

1996년 9월 25일의 시세부터 2022년 3월 22일까지 삼성전자의

종가, 전일비 등락 수치, 시가, 고가, 저가, 거래량의 정보를 불러왔음을 확인할 수 있습니다.

 

In [9] : 

df.to_excel("samsung_price.xlsx")

판다스의 .to_excel() 함수를 사용해 엑셀 파일로 저장할 수 있습니다.

그 밖에도, .to_csv()을 통해 csv파일로 저장하기, pickle 라이브러리를 통해 pkl 파일로 저장하기,

데이터베이스를 구축해 DB안에 저장 등등 여러가지 방법이 있습니다.

 

추가) 저장할 때, 매개변수에 index=False를 넣어주어야 위의 사진처럼 A열에 숫자가 저장되지 않습니다!

df.to_excel("samsung_price.xlsx", index=False)

 

 

728x90
반응형

댓글