본문 바로가기

카테고리 없음

eBook 서비스, 리디북스 독서노트 200% 활용하기

리디북스를 애용하는 본인 핸드폰 화면

리디북스를 접하고 난 뒤의 2년

2017년 외국 생활을 하게 되면서, 처음 eBook이라는 개념에 대해 접하게 되었습니다.

전통적인 종이책에서 디지털화된 전자책으로 독서를 한다는 게, 그 당시에는 약간 생소하게 느껴졌습니다.

하지만 독서에 꽤나 푹 빠져 있던 시절이라, 외국 생활을 하면서 흥미로운 책들을 찾아 읽고 싶었습니다.

그래서 처음으로 eBook 리더기를 구입하게 되었습니다. 제가 처음 구매한 기기는 크레마 카르타 제품입니다.

크레마 카르타 플러스 (출처: Google)

 

처음에는 학교 전자 도서관을 이용해, 전자책을 대여해서 읽는 식이었습니다.

원래 책에 밑줄을 그으며 독서를 하는 습관이 있었기 때문에, 개인적으로 크레마 제품은 굉장히 불편했습니다.

뿐만 아니라, 에버노트와 연동되어 있어 제가 모은 전자책의 구절들을 옮기는 기능도 불만스러웠습니다.

문서로 옮겨지는 기능이 에러 때문에 동작하지 않거나, 옮겨지더라도 매우 조악한 수준이었기 때문입니다.

 

무엇보다도 도서관은 생각보다 전자책 데이터베이스가 풍부하지 않았고, 그 문제로 인해 저는 고민했습니다.

그리고 2019년 2월, 전자책 서비스인 리디북스를 본격적으로 사용하기 시작했습니다.

 

리디북스는 당시 국내에서 가장 많은 eBook을 서비스하는 것으로 유명했습니다. 그만큼 만족스러웠습니다.

실제로 저는 리디북스에서 내놓은 구독 서비스인 리디 셀렉트까지 함께 지금까지 이용하고 있습니다.

(사실, 리디 셀렉트에서 제공하는 책들 중에는 좋은 서적이 적다는 게 불만이기는 합니다.)

 

2년 동안 리디북스 내의 마이리디 탭에는 저의 독서노트들이 착실히 쌓였습니다.

하지만 제가 생각하기에는 여전히 해소되지 않는 부분이 있었습니다.

 

리디북스의 독서노트는 웹사이트 또는 앱에서 외부로 추출할 수 없다는 게 불만이었습니다.

 

저에게 독서노트는 책을 모두 읽고, 어느 날 갑자기 들춰봐야 할 순간에 빠르게 접근해야 할 저의 기록이었습니다.

그런데 젠장 맞을 리디북스는 2년 동안 절대 그런 부분은 해결해 주지 않았습니다.

독서노트가 필요할 때면, 다시 eBook을 열고 그 부분을 찾기 위해 시간을 들여야 했습니다.

 

그래서 직접 리디북스 독서노트를 워드 파일로 만들 수 있는 코드를 구현했습니다.

이 코드를 통해 에버노트의 웹 클리핑이나 긴 영역을 드래그하여 복사-붙여넣기를 하는 분들이 좀 더 수월하게 자신의 기록을 온전히 자신의 품에 가질 수 있기를 바랍니다.

 

 


리디북스 독서노트를 내 컴퓨터의 워드 파일로 

저는 웹 스크래핑 또는 웹 크롤링이라 불리는 기술을 파이썬 코드로 구현했습니다.

(처음 구현 당시의 파이썬 버전은 3.7.9 버전입니다.)

이를 위해 우선 필요한 라이브러리를 아래와 같이 준비했습니다.

WIndows 명령 프롬프트(CMD) 창을 이용한 라이브러리 설치

 

독서노트를 워드 파일로 옮기기 위해 필요한 라이브러리는 단 4가지입니다.

  1. selenium
  2. bs4
  3. json
  4. re

이 중에서 설치가 필요한 라이브러리는 Selenium과 BS4입니다. 아래와 pip 커맨드를 활용해 설치합니다.

pip install을 통해 필요한 파이썬 라이브러리 설치

여기에 설명을 조금 더 부연하자면, selenium 대신 requests 모듈을 사용할 수도 있습니다.

그렇게 하면 굳이 인터넷 브라우저 창을 띄우지 않고서 작업을 진행할 수 있습니다.

저도 초기에는 requests 모듈을 통해 독서노트를 추출하려고 했으나, 수동으로 쿠키값을 변경해줘야 하는 문제를 해결하지 못하여 selenium을 선택하게 되었습니다.

 

어찌 되었든 제가 사용하는 코드 에디터, Visual Studio Code를 켜고 파이썬 파일을 하나 생성하고 코딩을 시작합니다.

 

1. 리디북스 웹사이트 로그인

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from docx import Document
import json
import time
import re
# import os >> Webdriver 위치 확인을 위한 코드

DRIVER_PATH = r'Webdriver File 경로'
MY_RIDI_URL = 'https://ridibooks.com/account/login?return_url=https%3A%2F%2Fridibooks.com%2Faccount%2Fmyridi'

LOGIN_DATA = {
    'id': '사용자 ID',
    'pw': '비밀번호'
}

driver = webdriver.Chrome(DRIVER_PATH)

driver.get(MY_RIDI_URL)
time.sleep(3)

email = driver.find_element_by_id('login_id')
email.send_keys(LOGIN_DATA['id'])
password = driver.find_element_by_id('login_pw')
password.send_keys(LOGIN_DATA['pw'])
password.send_keys(Keys.RETURN)
time.sleep(3)

 

우선 라이브러리 임포트 부분입니다.

Selenium의 Webdriver와 Keys를 불러들입니다.

Webdriver는 크롬 웹드라이버를 이용하여 웹브라우저 창을 띄운 상태에서 리디북스에 접근하기 위해 사용합니다.

Keys는 리디북스 서비스에 로그인하기 위해 아이디와 비밀번호 값을 전달할 때 Enter 키를 입력하기 위해 사용합니다.

 

또한, BeautifulSoup을 불러들입니다.

BeautifulSoup은 크롬 브라우저 창에 나타난 책 표지, 책 제목 등의 데이터를 우리가 사용할 수 있게 만들어 줍니다.

 

docx 라이브러리는 파이썬으로 워드 파일을 작성할 때 사용합니다.

 

json과 re 라이브러리는 파이썬에 기본적으로 내장되어 있는 라이브러리이며,

json 형식으로 되어 있는 내 독서 노트 내용을 읽는 역할과 워드 파일을 저장할 때 특수 문자로 인한 오류를 방지하기 위해 정규표현식으로 검사하는 역할을 합니다.

 

 

Webdriver의 파일 위치와 로그인을 위한 정보를 준비합니다.

우선 Webdriver를 다운로드 받은 폴더를 켜줍니다. 그리고 아래와 같이 경로 입력 부분을 클릭하여 복사해줍니다.

크롬 웹드라이버(chromedriver) 위치 복사

 

그리고 위의 코드에 r'Webdriver File 경로'라고 되어 있는 부분의 값을 바꿔줍니다.

제 관점을 예를 들자면, r'D:\Codeit\side_project\chromedriver.exe' 과 같은 식입니다.

 

여기에 첨언하자면, Window에서 파일 경로를 사용할 때 \가 오류를 일으키는 경우가 많습니다.

이를 방지하기 위해, 경로 앞에 문자열을 있는 그대로 읽도록 r을 붙여주는 겁니다!

 

그리고 자신의 리디북스 계정과 비밀번호를 위 코드의 '사용자 ID', '비밀번호' 부분에 각각 입력합니다.

이후에 파이썬 파일을 실행하면 로그인한 뒤, 리디북스 홈으로 이동한 크롬 화면을 확인하실 수 있습니다.

 

 

2. 리디북스 독서노트 책장에서 저장할 독서노트 선택

SHELF_URL = 'https://ridibooks.com/reading-note/shelf'

driver.get(SHELF_URL)
time.sleep(3)

book_list = driver.find_elements_by_class_name('css-yey44c')
title_list = {i:book_list[i].text for i in range(len(book_list))}
print(title_list)

user_input = input('index를 고르세요')
title = title_list[int(user_input)]
driver.find_element_by_link_text(title).click()
book_id = driver.current_url.split('/')[-1]

 

이 부분은 내가 직접 워드 파일로 저장하고 싶은 책을 선택하는 단계입니다.

리디북스 사이트 내에 독서노트 책장 페이지로 이동하면 자신이 독서노트를 만든 책 목록이 아래와 같이 나타납니다.

리디북스 독서노트 책장

 

그리고 독서노트 책장의 책 제목들을 모두 파싱하여 딕셔너리 형태로 저장합니다.

(개발적인 부분은 어렵다면 넘기셔도 상관 없습니다.)

 

위의 코드까지 작성된 상태로 코드를 실행하면, 최종적으로 자신이 읽었던 책 제목을 아래처럼 터미널 화면에 띄웁니다.

그러면 이제 내가 저장하고 싶은 책의 키 값을 입력하면 됩니다.

독서노트 책장의 책 목록

저는 여기서 가장 최근에 읽고 있는 '스티브 잡스'라는 책을 선택하겠습니다.

0: '스티브 잡스' 로 나타나 있으니, 숫자 0을 입력한 뒤에 엔터 키를 눌러주면 됩니다.

 

 

3. 독서 노트 내용을 워드 파일로 최종 저장

READ_NOTE = 'https://reading-data-api.ridibooks.com/annotations/books/{0}?offset=0&order_by=timestamp'.format(book_id)

resp = driver.get(READ_NOTE)
time.sleep(3)
pre = driver.find_element_by_tag_name('pre').text
data = json.loads(pre)

note_list = []

for i in range(len(data['annotations'])):
    note_list.append(data['annotations'][i]['selected_text'])

document = Document()

document.add_heading(title, level=2)

for i in range(len(note_list)):
    document.add_paragraph(note_list[i] + '\n\n')

## title 내 특수문자 제거
# 파일명으로 쓸 수 없는 문자열 컴파일
p = re.compile(r'[\/:*?"<>|]+')
m = p.search(title)

if m is None:
    pass
else:
    title = title.replace(m.group(), '')

document.save('{0} notes.docx'.format(title))

 

이제 최종적으로 독서노트 내용을 전달하는 json 형식의 데이터를 브라우저에 띄우고, 워드 파일로 저장합니다.

코드 내적으로 중요한 곳은 두 부분 정도입니다.

 

우선 data = json.loads(pre) 줄입니다.

이 부분은 json 형식의 데이터를 브라우저 창에 띄웠을 때, 이를 data라는 변수에 저장하는 부분입니다.

json 형식의 데이터를 창에 띄웠을 때에는, 단순하게 html 데이터를 받아오려고 시도해도 아무 것도 반환하지 않습니다.

기존의 크롤링 방식과 달리, 위의 코드대로 작성해야 합니다.

 

다음은 p = re.compile(r'[\/:*?"<>|]+') 줄입니다.

처음에 라이브러리를 임포트할 때, 언급한 것처럼 파일명으로 쓸 수 없는 문자열을 거르기 위한 부분입니다.

이건 컴퓨터 파일명 작성 규칙에서 허용되지 않는 문자열이 1번 이상 나타났는지 파악하는 정규 표현식입니다.

 

그리고 바로 아래의 m = p.search(title) 을 통해 리디북스에서 제공하는 책 제목에 특수 문자가 들어간 경우에 특수 문자를 찾아내고, 오류가 일어나지 않게 빈 칸으로 대체하는 겁니다.

 

위의 코드까지 작성을 완료한 뒤, 전체 코드를 실행하면 기다리던 워드 파일을 컴퓨터 화면으로 확인하실 수 있습니다.

그리고 파일을 켜보면, 아래와 같이 자신이 밑줄을 긋거나 하이라이팅 했던 구절들을 모두 모아서 확인하실 수 있습니다.

리디북스 독서노트를 저장한 워드 문서 파일

 

 

 


전자책에 남긴 자신의 기록을 언제나 편하게 들춰 보자

코드를 조목조목 뜯어보지는 않았지만, 웹드라이버 파일의 경로 설정과 리디북스 계정 정보만 잘 바꿔주면 위의 코드는 문제 없이 실행될 겁니다.

 

저는 이를 통해 올해 읽은 책들 중에 특히 마음에 들었던 책들의 리디북스 독서노트를 파일로 만들었습니다.

그래서 다시 들여다 보고 싶은 책이 있을 때에는, 파일을 열어 원하는 키워드를 검색하여 독서노트를 훑습니다.

개인적으로는 이를 통해 과거에 읽었던 책 속의 맥락을 쉽고 빠르게 되살릴 수 있어 매우 만족합니다.

 

추후에는 조금 더 자동화를 위한 코드 수정을 진행할 예정입니다.

또한 간단히 실행 프로그램으로 패키징하여, 코드 에디터도 필요 없이 더욱 편하게 활용할 수 있도록 만들 계획입니다.

 

위 코드를 통해 리디북스 사용자 분들이 좀 더 편하게 독서노트를 온전히 자신의 것으로 만드시길 바랍니다.

그리고 독서노트 파일 저장과 관련하여 좋은 아이디어가 있다면, 제게 알려주시기 바랍니다.