ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (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)
    반응형
Designed by Tistory.