본문 바로가기

DB엔지니어가 공부하는 python

네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)

네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)

 

네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)

 

 

안녕하세요.

요즘 다들 주식들 많이 하시나요?

 

저도 주식을 조금씩 공부 하고 있습니다.

 

주식에 대해서 잘 모르시는 분들이라도, 개미, 기관, 뭐 이런 말들을 많이 들어보셨을것 같아요.

개미는 이젠 개인 투자자를 말하고, 그 외에는 외국인, 기관등이 있겠죠.

 

개미투자자와 기관 및 외국인 투자자들의 투자성향, 매매동향을 살펴보기 위하여 이번 파이썬 포스팅을 기획 해보았습니다. 이번 포스트는 https://www.youtube.com/watch?v=xS81bSSDNHQ 이분의 유튜브를 보고 따라서 작성 해보았습니다. 더 자세한 설명은 위 링크에서 확인 할 수 있습니다.

 

파이썬 공부도 하고, 어떻게 하면 투자자별 매매동향을 쉽게 가지고 올 수 있을지, 그리고 이 데이터를 이용해서 어떤 정보를 얻을수 있을지도 앞으로 고민 해보도록 하겠습니다.

 

대상 사이트 확인

네이버 주식에서 투자자별 일일 매매동향은 아래 사이트의 정보를 가지고 올것 입니다.

https://finance.naver.com/sise/sise_trans_style.nhn

위 사이트에서, 아래쪽에 있는 정보, 바로 이 정보를 크롤링 해와야 합니다.

 

대상 사이트 확인1

 

빨간 박스내 일일 순매수 지표를 개인, 외국인, 기관별로 가지고 올 것 입니다.

 

 

 

파이썬 필요 라이브러리 import

자, 그럼 가지고 올 정보를 확인 하였으니, 코딩을 시작 합니다.

우선 필요 라이브러리를 import 해야 하겠죠.

import requests
from io import BytesIO
import pandas as pd
import seaborn as sns
from tqdm import tqdm

requests는 url을 보내서 결과를 가지고 오기 위하여 import 합니다.

BytesIO는  binary 파일처리 처리하기 위해 사용 됩니다.

pandas는 너무 잘 아실테구요, 표형태로 데이터 처리를 위해 사용 합니다.

seaborn은 나중에 데이터를 이용해서 그래프를 그리기 위해 사용 됩니다.

tqdm은 저도 이 영상에서 처음 본 라이브러리 인데, 프로그레스바 형태로 반복문의 진행정도를 볼 수 있습니다.

 

다음 으로 넘어 가겠습니다.

 

헤더를 만들어서 df에 저장하기

위 데이터는 여러 페이지에 나뉘어 있어, 그 페이지 수 만큼 호출을 해야 합니다.

그래서 우선 헤더를 저장을 하고, 헤더를 제외한 빈값만 한페이지씩 읽어와서 헤더가 저장 되어 있는 df에 concat 할 예정 입니다.

# 네이버 금융 일자별 순매수 url 저장
page = 1
url = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=20200922&sosok=&page={0}".format(page)
resp = requests.get(url)
html = BytesIO(resp.content)
df = pd.read_html(html)[0]

# 컬럼정보만 저장 하기
cols = df.columns
df = pd.DataFrame(columns = cols)

print(df)

우선 호출할 url에서 page 부분만 변수처리를 하고 page변수는 1로 지정하여 첫번째 페이지만 읽어오도록 합니다.

그리고 그걸 df라는 Dataframe에 저장 하고 그 column정보만 읽어와서 다시 df에 저장을 하는 코드 입니다.

 

마지막에 print(df)를 통해서 출력한 결과는 아래 그림처럼 column만 저장 되어 출력 되는걸 확인 할 수 있습니다.

 

헤더를 만들어서 df에 저장하기1

 

위 결과와 아래 웹페이지의 헤더를 비교 해 봅니다.

 

헤더를 만들어서 df에 저장하기2

 

같은걸 확인 할 수 있습니다.

 

반복문의 사용하여 전체 데이터를 호출하여 df에 concat 하기

이젠, 헤더가 저장된 df가 있으니, 아래 코드를 이용하여, 페이지 별로 불러와서 df에 concat 하는 작업을 반복문을 통해 처리 해 보겠습니다.

더불어 NaN 데이터와 지저분한 인덱스를 reset 하는 과정도 추가 합니다.

# 반복문을 통해서 전체 데이터 불러와서 df와 합치기
for page in tqdm(range(1, 200)): # tqdm은 반복문의 progress bar를 보기 위한 라이브러리
    url = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=20200922&sosok=&page={0}".format(page)
    resp = requests.get(url)
    html = BytesIO(resp.content)
    df_single = pd.read_html(html)[0]
    df = pd.concat([df, df_single])
    
df = df.dropna() # NaN으로 저장된 데이터들 삭제
df = df.reset_index(drop=True) # 일정하지 않은 인덱스 번호를 재 정의

현재 해당 페이지의 제일 끝페이지는 390page 이나, 편의상 200 페이지 까지만 크롤링하여 저장 하는 것으로 하겠습니다.

 

 

 

이미 있는 df라는 데이터셋에 for문 안에서 df_single 이라는 데이터셋을 선언 하여 각 페이지별로 데이터를 저장하고, df_single을 df와 합치는 과정을 200번 반복 합니다.

 

여기에서 첫번째 for문 문장 끝에 보면 tqdm이라는 라이브러리가 사용 되는데, 이는 for문이 실행 될때 프로그레스바 형태로 진행정도를 표현해주는 라이브러리 입니다.

 

그리고 아래쪽에 df.dropna() 은 코드내 주석으로도 설명 되어 있지만, NaN으로 저장 된 데이터들을 삭제 해주는 기능을 합니다. 

 

df.reset_index(drop=True) 는 아래 그림처럼 반복되는 페이지 크롤링으로 지저분한 인덱스를 reset 해주는 역할을 합니다.

 

반복문의 사용하여 전체 데이터를 호출하여 df에 concat 하기1

 

위와 같은 모양을 아래 처럼 인덱스 reset을 해줍니다.

 

반복문의 사용하여 전체 데이터를 호출하여 df에 concat 하기2

 

이렇게 우선 데이터를 크롤링 하는 과정은 완료 하였습니다.

위의 코드들을 합쳐서 아래와 같이 실행하면 결과가 아래 결과 그림처럼 나오는것을 확인 할 수 있습니다.

import requests
from io import BytesIO
import pandas as pd
import seaborn as sns
from tqdm import tqdm

# 네이버 금융 일자별 순매수 정보 자동저장 프로그램

# 네이버 금융 일자별 순매수 url 저장
page = 1
url = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=20200922&sosok=&page={0}".format(page)
resp = requests.get(url)
html = BytesIO(resp.content)
df = pd.read_html(html)[0]

# 컬럼정보만 저장 하기
cols = df.columns
df = pd.DataFrame(columns = cols)


# 반복문을 통해서 전체 데이터 불러와서 df와 합치기
for page in tqdm(range(1, 200)): # tqdm은 반복문의 progress bar를 보기 위한 라이브러리
    url = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=20200922&sosok=&page={0}".format(page)
    resp = requests.get(url)
    html = BytesIO(resp.content)
    df_single = pd.read_html(html)[0]
    df = pd.concat([df, df_single])
    
df = df.dropna() # NaN으로 저장된 데이터들 삭제
df = df.reset_index(drop=True) # 일정하지 않은 인덱스 번호를 재 정의

print(df)

<<결과 그림>>

 

반복문의 사용하여 전체 데이터를 호출하여 df에 concat 하기3

 

이렇게 데이터는 모두 모았습니다.

 

다음편에서 이 데이터를 활요하는 방법은 소개 하겠습니다.

감사합니다.

 

 

## 다음편 보러가기 ##

2020/11/25 - [DB엔지니어가 공부하는 python] - 네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2)

 

네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2)

네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2) 안녕하세요. 지난번 네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)편에 이어서 가지고온 데이터를 이용해서 데

stricky.tistory.com

 

 

 

by.sTricky