금융퀀트/프로그램기초

(OpenAPI)Notion API 사용: 데이터 입수 2(파이썬 활용)

문송한투자자 2024. 6. 17. 07:31
반응형

데이터 불러오기 및 데이터 확인

노션(Notion)에서 데이터를 불러오는 코드의 구조는 간단하다. 내 API키를 이용한 Client 객체를 먼저 만든다. Client 객체의 databases라는 속성에 있는 query라는 함수를 사용해서 데이터를 받는다. 이때 query라는 함수를 수행하기 위해서는 database id 가 필요하다. 노션(Notion)의 어느 페이지의 데이터를 갖고 올지를 정해주어야 하는 것이다. 이를 코드로 나타내면 아래와 같다. 

# 노션 및 판다스 라이브러리 가져오기
from notion_client import Client
import pandas as pd

# Notion API 키 변수 생성
NOTION_API_KEY = "나의 API 키"

# Notion 클라이언트 객체만들기
notion = Client(auth=NOTION_API_KEY)
db_id = "나의 페이지 아이디"

# 데이터베이스에서 데이터 가져오기 함수
def getNotionData(database_id):
    try:
    	# API 결과값을 response 변수에 담기
        response = notion.databases.query(database_id=database_id)
        # 결과출력
        print(response)
    # 예외처리
    except Exception as e:
        print(f"데이터 불러오기 에러 발생: {e}")

# 함수 실행
getNotionData(db_id)

 

여기서 문제는 나의 페이지 아이디와 나의 API 키 값을 찾는 것이다. 나의 API 키 값은 (OpenAPI)Notion API 사용: 인증키 발급에서 확인한 것처럼 아래 그림 1의 왼쪽처럼 "내 API 통합"에서 확인할 수 있다. 나의 데이터 베이스 아이디는 아래 그림 1의 오른쪽처럼 홈페이지 URL에서 확인할 수 있는데, notion.so/ 뒤의 알파벳과 숫자로 이루어진 문자열이다. 주의해야 할 점은 ?v= 뒤에 있는 부분은 뷰 페이지에 대한 주소이기 때문에 앞쪽 문자열을 사용해야 연결이 된다. 

그림1: 노션 API 아이디 및 DB아이디

입수된 데이터 재처리

데이터를 입수하면 아래 그림 2와 같이 알 수 없는 문자열이 결과로 나올 것이다. 이 결과를 우리가 노션 화면에서 보던 표로 정리 해주어야 한다.

그림2: API 결과값 입수

먼저 이 데이터가 도대체 어떤 구조인지 파악해야 하는데, 이런 형식의 데이터를 JSON 형식이라고 한다. 데이터를 알아보기 쉽게 정리하면 대강 아래와 같은 모양이 된다. 

{
    'object': 'list',
    'results': [
        {
    ...(중략)...
        },
        {
            'object': 'page',
            'id': '~',
    ...(중략)...
            'properties': {
                '비고': {
                    'id': '~', 'type': 'rich_text', 'rich_text': [
                        {'type': 'text', 'text': {'content': '투자못함', 'link': None},
                         'annotations': {~},
                         'plain_text': '투자못함', 'href': None}
                    ]
                },
                '나이': {
                    'id': '~', 'type': 'multi_select', 'multi_select': [
                        {'id': '~', 'name': '38', 'color': 'red'}
                    ]
                },
                '이름': {
                    'id': 'title', 'type': 'title', 'title': [
                        {'type': 'text', 'text': {'content': '투자자', 'link': None},
                         'annotations': {~},
                         'plain_text': '투자자', 'href': None}
                    ]
                }
            },
         ...(후략)...

위 항목의 구조는 크게 results 라는 리스트로 결과가 묶여있고, 각 항목은 page라는 이름의 object이다. page의 properties 속성에 비고, 나이, 이름 항목의 값을 가져오면 된다. 예를 들어 나이를 가져오려면 나이 항목의 ['multi_select'] 리스트의 [0] 번째 항목의 ['name'] 값을 설정해 주는 방식이다. 이를 코드로 짜면 아래와 같다. 

# 노션 및 판다스 라이브러리 가져오기
from notion_client import Client
import pandas as pd

# Notion API 키 변수 생성
NOTION_API_KEY = "나의 API 키"

# Notion 클라이언트 객체만들기
notion = Client(auth=NOTION_API_KEY)
db_id = "나의 페이지 아이디"

# 데이터베이스에서 데이터 가져오기 함수
def getNotionData(database_id):
    try:
        # API 결과값을 response 변수에 담기
        response = notion.databases.query(database_id=database_id)
        data = []
        # results 항목을 page 변수에 넣어서 for 문 실행
        for page in response['results']:
            properties = page['properties']
            # properties 에서 이름 값 가져오기
            name = properties['이름']['title'][0]['text']['content']
            # properties 에서 나이 값 가져오기
            age = properties['나이']['multi_select'][0]['name']
            # properties 에서 비고 값 가져오기
            remark = properties['비고']['rich_text'][0]['text']['content']
            # name, age, remark 로 하나의 row 추가
            data.append([name, age, remark])
        # dataframe 만들기
        df = pd.DataFrame(data, columns=['이름', '나이', '비고'])
        print(df)
        
    # 예외처리
    except Exception as e:
        print(f"데이터 불러오기 에러 발생: {e}")

# 함수 실행
getNotionData(db_id)
반응형