🐍

Pythonを使ってNotionのデータベースをデータフレームとして取得する

2022/02/22に公開

やりたいこと

Notionのデータベースに保管している情報をPythonでデータフレームとして扱いたい!
初めてNotion API を触るような人を想定しているので、知ってるよ~って人は自分の知りたいところまで飛ばしてからご覧になってください🙇‍♂️

このデータベースを操作したいと思います。

手順

My integrations の作成

My integration とは Notion 上での編集許可書みたいなものです。
これを操作したいデータベースがある WorkSpace に入れることによって、情報の操作が可能になります。

まず Notion API の公式サイトに行き、右上の "My integration" を選択します。

続いて "Creat new integration" から新しく integration を作成します。

Name と WorkSpace を選択したら Submit を押して My integration の作成は終了です。
integration type はひとまず internal integration にしておくと良いと思います。

今作った My integration の TOKEN は後から必要になるのでコピーしておいてください。

操作したいdatabaseのあるページに先ほどのMy intefrationを招待

database のあるページの右上にある Share のところをクリックして、先ほど作成したものを選択して招待します。ステータスが Can Edit になっていたら大丈夫です。
次に取得したいデータベースのIDを取得します。

コピーしたURLの so/ ~ ?の " " で囲んだ部分が databese_id です。

https://www.notion.so/ "a6a53608ff994573837a85031c504ac9" ?v=225ba897120d400f8f21148e402d0b1e

これも保存しておいてください。

requestsモジュールを使ってデータを取得する

Python の requests モジュールを使ってコードを書いていきます。

import json
import pandas as pd
import requests

NOTION_API_TOKEN = '自分のTOKEN'
NOTION_DATABASE_ID = '取得したいデータベースのID'
NOTION_DATABASE_URL = f'https://api.notion.com/v1/databases/{NOTION_DATABASE_ID}/query'

headers = {'Authorization': f'Bearer {NOTION_API_TOKEN}',
          'Notion-Version': '2021-08-16',
          'Content-Type': 'application/json'}
payload = {'page_size': 20}

response = requests.post(NOTION_DATABASE_URL, data=json.dumps(payload), headers=headers).json()
r = response['results']
name = []
price = []
count = []
for i in range(len(response['results'])):
  name.append(r[i]['properties']['Name']['title'][0]['plain_text'])
  price.append(r[i]['properties']['price']['number'])
  count.append(r[i]['properties']['count']['number'])
df = pd.DataFrame({'name': name,'price': price,'count': count})

  • NOTION_API_TOKEN : 先ほど保存したTOKEN
  • NOTION_DATABASE_ID : 先ほど保存したID
  • NOTION_DATABASE_URL, headers, payload : こちらの書き方についてはドキュメントをご覧になってください

Notion API のドキュメント
https://developers.notion.com/reference/post-database-query

結果


  name      price   count
0 バナナ	100	2
1 ぶどう	300	4
2 りんご	200	3

Discussion