본문 바로가기
PYTHON(파이썬)/파이썬 활용

네이버에서 PYTHON으로 삼성전자 주가 가져오기

by eplus 2024. 11. 1.

네이버에서 제공하는 주식 정보를 조회하는 간단한 API 호출을 구현한 프로그램

### 주요 기능 요약:
- **주식 정보 조회 (`get_sise` 함수)**: 특정 주식 코드에 대해 주어진 기간의 주식 데이터를 가져오는 함수입니다.
- **사용된 모듈**:
  - `urllib.parse`의 `parse.urlencode`: 요청 매개변수를 URL에 인코딩하기 위해 사용됩니다.
  - `requests`: 네이버 API에 HTTP GET 요청을 보내기 위해 사용됩니다.
  - `ast.literal_eval`: 응답 데이터를 안전하게 파싱하기 위해 사용됩니다.

### 세부 기능 분석:

1. **함수 정의**: 
   ```python
   def get_sise(code, start_time, end_time, time_from='day'):
   ```
   - `code`: 주식 종목 코드 (예: '005930'은 삼성전자).
   - `start_time`, `end_time`: 데이터 조회 시작 및 종료 날짜 (형식: 'YYYYMMDD').
   - `time_from`: 시간 프레임 (예: 'day', 'week' 등).

2. **URL 매개변수 구성**:
   ```python
   get_param = {
       'symbol': code,
       'requestType': 1,
       'startTime': start_time,
       'endTime': end_time,
       'timeframe': time_from
   }
   get_param = parse.urlencode(get_param)
   ```
   - 주어진 매개변수로 `get_param` 딕셔너리를 만든 후, `parse.urlencode`를 사용하여 URL 쿼리 매개변수 형식으로 변환합니다.

3. **URL 생성 및 API 호출**:
   ```python
   url = "https://api.finance.naver.com/siseJson.naver?%s" % (get_param)
   response = requests.get(url)
   ```
   - `url`은 네이버의 금융 API를 호출하기 위해 만들어집니다. `requests.get(url)`을 사용하여 해당 URL로 HTTP GET 요청을 보냅니다.

4. **응답 데이터 파싱**:
   ```python
   return literal_eval(response.text.strip())
   ```
   - 응답 데이터는 문자열로 반환되므로 `literal_eval`을 사용하여 파이썬 객체로 변환합니다. 이 방법은 응답 데이터가 JSON 형식과 유사한 경우 매우 편리합니다.

### 코드 사용 예:
```python
print(get_sise('005930', '20230721', '20230730', 'day'))
```
- 삼성전자(005930)의 주식 데이터를 2023년 7월 21일부터 7월 30일까지 일 단위로 조회합니다.

### 데이터 흐름 분석:
1. 사용자가 종목 코드와 날짜 정보를 함수에 입력합니다.
2. 함수가 해당 매개변수를 기반으로 네이버 금융 API에 HTTP GET 요청을 전송합니다.
3. 응답 데이터를 문자열로 받은 후, `literal_eval`을 사용하여 리스트로 변환한 뒤 반환합니다.

### 네이버 API 특성:
- 네이버에서 제공하는 주식 데이터 API는 비공식 API로, 안정성과 접근성이 보장되지 않을 수 있습니다. 데이터를 수집하는 동안 서버의 응답이 일관되지 않을 수 있고, 갑자기 서비스가 중단될 가능성도 있습니다. 공식적인 API나 제공되는 SDK가 있다면 사용하는 것이 더 좋습니다.

결론적으로 이 코드는 특정 기간 동안 주식의 시세 데이터를 수집하기 위한 간단한 기능을 제공하며, `requests`와 `urllib` 모듈을 사용해 GET 요청을 구성하고 데이터를 가져오는 데 초점을 두고 있습니다. 보안성, 안정성, 오류 처리를 강화하여 실 사용 시 발생할 수 있는 문제를 대비하는 것이 필요합니다.

#
# naver에서 주식 정보 조회
#
from urllib import parse
from ast import literal_eval
import requests

def get_sise(code, start_time, end_time, time_from='day') :
    get_param = {
        'symbol':code,
        'requestType':1,
        'startTime':start_time,
        'endTime':end_time,
        'timeframe':time_from
    }
    get_param = parse.urlencode(get_param)
    response = requests.get(url)
    return literal_eval(response.text.strip())
   
print(get_sise('005930', '20230721', '20230730', 'day'))

조회된 내용을 보기 쉽게 보완하고 종가 기준으로 챠트를 생성한 소스

챠트에 한글 표시하도록 폰트 설정 추가

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from urllib import parse
from ast import literal_eval
import requests
import platform

# 한글 폰트 설정
if platform.system() == 'Windows':
    font_path = "c:/Windows/Fonts/malgun.ttf"  # Windows의 경우 사용 가능한 한글 폰트 설정
elif platform.system() == 'Darwin':
    font_path = "/System/Library/Fonts/AppleGothic.ttf"  # MacOS의 경우 사용 가능한 한글 폰트 설정
else:
    font_path = "/usr/share/fonts/truetype/nanum/NanumGothic.ttf"  # Linux의 경우 사용 가능한 한글 폰트 설정

font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

def get_sise(code, start_time, end_time, time_from='day'):
    get_param = {
        'symbol': code,
        'requestType': 1,
        'startTime': start_time,
        'endTime': end_time,
        'timeframe': time_from
    }
    get_param = parse.urlencode(get_param)
    url = "https://api.finance.naver.com/siseJson.naver?%s" % (get_param)
    response = requests.get(url)
    return literal_eval(response.text.strip())

def format_sise_data(data):
    # 첫 번째 행은 컬럼 이름이므로 따로 처리해줍니다.
    columns = data[0]
    # 두 번째 행부터는 실제 데이터입니다.
    rows = data[1:]
    # pandas DataFrame으로 변환합니다.
    df = pd.DataFrame(rows, columns=columns)
    return df

# 주식 데이터를 조회하고 보기 좋게 출력합니다.
data = get_sise('005930', '20230721', '20230730', 'day')
formatted_data = format_sise_data(data)
print(formatted_data)

# 날짜별로 차트 형태로 조회합니다.
formatted_data['날짜'] = pd.to_datetime(formatted_data['날짜'])
formatted_data.set_index('날짜', inplace=True)

# 차트 그리기
plt.figure(figsize=(10, 5))
plt.plot(formatted_data.index, formatted_data['종가'], marker='o', linestyle='-', label='종가')
plt.xlabel('날짜')
plt.ylabel('종가')
plt.title('삼성전자 (005930) 종가 추이')
plt.xticks(rotation=45)
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

 

728x90
반응형