본문 바로가기
코딩 연습

네이버 주식 데이터 추출(크롤링), 판다스 그래프 그리기

by good4me 2024. 3. 30.

goodthings4me.tistory.com

주식 데이터 추출 판다스 그래프

 

판다스를 배우는 단계에서 시계열 데이터인 네이버 주식 현황을 크롤링한 코드로 matplotlib와 seaborn으로 그래프를 그리는 코드 연습을 해봤다.

네이버 주식 데이터 크롤링(파이썬)

네이버 주식에 대한 크롤링은 파이썬으로 간단하게 작성이 가능함. 삼성전자 코드로 예시 데이터를 추출했고, 다른 기업으로 변경할 때는 해당 기업의 코드만 변경하면 됨 

import requests
import time
import pandas as pd


total_data = []
stock_code = '005930'  # 삼성전자
for page in range(1, 11):
    print(f'Page - #{page}')
    url = f'https://m.stock.naver.com/api/stock/{stock_code}/price?pageSize=20&page={page}'
    response = requests.get(url)
    time.sleep(1)

    if response.status_code == 200:
        datas = response.json()
        # print(datas)

        if not datas:
            break
        for data in datas:
            try:
                date = data['localTradedAt']
                price = data['closePrice']
                total_data.append( [date, price] )
            except:
                pass
    else:
        print(f'Error code : {response.status_code}')
        break

print(total_data)

 

위 코드로 추출할 때 for 문 내의 print() 결과이며, print(datas) 주석을 풀면 아래 이미지와 같이 출력됨

네이버 주식 추출 결과

 

total_data의 추출 결과 리스트로 일자(localTradedAt)와 종가(closePrice)를 리스트로 추출함

네이버 주식 추출 결과 리스트

 

 

 

Pandas로 추출하고, matplotlib, seaborn으로 그래프 그리기

 

 

위 코드에서 일부를 jupyter notebook에서 작성하고 실행하면 네이버 주식의 각 페이지의 데이터가 동일하게 추출되고,

dfs 리스트 변수에 판다스 데이터프레임으로 하나씩 저장됨

import requests
import time
import pandas as pd

dfs = []
stock_code = '005930'  # 삼성전자
for page in range(1, 11):
    print(f'Page - #{page}')
    url = f'https://m.stock.naver.com/api/stock/{stock_code}/price?pageSize=20&page={page}'
    response = requests.get(url)
    time.sleep(1)
    df = pd.DataFrame(response.json())
    print(df)
    dfs.append(df)

 

주피터 노트북 실행 결과
주피터 노트북 실행 결과

 

 

▶ 판다스 데이터프레임 리스트를 concat()을 통해 하나로 합치기

추출한 판다스 데이터프레임
추출한 판다스 데이터프레임

 

 

pandas info() 결과

pandas info()

 

 

IT, 전자제품 선물

 

 

날짜 데이터 타입을 datetime으로 변환

data['localTradedAt'] = pd.to_datetime(data['localTradedAt'])  # 날짜 타입 변환
data['closePrice'] = data['closePrice'].str.replace(',', '').astype(int)
n_data = data[['localTradedAt', 'closePrice']].set_index('localTradedAt')
  • to_datetime() 함수로 날짜 컬럼을 datetime으로 변경
  • closePrice 컬럼의 콤마를 제거(str.replace())하고 int 타입으로 변환
  • 데이터프레임에서 날짜와 종가 컬럼만 추출

 

그래프 그리기

import matplotlib.pyplot as plt
import seaborn as sns

sns.lineplot(data=n_data, x='localTradedAt', y='closePrice')

 

seaborn lineplot() 사용
seaborn lineplot() 사용

 

 

주 단위로 그래프를 다시 그리기

# 주 단위로
w_data = n_data.resample('W-SUN').mean()  # 주간 주기(Weekly frequency) 데이터화, 각 주의 시작은 일요일
sns.lineplot(data=w_data, x='localTradedAt', y='closePrice')
plt.xticks(rotation=45)  # x축의 label을 45도로 회전시킴 

주 단위로 그래프 그리기

댓글