1. 웹서비스 분석 : url
Crwaling Naver Stock Datas
네이버 증권 사이트에서 주가 데이터 수집
→ pc 웹페이지가 복잡하면 mobile 웹페이지에서 수집한다

크롬 → 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이 나오는지 확인

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이 뭐야....?
- JSON 는 Douglas Crockford가 널리 퍼뜨린 Javascript 객체 문법을 따르는 문자 기반의 데이터 포맷임
- JSON이 Javascript 객체 문법과 매우 유사하지만 딱히 Javascript가 아니더라도 JSON을 읽고 쓸 수 있는 기능이 다수의 프로그래밍 환경에서 제공된다.
- 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의 내용을 가져왔다

# stock_price 사용해서 kospi 데이터 가져옴
kospi_df = stock_price()
# stock_price 사용해서 kodaq 데이터도 가져옴
kosdaq_df = stock_price(code='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 |