ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네이버에서 PYTHON으로 삼성전자 주가 가져오기
    PYTHON(파이썬)/파이썬 활용 2024. 11. 1. 04:15
    728x90
    반응형

    네이버에서 제공하는 주식 정보를 조회하는 간단한 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
Designed by Tistory.