Search

Crawling Naver Stock Datas

순서

목표
네이버 증권 사이트에서 주가 데이터 수집
수집할 데이터
일별 kospi, kosdaq 주가, 일별 환율(exchange rate) 데이터
데이터 수집 절차
서버에 데이터 요청 : request(url) > response : json(str)
데이터를 str 타입으로 받아오기 때문에 json() 메소드를 이용해서 데이터 분석에 맞는 타입으로 변환해준다.
서버에서 받은 데이터 파싱(데이터 형태를 변경) : json(str) > list, dict > DataFrame
.json() 메소드가 알아서 리스트나 딕셔너리 타입으로 변환해준다. 필요에 따라 데이터프레임 타입으로 변환해준다.

1. url 불러오기

url 은 데이터가 들어있는 웹페이지의 url을 복사하거나
개발자도구(F12) > Network > Clear Network log > 페이지 새로고침 > 맨 윗상단 Name 클릭 > Headers 탭에서 Request URL 복사
Request URL의 인코딩이 깨져있을 경우, URL Decoder/Encoder 아무 페이지에서 Decoding 해준뒤 디코딩된 URL 을 사용할 것
웹페이지 url 이 복잡할 경우, 모바일 웹페이지에서 수집
개발자도구 > Toggle Device Toolbar 클릭 > 모바일 버전으로 보기 클릭
import requests import pandas as pd url = 'https://m.stock.naver.com/api/index/KOSPI/price?pageSize=10&page=2'
Python
복사

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

개발자 Headers탭에서 Request Method 타입이 get 방식인지 / post 방식인지 확인할 것
response의 status code가 200이 나오는지 확인하는 방법
response # 또는 response.text
Python
복사
403이나 500이 나오면 request가 잘못되거나 web server에서 수집이 안되도록 설정이 된것
response 내용 확인하는 방법 : response.text
대안 : header 설정 또는 selenium 사용
response = requests.get(url) response
Python
복사
<Response [200]>
dir(response) # response 변수가 사용할 수 있는 메소드, 속성 확인하기
Python
복사
# 받아온 내용 확인해보기 response.text[:100]
Python
복사
'[{"localTradedAt":"2024-09-12","closePrice":"2,572.09","compareToPreviousClosePrice":"58.72","compar'

3. 서버에서 받은 데이터 파싱(데이터 형태를 변경) : json(str) > list, dict > DataFrame

type(response.json()) # list data = response.json() data[:2]
Python
복사
[{'localTradedAt': '2024-09-12', 'closePrice': '2,572.09', 'compareToPreviousClosePrice': '58.72', 'compareToPreviousPrice': {'code': '2', 'text': '상승', 'name': 'RISING'}, 'fluctuationsRatio': '2.34', 'openPrice': '2,547.50', 'highPrice': '2,572.09', 'lowPrice': '2,537.87'}, {'localTradedAt': '2024-09-11', 'closePrice': '2,513.37', 'compareToPreviousClosePrice': '-10.06', 'compareToPreviousPrice': {'code': '5', 'text': '하락', 'name': 'FALLING'}, 'fluctuationsRatio': '-0.40', 'openPrice': '2,524.86', 'highPrice': '2,526.13', 'lowPrice': '2,493.37'}]
Plain Text
복사
# 리스트 내 딕셔너리 형태 -> 데이터프레임으로 변환 df = pd.DataFrame(data) df = df[['localTradeAt', 'closePrice']] df.head()
Python
복사
localTradedAt
closePrice
0
2024-09-12
2,572.09
1
2024-09-11
2,513.37
2
2024-09-10
2,523.43
3
2024-09-09
2,535.93
4
2024-09-06
2,544.28
class BigPagesize(Exception): def __str__(self): return 'pagesize should be less than 60!' # 함수화 def stock(code='KOSPI', page_size=10, page=1): if page_size > 60: raise BigPagesize() # url url = 'https://m.stock.naver.com/api/index/{code}/price?pageSize={page_size}&page={page}' print(url) # request(URL) > response(JSON(str)) response = requests.get(url) # JSON(str) > list, dict > dataframe data = response.json() return pd.DataFrame(data)[['localTradeAt', 'closePrice']]
Python
복사
df = stock('KOSDAQ', 62, 3) df.tail()
Python
복사
BigPagesize: pagesize less then 60!