티스토리 뷰

반응형
Notion에서 Tistory로 자동 업로드 #7 (selenium으로 페이지 자동 다운로드)

개요

잠깐 지난번까지 해왔던 것들을 정리해 보겠습니다. 빨간 부분은 이번에 알아 볼 방법입니다.

  1. notion-py모듈을 이용해서 발행할 페이지 탐색
  1. 발행할 페이지를 자동으로 다운로드(html export)
  1. 다운로드 한 html을 parsing하여 notion style에 맞게 수정
  1. tistory api를 이용하여 위 3번의 페이지를 tistory에 업로드

이번에는 1번을 활용해서 발행할 페이지만 골라서 다운로드 하는 방법을 알아보겠습니다. selenium이라는 python 모듈을 이용하여 해당 페이지에 각각 접속하여 다운로드 해보겠습니다.

일단 여기를 클릭하여 selenium을 사용할 수 있도록, chromedriver를 다운받고 기본 사용 방법을 익혀야 합니다.

기본 사용법을 익히셨다면 다음과 같은 방법을 알아보겠습니다.

  1. notion-py를 사용하여 발행할 페이지들의 링크를 알아냅니다.
  1. selenium을 이용하여 크롬 브라우저로 각각의 링크를 접속하고 export 버튼을 클릭하여 html 형식으로 다운로드 합니다.

다운로드를 완료하면 지금까지의 게시물을 참고하여 자동으로 html파일을 parsing하고 tistory api를 사용해서 업로드 할 수 있겠죠?

📃 발행할 페이지들의 링크 알아내기

Notion table property 예시

노션 페이지에서 share(공유)버튼을 누르고 url을 확인해 보시면 굉장히 복잡하게 되어있는 것을 알 수 있습니다.. 하지만 알아내는 방법이 다 있는 법이죠!

일단 지난번 게시물에서 배운것과 똑같은 방법으로 notion-py 모듈을 사용하여 발행할 페이지의 리스트를 가져오겠습니다. 상태 property가 발행준비 완료 인것들만 가져오도록 하겠습니다.

  • 지난 게시물의 소스 확인하기(get_pages_readyToPost 함수)
    # 개인 token으로 notion 접속
    from notion.client import NotionClient
    token_v2 = '<token>'
    client = NotionClient(token_v2=token_v2)
    
    def get_pages_readyToPost(table_url):
      # get table
      cv = client.get_collection_view(table_url)
    	
      pages = []
      # check every row's status
      for row in cv.collection.get_rows():
        if row.sangtae == '발행준비 완료':
          print(row)
          pages.append(row)
    	
      return pages
# 발행할 pages 가져오기
pages = get_pages_readyToPost('테이블을 포함하는 노션 페이지 url')

# 각 page의 id 확인하기
for page in pages:
  print(page.id)

이때 pages는 배열 형태로 담겨져 있는데요, 각각의 page를 순회하면서 id를 출력해보면 알 수 있습니다.

id는 대충 아래처럼 생겼는데요, 눈치 채셨는지 모르겠지만 노션 페이지에서 share버튼을 누르면 나오는 url 링크의 마지막과 같습니다. 완전히 같진 않고 중간에 '-' 기호가 섞여 있네요.

(id 예시: abcd1234-ab12-cd34-ef56-abcde123456)

그렇다는건, 이 id를 알면 다운로드 할 노션 페이지의 url을 알아낼 수 있다는 거겠죠?

제가 알아낸 노션 페이지의 url 규칙은 다음과 같습니다.

  1. 맨 앞 부분은 https://www.notion.so/ 로 시작한다.
  1. / 뒤의 고유한 값은 "제목-id" 로 이루어진다.
  1. 제목은 영문자, 숫자로만 이루어지고 중간에 한글이나 기호가 끼어든 경우에는 -로 대체 된다.
  1. 제목에 영문, 숫자가 없는 경우 제목은 생략하고 /id 가 된다.

예를 들어 아래와 같이 변환 됩니다. (본인 페이지로 맞는지 확인해 보세요 ㅎㅎ)

제목: Notion에서 Tistory로 자동 업로드 #7 (selenium으로 페이지 자동 다운로드)

→ Notion-Tistory-7-selenium (3번 규칙에 따라)

ID: xxxx

최종 url: https://www.notion.so/Notion-Tistory-7-selenium-xxxx

노션 페이지의 제목과 id로 url 링크를 만들어주는 함수를 작성해 보겠습니다.

  • 코드보기
    def get_url(_id, _title):
    	# 1번 규칙
    	url = 'https://www.notion.so/'
    	# id에서 '-' 기호 모두 제거
    	_id = _id.replace("-","")
    
    	new_title = ''
    	for ch in _title:
    		# 영문이나 숫자인 경우 추가(3번 규칙)
    		if ord('a') <= ord(ch.lower()) <= ord('z'):
    			new_title += ch
    		elif ord('0') <= ord(ch) <= ord('9'):
    			new_title += ch
    		# 이외의 한글이나 기호인 경우 skip
    		else:
    			# 첫 문자가 영어가 아닌 경우 skip
    			if len(new_title)==0: continue
    			if new_title[-1]=='-': continue
    			else: new_title += '-'
    
    	# 4번 규칙 체크
    	if new_title=='':
    		return url+_id
    
    	if new_title[-1]=='-':
    		new_title = new_title[:-1]
    
    	# 2번 규칙
    	return url+new_title+'-'+_id
    
    # 위의 sample page
    url = get_url('xxxx', 'Notion에서 Tistory로 자동 업로드 #7 (selenium으로 페이지 자동 다운로드)')
    print(url)
    # https://www.notion.so/Notion-Tistory-7-selenium-xxxx

👌 발행할 페이지 링크에 접속하여 html로 export

자 이제 selenium을 사용할 차례입니다. 여기를 클릭하면 간단한 사용법을 알 수 있습니다.

  • selenium driver 실행하는 소스보기
    from selenium import webdriver
    chrome_driver_dir = "chromedriver 경로"
    driver = webdriver.Chrome(chrome_driver_dir)

다만 notion에 로그인을 먼저 해야 하는데요, 로그인 방법이 직접 로그인, google계정 로그인, apple로 로그인 등 다양하기 때문에 직접 selenium을 활용해서 직접 소스를 짜시면 되겠습니다. 여기에서 사용방법을 익히시면 충분히 하실 수 있습니다.

다음은 로그인까지 완료된 selenium driver가 있다고 가정하고 진행하겠습니다. 각 driver 함수 이후에 sleep 함수로 3초씩 대기해주는 이유는 인터넷에 따라 어느정도 시간이 걸릴 수 있기 때문입니다.

우선 url만으로 selenium으로 노션 페이지를 html로 export하는 함수를 만들겠습니다.

  • download 함수 소스 보기
    def download(url):
    	# 해당 페이지로 이동
    	driver.get(url)
    
    	# 설정에서 export 버튼 클릭
    	driver.find_element_by_xpath('//*[@id="notion-app"]/div/div[1]/div[2]/div[1]/div[1]/div/div[3]/div[4]').click()
    	sleep(3)
    	driver.find_element_by_xpath('//*[@id="notion-app"]/div/div[2]/div[2]/div/div[2]/div[2]/div/div/div/div/div/div[1]/div[6]/div[2]/div').click()
    	sleep(3)
    
    	# 내보내기 유형을 HTML으로 변경
    	driver.find_element_by_xpath('//*[@id="notion-app"]/div/div[2]/div[2]/div/div[2]/div/div[1]/div[2]').click()
    	sleep(3)
    	self.driver.find_element_by_xpath('//*[@id="notion-app"]/div/div[2]/div[3]/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div').click()
    	sleep(3)
    
    	# 내보내기 버튼 클릭(다운로드 완료)
    	driver.find_element_by_xpath('//*[@id="notion-app"]/div/div[2]/div[2]/div/div[2]/div/div[3]/div[2]').click()
    	sleep(10)

마지막으로 위에서 작성한 함수들을 활용해서 최종 소스를 확인하겠습니다.

# 발행할 pages 가져오기 
pages = get_pages_readyToPost('테이블을 포함하는 노션 페이지 url')

for page in pages:
	# notion page url 가져오기
	url = get_url(page.id, page.title)

	# 페이지 다운로드 하기
	downlaod(url)

위의 코드를 사용하면 selenium의 크롬 브라우저에서 기본으로 설정되어 있는 경로로 html 파일이 다운로드 됩니다. 이미지를 포함하는 페이지의 경우에는 zip 압축 폴더로, 아닌 경우는 단일 html 파일로 저장이 됩니다.

이제 이 다운로드 된 html 파일들을 읽어와 원하는 형태로 parsing하고 tistory api로 업로드 하면 됩니다.

💡 정리

여기까지 오느라 고생이 많으셨습니다. 지금까지 총 7개의 게시물을 작성해서 알려드린 방법 이외에도 자잘하게 처리해야 하는 게 정말 많은데요... 너무 사소하거나 어려운 것은 아니기 때문에 직접 다루진 않았습니다. (다운로드 경로 설정, zip파일 압축 해제하고 자동 parsing 등등) python을 할 줄 아신다면 큰 그림만 보시고 직접 소스를 짜보는 것도 좋은 경험이 될 것 같습니다. 👍

다만 한 가지 알려드리지 않은 중요한 방법이 있는데, 이미지들을 처리하는 방법입니다.

노션 페이지에서 이미지를 업로드하는 방법은 2가지 인데요, 첫 번째는 이미 인터넷에 있는 이미지의 주소를 가져오는 방법, 2번째는 로컬에서 이미지를 업로드한 경우입니다. 전자는 굳이 손대지 않아도 tistory 게시글에서 잘 업로드 되지만, 후자는 따로 처리를 해주어야 합니다. 이건 다소 복잡해서 코드 대신 방법만 소개해 드리겠습니다.

보통 이미지를 포함하는 페이지는 다운로드하면 zip 압축파일인데 이를 압축해제하면 html파일과 이미지 파일이 같이 있습니다. html을 parsing할 때 img 태그를 찾아서 같은 경로에 있는 이미지 파일을 python(pillow, opencv 등)으로 열고 base64로 인코딩하여 img태그 src attribute에 직접 넣어줍니다...(말로 하니 어렵네요😭)

지금까지 notion에서 tistory로 자동 업로드하는 방법을 알아 보았는데요, 자세한 방법에 대한 소개는 이 글을 마지막으로 정리하려고 합니다. 곧 소스를 정리해서 github에 업로드할 예정입니다. 사용하실 분들은 자신들의 상황에 맞게 사용하시면 되겠습니다. 😄😄


이 페이지는 Notion에서 작성되어, 자동으로 업로드 되었습니다.

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday