순서
•
목표
네이버 증권 사이트에서 주가 데이터 수집
•
수집할 데이터
일별 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!