2023. 8. 23. 10:17ㆍPython
네이버 증권에서 주식 데이터를 크롤링해서 마트를 생성해 보려고 하다가 여러 가지 현실적인 문제에 부딪혔다.
일단 모든 종목 코드에 대해서 수집해야 하는데 그렇게 되면 약 2700번의 호출이 필요하다 매일...
또한 KOSPI를 수집하는 코드는 잘 작동을 하나 삼성전자라는 주식을 크롤링할 때는 pd.read_html에서 에러가 나길래 해결법을 찾아봤더니 호출할 때는 페이지 오류가 뜨나 인터넷으로 url을 입력하면 잘 된다... 무슨 에러인지 몰라서 패스...
그렇게 다른 곳에서 주식정보를 받을 수 없다가 찾게 된 곳이 공공데이터 포털이었다.
금융위원회_주식시세정보 | 공공데이터포털 (data.go.kr)
RestAPI를 활용해서 데이터를 수집한 경험이 많아서 금방 하겠지 했지만 생각이 안나서 간단하게 정리해 본다.
REST API로 주식시세정보 데이터 조회하기 with python
우선 공공데이터 포털에 계정을 생성하고 서비스 키를 위한 활용신청을 해야 한다.
금방 신청이 되며 신청한 정보에 일반 인증키(decoding)를 복사해서 앞으로 활용하면 된다.
활용신청 후 공공데이터포털에서 제공하는 API 가이드를 다운로드하여 읽어보는 게 좋다.
해당 API 요청 메시지라던지 응답 메시지의 간단한 설명 등 참고해서 호출하면 된다.
URL 및 파라미터 정의
param={'Servicekey':Servicekey,'resultType':'json','numOfRows':3000,'basDt':'20230818'}
url='https://apis.data.go.kr/1160100/service/GetStockSecuritiesInfoService/getStockPriceInfo?'
우선 요청 변수를 param이라는 딕셔너리 형태의 변수로 입력해 두자.
1. ServiceKey는 필수 요청 변수이고 활용신청 후 복사한 일반 인증키를 넣어주면 된다.
2. resultType은 JSON으로 지정해 두자. requests라는 라이브러리를 사용해서 API를 호출할 텐데 이 requests를 사용하면 json형태의 데이터를 파이썬의 딕셔너리 형태로 쉽게 변환이 가능하기 때문이다.
3. numOfRows는 한번 호출했을 때 불러오는 데이터의 행 수를 의미하는데 대략 코스피 코스닥 합처서 상장기업이 2700여 개 정도 됨으로 3000으로 지정했다.
4. basDt는 기준일자로 특정일자의 데이터를 호출하는 변수로 수집할 때 사용할 예정이다.
Requests를 이용해 API 호출
import requests
response=requests.get(url,param)
위에서 정의한 url, param을 이런 식으로 requests.get() 함수에 넣어주면 호출이 된다.
response를 출력해 보면
출력에 성공하면 위와 같이 200이라는 메시지가 뜨는 것을 확인할 수 있다.
JSON--> DICT 변환
datajs=response.json()
이제. json() 함수를 사용하면 응답된 json형태의 결과를 파이썬의 딕셔너리 형태로 변환해 준다.
위와 같이 층층이 이루어진 딕셔너리에서 원하는 값들만 뽑아서 데이터프레임에 저장하려고 한다.
response>body>items>item 이라는 구조로 되어있고 여기서 제일 하위에 있는 item들이 주식 종목들이다.
이럴때 pandas에서는 엄청 쉬운 방법으로 데이터프레임으로 변환해주는 함수가 있는데 pd.json_normalize()라는 함수라고 한다.
pd.json_normalize()를 이용한 데이터프레임 생성
df = pd.json_normalize(datajs, record_path=['response','body','items','item'])
response>body>items>item 이 구조안에 있는 데이터를 가져오고 싶을 때 record_path 라는 파라미터에 리스트 형태로 입력해 주기만 하면 이렇게 데이터프레임으로 쉽게 변환해준다. 기존에는 인덱싱과 루프문을 썼다면 앞으로는 이 함수를 이용하면 훨씬 편해질 것 같다...
'Python' 카테고리의 다른 글
Python에서 HDFS에 저장된 이미지 불러오기 (0) | 2023.11.29 |
---|---|
서울시 도로소통정보 시각화(with folium)-(1) (1) | 2023.11.21 |
VM과 MobaXterm 연동하기 (1) | 2023.10.25 |
Python 가상 환경 만들기 (0) | 2023.08.29 |
Linux에 Python offline 설치하기 (0) | 2023.02.08 |