[01] requests_naver_stock

고근호·2023년 9월 5일

Crwaling Naver Stock Datas

  • 네이버 증권 사이트에서 주가 데이터 수집
  • 수집할 데이터 : 일별 kospi, kosdaq 주가, 일별 환율(exchange rate) 데이터
  • 데이터 수집 절차
    • 웹서비스 분석 : url
    • 서버에 데이터 요청 : request(url) > response : json(str)
    • 서버에서 받은 데이터 파싱(데이터 형태를 변경) : json(str) > list, dict > DataFrame
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import requests

1. 웹서비스 분석 : url

  • pc 웹페이지가 복잡하면 mobile 웹페이지에서 수집
page, pagesize = 1, 20
url = f'https://m.stock.naver.com/api/index/KOSPI/price?
pageSize={pagesize}&page={page}'
print(url)
# https://m.stock.naver.com/api/index/KOSPI/price?pageSize=20&page=1

2. 서버에 데이터 요청 : request(url) > response : json(str)

  • response의 status code가 200이 나오는지 확인
  • 403이나 500이 나오면 request가 잘못되거나 web server에서 수집이 안되도록 설정이 된것임
    • header 설정 또는 selenium 사용
  • 200이 나오더라도 response 안에 있는 내용을 확인 > 확인하는 방법 : response.text
response = requests.get(url)
response, response.text[:200]
# <Response [200]>

3. 서버에서 받은 데이터 파싱(데이터 형태를 변경)

: json(str) > list, dict > DataFrame

type(response.text), type(response.json())
# (str, list)
data = response.json()
kospi = pd.DataFrame(data)[['localTradedAt', 'closePrice']]
kospi.tail(2)

4. 함수로 만들기

def stock_crawling(code='KOSPI', page=1, pagesize=60):
    # 1. 웹페이지분석 : 크롬 개발자도구 : URL
    url = f'https://m.stock.naver.com/api/index/
    {code}/KOSPI/price?pageSize={pagesize}&page={page}'

    # 2. request(URL) > response(DATA) : DATA(json(str))
    response = requests.get(url)
    
    # 3. DATA(json(str)) > list, dict > DataFrame
    return pd.DataFrame(response.json())
    [['localTradeAt', 'closePrice']]
kospi = stock_crawling()
kosdaq = stock_crawling('KOSDAQ')
kosdaq.tail(2)

5. 원달러 환율 데이터 수집 : 실습

# 1. 웹페이지분석 : 크롬 개발자도구 : URL
page, pagesize = 1, 60
url = f'https://m.stock.naver.com/front-api/v1/marketIndex/prices?\
    page={page}&category=exchange&reutersCode=
    FX_USDKRW&pageSize={pagesize}'

# 2. request(URL) > response(DATA) : DATA(json(str))
response = requests.get(url)

# 3. DATA(json(str)) > list, dict > DataFrame
usd = pd.DataFrame(response.json()['result'])
[['localTradeAt', 'closePrice']]
usd.tail(2)

6. 시각화

데이터분석

계획수립(문제정의) > 데이터수집(web_crawling) > 데이터전처리(pandas)

> 데이터분석(pandas, sklearn) > 레포팅, 피드백(matplotlib)

len(kospi), len(kosdaq), len(usd)
# (60, 60, 60)
# 데이터전처리 1: 컬럼 : 날짜, 코스피, 코스닥, 환율
df = kospi.copy()   # 얕은복사, 깊은복사
df.columns = ['data', 'kospi']
df['kosdaq'] = kosdaq['closePrice']
df['usd'] = usd['closePrice']
df.tail(2)
help(df['kospi'].apply)
df['kospi'][:5]
# 데이터전처리 2 : 데이터타입변경
df['kospi'] = df['kospi'].apply(lambda data:
data.replace(',', '')).astype('float')
df['kosdaq'] = df['kosdaq'].apply(lambda data:
data.replace(',', '')).astype('float')
df['usd'] = df['usd'].apply(lambda data:
data.replace(',', '')).astype('float')
df.dtypes
%config InlineBackend.figure_formats = {'png', 'retina'}
import matplotlib.pyplot as plt
plt.figure(figsize=(20, 5))
plt.plot(df['date'], df['kospi'], label='kospi')
plt.plot(df['date'], df['kosdaq'], label='kosdaq')
plt.plot(df['date'], df['usd'], label='usd')
plt.xticks(df['date'].values[::5])
plt.legend()
plt.show()

7. 데이터 스케일링

  • min max scaling

  • z=ximin(x)max(x)min(x)(0z1)z = \frac{x_i - min(x)}{max(x) - min(x)} (0 \leqq z \leqq 1)

  • latex syntax : https://jjycjnmath.tistory.com/117

from sklearn.preprocessing import minmax_scale
minmax_scale(df['kospi'])
plt.figure(figsize=(20, 5))
plt.plot(df['date'], df['kospi'], label='kospi')
plt.plot(df['date'], df['kosdaq'], label='kosdaq')
plt.plot(df['date'], df['usd'], label='usd')
plt.xticks(df['date'].values[::5])
plt.legend()
plt.show()

8. 상관관계 분석

  • 피어슨 상관계수(Pearson Correlation Coefficient)
  • 두 데이터 집합의 상관도를 분석할때 사용되는 지표
  • 상관계수의 해석
    • -1에 가까울수록 서로 반대방향으로 움직임
    • 1에 가까울수록 서로 같은방향으로 움직임
    • 0에 가까울수록 두 데이터는 관계가 없음
# 문제정의 : 원달러환율과 코스피주가는 반대방향으로 움직인다.
# > 원달러환율이 낮으면 > 환전(원>달러) : 원달러환율이 높으면 >
환전(달러>원) > 코스피 구매

# 이 방식이 좋은 투자 방식입니다. -> 책임은 본인의 몫..
df.corr()

finance data reader package

  • yahoo finance api를 사용한 주가 데이터 수집을 위한 package
  • https://financedata.github.io/posts/finance-data-reader-users-guide.html
#!pip install -U finace-datareader   # 설치
import FinanceDataReader as fdr
usd = fdr.DataReader('USD/KRW', '2020')
kospi = fdr.DataReader('KS11', '2020')
kospi.tail(2)
usd.tail(2)

웹크롤링

  • 서버 클라이언트 구조 : URL 구조 : request(url) > response(data(json)) : data(json) > DataFrame
  • response 데이터 수집시 : json(동적), html(정적)

웹크롤링 프로세스

1. 개발자도구 : 웹페이지분석 : url
2. request(url) > response(data) : data(json)
3. data(json) > list, dict > DataFrame

profile
rootgo 매일, 꾸준히 성장하는 사람🌱

0개의 댓글