파이썬에서 노션 API를 사용하여 뉴스 크롤링한 정보를 노션에 업로드하기 (notion-py)
notion-py
Unofficial Python3 client for Notion.so API
관련 문서 : pypi.org/project/notion-py/
파이썬에서 노션을 핸들링할 수 있는 notion-py 라이브러리는 비공식 노션 API를 제공하는 라이브러리입니다.
약간의 코드만 작성하면, 자동으로 노션을 쉽게 핸들링할 수 있기 때문에 매우 간단하고 강력한! API라고 생각합니다. :) 비록 비공식 노션 라이브러리지만, 아직까지 잘 사용되고 있고, 노션에서 나중에 api를 제공할지는 미지수이기때문에 적어도 공식 라이브러리가 나오기 전까지는 유용하게 사용할 수 있지 않을까 생각합니다. 🤔
사담을 붙이자면, 이 노션 api를 통해서 저는 크롤링한 정보를 업로드하곤 했었습니다. 빠른 시간 내에 보기 편하고 자동으로 웹에 크롤링 한 정보를 업로드하는 방법이 없을까 하다가 고안한 나름의 잔머리였습니다 하핫ㅎㅎ 😅
그럼 시작해봅시다!
설치하기
파이썬 3.5 이상부터 지원합니다. 아래 명령어로 설치할 수 있습니다.
pip install notion
Quick Start
notion-py에서 제공하는 예제 코드는 아래와 같습니다.
from notion.client import NotionClient
# Obtain the `token_v2` value by inspecting your browser cookies on a logged-in (non-guest) session on Notion.so
client = NotionClient(token_v2="<token_v2>")
# Replace this URL with the URL of the page you want to edit
page = client.get_block("https://www.notion.so/myorg/Test-c0d20a71c0944985ae96e661ccc99821")
print("The old title is:", page.title)
# Note: You can use Markdown! We convert on-the-fly to Notion's internal formatted text data structure.
page.title = "The title has now changed, and has *live-updated* in the browser!"
|
cs |
딱 보시면 아시겠지만,
- NotionClient 객체를 token 매개변수로 불러와 client라는 변수에 저장한다
client.get_block()
으로 페이지 정보에 관한 내용이 page 변수에 들어간다page.title
은 해당 페이지의 타이틀을 말한다.
이런 프로세스로 진행됩니다. 즉, cleint를 가져와서 특정 페이지에 대한 정보를 page 변수에 넣고 page에서 글을 쓰고 이미지도 넣고 표도 넣고 그런 작업을 하면 된다! 하는 것입니다
Token 정보 불러오기
NotionClient 객체를 불러오면서 토큰 정보 값을 함께 가져와줘야합니다. 토큰 정보는 크롬 개발자 도구를 통해서 확인할 수 있습니다.
F12
를 눌러 크롬 개발자도구를 열어줍니다.Application
->Cookies
->token_v2
에서 토큰 정보 값이 있습니다. 이것을 복사하고 코드에 넣어주면 됩니다.
실습! 크롤링한 뉴스를 노션 페이지에 업로드해봅시다!
이제 대충 필요한 정보들은 다 들어온 것 같습니다. 뉴스 정보를 크롤링하고, 그것을 노션에 표 형식으로 만들어보는 작업을 해봅시다!
먼저, 뉴스에 대한 정보가 아래와 같다고 생각해봅시다. 뉴스 내용 전체를 불러오지 않고, 기사 제목과 기사 url, 작성된 날짜, 검색 키워드 등의 정보를 넣는다고 생각해봅시다.
news = { '기사 제목' : title, '기사 링크' : newsurl, '기사 날짜' : published_date, '키워드' : onekeyword, '출처' : '매일경제', '크롤링 날짜' : crawling_date } | cs |
이런식으로 정보들을 넣어준다고 생각합시다! 그럼 한번 매일경제에서 키워드를 검색하면 나오는 첫 세 페이지를 가져오는 코드를 작성해봅시다.
from bs4 import BeautifulSoup import requests keyword = ['IPO', '투자유치'] source = 'http://find.mk.co.kr/new/search.php?page=news' def MK(): MK_NewsList = [] for onekeyword in keyword: searchlink = source + '&s_keyword=' + onekeyword for i in range(1, 3): #페이지 3개 크롤링 searchlink += '&pageNum=' + str(i) req = requests.get(searchlink) soup = BeautifulSoup(req.content.decode('euc-kr', 'replace')) rawnews = soup.select('.sub_list') for onenews in rawnews: title = onenews.select('span > a')[0].text newsurl = onenews.select('span > a')[0].get('href') published_date = onenews.select('span.art_time')[0].text published_date = published_date[-24:] published_date = published_date[0:4] + '-' + published_date[6:8] + '-' + published_date[10:12] + ' ' + published_date[-9:] now = datetime.now() create_date = "%s-%02d-%s %02d:%02d:%02d" % (now.year, now.month, now.day, now.hour, now.minute, now.second) crawling_one_news = { '기사 제목' : title, '기사 링크' : newsurl, '기사 날짜' : published_date, '키워드' : onekeyword, '출처' : '매일경제', '크롤링 날짜' : create_date } MK_NewsList.append(crawling_one_news) return MK_NewsList | cs |
여러분들이 다른 사이트에서 크롤링을 하시려면 직접 개발자도구로 html 태그를 계속 확인해가며 쓸 수 있습니다. 위의 함수의 리턴값은 리스트 배열이 나오는데, 각각의 원소는 딕셔너리의 값들이 들어갑니다. (지금 생각해보면 왜 이렇게 했는지 모르겠네요..ㅎ)
그럼 이제 정말 하고싶었던 노션에서 크롤링한 정보를 표로 보여주는 작업을 해봅시다.
from notion.client import * from notion.block import * # 생성할 표 페이지에 들어가는 정보입니다. 제목, url링크, 날짜 등등이 들어갑니다. (위의 뉴스 데이터 형식과 맞춰주면 됩니다.) def get_collection_schema(): return { "title" : {"name" : "title", "type" : "text"}, "url" : {"name" : "url", "type" : "url"}, "crawlingdate" : {"name" : "crawlingdate", "type" : "text"}, "publisheddate" : {"name" : "publisheddate" , "type" : "text"}, "source" : {"name" : "source", "type" : "text"}, "keyword" : {"name" : "keyword", "type" : "text"} } token = "INPUT YOUR TOKEN" # 여러분들이 위에서 찾은 토큰을 입력하세요 url = "INPUT YOUR PAGE LINK" # 여러분들의 노션 페이지 url을 입력하세요 # 위에서 했던 작업이죠? 클라이언트를 만들고 페이지 정보를 가져옵시다. client = NotionClient(token_v2 = token_v2) page = client.get_block(url) # 위에서 작성한 url에서 새로운 페이지를 만듭니다. 이 페이지는 노션의 collection 형식의 페이지고 여기에 크롤링한 정보들을 넣어줍니다. chlid_page = page.children.add_new(CollectionViewPageBlock) child_page.collection = client.get_collection( client.create_record('collection', parent=child_page, schema=get_collection_schema()) ) child_page.title = "매일경제 크롤링" # 페이지 제목입니다. news = MK() # news 변수에 크롤링한 뉴스 내용들이 들어갑니다. for onenews in news: row = child_page.collection.add_row() # 표에서 한 row를 생성해줍니다. row.title = onenews['기사 제목'] row.source = onenews['출처'] row.publisheddate = onenews['기사 날짜'] row.crawlingdate = onenews['크롤링 날짜'] row.url = onenews['기사 링크'] row.keyword = onenews['키워드'] view = child_page.views.add_new(view_type='table') # 이렇게 view까지 선언해주면 끝! | cs |
이렇게 코드를 작성하고 코드를 돌리면 아래와 같이 여러분들의 페이지에 생성될 것입니다.
여기까지 따라하신 여러분들은 아마 곧잘 다른 기능들도 활용하실 수 있으실 겁니다. :)
notion-py는 오픈소스로 깃허브에 모든 코드가 공개되어있습니다. 이해가 가지 않거나 어떻게 다른 내용들을 사용할 수 있을지 궁금하시다면 아래 링크를 통해서 코드를 직접 확인해보시는 것도 좋을 것 같습니다. 🙂
'Computer Engineering > Python' 카테고리의 다른 글
[Pythonic한 코드 작성하기] 파이썬의 자식 프로세스 관리 모듈, subprocess (0) | 2021.04.21 |
---|---|
[Pythonic한 코드 작성하기] Python의 가변 인수(*args)와 키워드 인수에 대해 파헤쳐보자 (0) | 2021.02.25 |
[Pythonic한 코드 작성하기] 리스트 컴프리헨션 (list comprehension) (0) | 2021.02.03 |
파이썬에서 Generator란? (0) | 2021.01.27 |
파이썬에서 Generator란? (feat. yield 함수) (0) | 2021.01.09 |
댓글
이 글 공유하기
다른 글
-
[Pythonic한 코드 작성하기] Python의 가변 인수(*args)와 키워드 인수에 대해 파헤쳐보자
[Pythonic한 코드 작성하기] Python의 가변 인수(*args)와 키워드 인수에 대해 파헤쳐보자
2021.02.25 -
[Pythonic한 코드 작성하기] 리스트 컴프리헨션 (list comprehension)
[Pythonic한 코드 작성하기] 리스트 컴프리헨션 (list comprehension)
2021.02.03 -
파이썬에서 Generator란?
파이썬에서 Generator란?
2021.01.27 -
파이썬에서 Generator란? (feat. yield 함수)
파이썬에서 Generator란? (feat. yield 함수)
2021.01.09