AIVLE

Web Crwaling ② - 네이버 주가 데이터 수집

민주82 2023. 2. 17. 23:38

 

 

1. 웹서비스 분석 : url

 

Crwaling Naver Stock Datas

네이버 증권 사이트에서 주가 데이터 수집

→ pc 웹페이지가 복잡하면 mobile 웹페이지에서 수집한다

네이버 증권(모바일)과 개발자도구

크롬 →  naver.com → 오른쪽 상단 점 세개 클릭 → 도구 더보기 → 개발자 도구 

 

개발자 도구

표시된 부분 클릭하면 모바일 화면으로 바뀐다

 

이게 안된다면

https://m.stock.naver.com

 

코스피 - 네이버 증권

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

m.stock.naver.com

 

네이버 증권(모바일) 화면에서

개발자도구 - Network - Headers 확인하면

Requests URL도 알 수 있다 !

 

 

 

 

 

 

 

빨간 블럭 클릭 !

 

 

 

 

 

이 화면이 나왔다면 다음으로 넘어가시오...

 

 

 

 

 

밑으로 쭉 내라면 일별 시세를 확인할 수 있다

가져올 데이터가 바로 이거다 :)

 

 

위에서 설명했듯이 더보기를 눌러도 URL이 바뀌지 않아서 동적페이지다.

→ JSON

 

 

 

일별시세 데이터에서 개발자도구 on

 

 

 

이제 여기서 Requests URL을 가져올 것이다

 Requests URL

https://m.stock.naver.com/api/index/KOSPI/price?pageSize=10&page=2 

 

Headers 외에 Payload, Preview도 확인해보자 

Payload에서 pageSize와 page를 알 수 있다

 

 

Preview는 데이터가 어떤 것을 담고있는지 확인 가능 !

 

자세히 열어보면 이런 모습

localTradeAt, closePrice.........openPrice 등 등 

 

 

import warnings
warnings.filterwarnings('ignore') #경고 문구 없애기
import pandas as pd
import requests

page, page_size = 1, 10
url = f'https://m.stock.naver.com/api/index/KOSPI/price?pageSize={page_size}&page={page}'
url

page와 page_size는 마음대로 바꿀 수 있도록 변수로 지정

 

 

 

 

2. 서버에 데이터 요청

request(url) > response : json(str)

 

 

response = requests.get(url)
response

실행 결과

response의 status code가 200이 나오는지 확인

 

 

 

GET방식 --> get(url)

 

 

response.text[:300]

.text로 response 안에 있는 내용을 확인해 보면 

 

'[{"localTradedAt":"2023-02-17","closePrice":"2,451.21","compareToPreviousClosePrice":"-24.27","compareToPreviousPrice":{"code":"5","text":"하락","name":"FALLING"},"fluctuationsRatio":"-0.98","openPrice":"2,447.66","highPrice":"2,471.51","lowPrice":"2,445.74"},{"localTradedAt":"2023-02-16","closePrice"'

개발자 도구의 Preview에서 봤던 내용임을 알 수 있다

뒤에 데이터가 잘린 이유는 [:300]만 가져왔기 때문에......

 

 

 

 

 

 

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

 

json(str) > list, dict > DataFrame

 

 

※  json이 뭐야....?

  1. JSON 는 Douglas Crockford가 널리 퍼뜨린 Javascript 객체 문법을 따르는 문자 기반의 데이터 포맷임
  2. JSON이 Javascript 객체 문법과 매우 유사하지만 딱히 Javascript가 아니더라도 JSON을 읽고 쓸 수 있는 기능이 다수의 프로그래밍 환경에서 제공된다.
  3. JSON은 문자열 형태로 존재한다. →  네트워크를 통해 전송할 때 아주 유용데이터에 억세스하기 위해서는 네이티브 JSON 객체로 변환
data = response.json()
df = pd.DataFrame(data)[['localTradedAt','closePrice']]

실행 결과

'localTradedAt' , 'closePrice' 두가지 데이터만 가져와서 데이터 프레임으로 만들면 끝 !!

 

def stock_price(code = 'KOSPI', page = 1, page_size=20):
    ''' this function is crawling stock price fron naver.  # 독스트링 , 함수내용
    params:  파라미터
        code: str : KOSPI, KOSDAQ
        page : int
        page_size : int
    return:  리턴값
        type : DataFrame
    '''
    # 1. URL
    url = f'https://m.stock.naver.com/api/index/{code}/price?pageSize={page_size}&page={page}'
    
    # 2. request(URL) > response : json(str)
    response = requests.get(url)

    # 3. json(str) > list, dic > DataFrame
    data = response.json()
    return pd.DataFrame(data)[['localTradedAt','closePrice']]

1~3의 과정들을 하나의 함수로 구현

+ 뒤에 있을 kosdaq데이터를 위해 CODE도 따로 지정

 

def exchange_rate(code='FX_USDKRW', page=1):
    # 1. URL
    url = f'https://m.stock.naver.com/front-api/v1/marketIndex/prices?page={page}&category=exchange&reutersCode={code}'
    
    # 2. request(URL) > response : json(str)
    response = requests.get(url)

    # 3. json(str) > list, dic > DataFrame
    data = response.json()['result']
    return pd.DataFrame(data)[['localTradedAt','closePrice']]

같은 방식으로 원달러 환율 데이터도 수집 해보았다

 함수를 만들면 더 편하다 ;)

 

 

 

usd_1 = exchange_rate(page=1)
usd_2 = exchange_rate(page=2)
usd_df = pd.concat([usd_1, usd_2], ignore_index=True)
usd_df

원달러 환율 데이터 1,2 page의 내용을 가져왔다

usd_df

 

 

 

# stock_price 사용해서 kospi 데이터 가져옴 
kospi_df = stock_price()

# stock_price 사용해서 kodaq 데이터도 가져옴 
kosdaq_df = stock_price(code='KOSDAQ')

kospi
kosdaq

 

 

 

# 데이터 전처리 : 데이터 타입 변경
usd_df['usd'] = usd_df['closePrice'].apply(lambda data: float(data.replace(',',''))) 
kospi_df['kospi'] =  kospi_df['closePrice'].apply(lambda data: float(data.replace(',','')))
kosdaq_df['kosdaq'] =  kosdaq_df['closePrice'].apply(lambda data: float(data.replace(',','')))

시각화를 위해 데이터 전처리 !

 

 

 

# 데이터 프레임 합치기
df = usd_df.copy()
df['kospi'] = kospi_df['kospi']
df['kosdaq'] = kosdaq_df['kosdaq']
df = df.drop(columns=['closePrice'])
df.tail(2)

전처리를 통해 ',' 사라진 모습을 확인할 수 있다

 

 

 

시각화

크기 차이가 많이 나서 데이터를 스케일링 할 필요가 있다 :(

 

 

 

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing  import minmax_scale

plt.figure(figsize=(20,5))
plt.plot(df['localTradedAt'], minmax_scale(df['usd']), label = 'usd')
plt.plot(df['localTradedAt'], minmax_scale(df['kospi']), label = 'kospi')
plt.plot(df['localTradedAt'], minmax_scale(df['kosdaq']), label = 'kosdaq')
plt.xticks(df['localTradedAt'][::2])  #2일 간격으로 출력
plt.legend()
plt.show()

min max scaling을 통해 모든 값을 0과 1사이로 만들어준다

 

스케일링 한 후 !

 

 

df.corr()

시각화했으니 상관관계 분석까지 하면 끝 ~

 

 

'AIVLE' 카테고리의 다른 글

Web Crwaling ④ - Zigbang 원룸 매물 데이터 수집  (0) 2023.02.20
Web Crwaling ③ - 다음 환율 데이터 수집  (0) 2023.02.19
Web Crwaling ① - basic  (0) 2023.02.17
데이터 분석 및 의미 찾기  (0) 2023.02.09
데이터 처리  (0) 2023.02.07