AI SCHOOL/Python

[Python] 네이버 금융 ETF 수집, json 데이터 수집

moru_xz 2023. 1. 24. 17:32

1) 수집하고자 하는 데이터가 어떤 태그에 들어있는지 확인 -> table 태그라면 pd.read_html()로 불러올 수 있고

2) pd.read_html()로 수집이 안 된다면 requests로 요청을 보냄 -> requests 요청을 보내기 위한 주소를 Network 메뉴에서 찾는다. url => preview로 봤을 때 해당 데이터가 있는지 확인 

etf 는 없는 상태 -> js나 xhr 확인 

 

ETF란?

  • ETF(상장지수펀드)는 기초지수의 성과를 추적하는 것이 목표인 인덱스펀드로, 거래소에 상장되어 있어서 개별주식과 마찬가지로 기존의 주식계좌를 통해 거래를 할 수 있습니다. 그 구성종목과 수량 등 자산구성내역(PDF)이 투명하게 공개되어 있고, 장중에는 실시간으로 순자산가치(NAV)가 제공되어 거래에 참고하실 수 있습니다. ETF는 1좌를 거래할 수 있는 최소한의 금액만으로 분산투자 효과를 누릴 수 있어 효율적인 투자수단이며, 펀드보다 운용보수가 낮고 주식에 적용되는 거래세도 붙지 않습니다.

 

etf json데이터가 들어있는 url 확인 -> api 형태로 되어 있음 

requests url 들어가보면 이런 모양임 -> 이미 가공이 다 되어있는 경우임

# 라이브러리를 불러옵니다.
# 데이터 분석을 위한 pandas, 수치계산을 위한 numpy, http 요청을 위한 requests를 받아옵니다.
import pandas as pd
import numpy as np
import requests
# 수집할 url을 가져옵니다.
url = "https://finance.naver.com/api/sise/etfItemList.nhn?etfType=0&targetColumn=market_sum&sortOrder=desc"
print(url) #call back 부분을 빼고 가져온다

call back 안 지워주면 얘부터 파싱됨 -> 지워

 

Pandas를 통한 요청

기존에 수집한 페이지와 다른점은 네트어크 탭에서 'Doc'부분에서 url을 찾을 수 없다는 것이다. -> JS탭에서는 확인 가능 -> pd.read_html(url)이 아닌 pd.read_json(url)을 해야 한다.

# pd.read_html(url)
pd.read_json(url, encoding = 'cp949')

이것도 되고 requests 를 활용해서 읽을 수도 있음 

 

JSON

JSON(제이슨, JavaScript Object Notation)은 속성-값 쌍( attribute–value pairs and array data types (or any other serializable value)) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다. 본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷이다. 즉, 프로그래밍 언어나 플랫폼에 독립적이므로, 구문 분석 및 JSON 데이터 생성을 위한 코드는 C, C++, C#, 자바, 자바스크립트, 펄, 파이썬 등 수많은 프로그래밍 언어에서 쉽게 이용할 수 있다. -> 파일 형식 중 하나이다!

requests를 통한 HTTP 요청

# requests 라이브러리를 통해 url을 받아옵니다.
response = requests.get(url) #네트워크 확인하면 get 방식임
response.status_code

 

JSON 타입으로 데이터 받기

etf_json = response.json()
response.json()

 

JSON에서 원하는 데이터 찾기

# result > etfItemList 의 하위 구조로 목록을 찾고자 하는 데이터를 가져옵니다.
# etfItemList
etfItemList = etf_json['result']['etfItemList']

 

데이터프레임을 변환

json데이터를 pandas의 데이터 프레임의 형태로 만들

# 키-값 형태의 데이터를 데이터프레임으로 만듭니다.
# df
df = pd.DataFrame(etfItemList)
df

데이터 확인

df.head()
df.tail()
df.info()
df.describe()
# 오늘 가장 크게 오른 종목
df[df['changeRate'] == df['changeRate'].max()]

파일저장

# 파이썬 표준라이브러리인 datetime을 불러옵니다.
# 날짜를 만들어 저장하기 위해 오늘 날짜를 구합니다.
from datetime import datetime

today_date = datetime.today().strftime('%Y-%m-%d')
today_date

# f-string 방식으로 파일명을 만들어 줍니다.
# eft_날짜_raw.csv 형태로 만듭니다.
# file_name
file_name = f"eft-{today_date}.csv"
file_name

itemcode 숫자 앞에 있는 0이 지워진다면 dtype={"itemcode": np.object} 타입을 지정해줘야 함

pd.read_csv(file_name, dtype = {'itemcode' : 'O'})