๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ
- ๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ ๋ฐ ๊นํ๋ธ
๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ๋ ์๋์ง๋งโฆ
- N2T Winform (์ง๊ธ์ ์ ๋๋ ๋ฏ. ํ์ง๋ง ์ค๋ช ์ด ์ ๋์ด ์์) - ๋ ธ์ API๋ ๋ฑ๋กํ์ง ์์๋ ๋จ
์์ ํญ๋ชฉ
requirements.txt & client.py
requirements.txt
beautifulsoup4 requests selenium webdriver_manager tqdm lxml git+https://github.com/gaonheum/notion-py.git <- ๋ด ๊นํ๋ธ ์ฃผ๋ก์ ์์ ๋จ
# webdriver-manager ๊ด๋ จ cmd_mapping = { KeyError: 'google-chrome'...} ์๋ฌ์ ๊ฒฝ์ฐ pip list ๋ฅผ ํตํด webdriver-manager ๋ฒ์ ์ด 3.8.0์ด๋ฉด ์ง์ฐ๊ณ 3.7.1๋ก ์ฌ์ค์นโ 3.8 ๋ฒ์ ๋ ์ ์ ์๋ ํ์ธ ํจ
โ ๊ตณ์ด zip ํ์ผ์ ๋ฐ์์ cmd ์ฐฝ์ ์ฐ ํ python setup.py install์ ์ ๋ ฅํด ์คํํ์ง ์์๋ ๋จ.
notion -> client.py
- notion-py๋ฅผ ๋ด ๊นํ๋ธ๋ก ํฌํฌํ์ฌ ์์ ํ ์ด์
- setup.py ํธํ์ฑ ๋ฌธ์
- ๋ณ๊ฒฝ ์
with open("README.md", "r") as fh: long_description = fh.read()
- ๋ณ๊ฒฝ ํ
with open("README.md", "r", encoding='utf-8') as fh: long_description = fh.read()
- ๋ณ๊ฒฝ ์
- โmethod_whitelistโ๊ฐ deprecated ๋จ
- ๋ณ๊ฒฝ ์
def create_session(client_specified_retry=None): """ retry on 502 """ session = Session() if client_specified_retry: retry = client_specified_retry else: retry = Retry( 5, backoff_factor=0.3, status_forcelist=(502, 503, 504), # CAUTION: adding 'POST' to this list which is not technically idempotent method_whitelist=( "POST", "HEAD", "TRACE", "GET", "PUT", "OPTIONS", "DELETE", ), ) adapter = HTTPAdapter(max_retries=retry) session.mount("https://", adapter) return session
- ๋ณ๊ฒฝ ํ
def create_session(client_specified_retry=None): """ retry on 502 """ session = Session() if client_specified_retry: retry = client_specified_retry else: retry = Retry( 5, backoff_factor=0.3, status_forcelist=(502, 503, 504), # CAUTION: adding 'POST' to this list which is not technically idempotent allowed_methods=( "POST", "HEAD", "TRACE", "GET", "PUT", "OPTIONS", "DELETE", ), ) adapter = HTTPAdapter(max_retries=retry) session.mount("https://", adapter) return session
- ๋ณ๊ฒฝ ์
- setup.py ํธํ์ฑ ๋ฌธ์
NotionClient.py
- 17 Line: token_v2 โ notion_token ์ผ๋ก ๋ณ๊ฒฝ
- ๋ณ๊ฒฝ ์
raise ValueError('[Error] notion token๊ฐ์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋ค์ ํ์ธ ํด ์ฃผ์ธ์. [{}]'.format(token_v2))
- ๋ณ๊ฒฝ ํ
raise ValueError('[Error] notion token๊ฐ์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋ค์ ํ์ธ ํด ์ฃผ์ธ์. [{}]'.format(notion_token))
- ๋ณ๊ฒฝ ์
- 17 Line: token_v2 โ notion_token ์ผ๋ก ๋ณ๊ฒฝ
parse.py
ํ ๊ธ ์ ์ด์ ํฌ์คํ ๊ธฐ๋ฅ ์ถ๊ฐ
- 79 Line ์ถ๊ฐ
# ํ ๊ธ ๋ซ์ ์ฑ๋ก ํฌ์คํ details = soup.find_all('details') for detail in enumerate(details): l_detail = list(detail) del l_detail[1]['open']
ํ๊ทธ ๋ณํ
- 33Line ์ถ๊ฐ: ํจ์ ์์ฑ
def changeTag(soup, tagName, changeTagName): while True: tag = soup.find(tagName) if not tag: break tag.name = changeTagName
- 87Line (# ์ ๋ชฉ ์ ๊ฑฐ ์ดํ) ์ถ๊ฐ: ํจ์ ์คํ
# h3 -> h4, h2 -> h3, h1 -> h2๋ก ํ๊ทธ ๋ณ๊ฒฝ changeTag(article, 'h3', 'h4') changeTag(article, 'h2', 'h3') changeTag(article, 'h1', 'h2')
- 79 Line ์ถ๊ฐ
SeleniumClient.py
- 66 Line: ์ถ๊ฐ โ ๋๋ ์ด๋ฅผ 3์ด์์ 10์ด๋ก ๋ง๋ค์ด 2์ฐจ ์ธ์ฆ์ ์ํ ์ฌ์ ์๊ฐ ํ๋ณด
# 2์ฐจ ์ธ์ฆ์ ์ํด 7์ด ์ ๋ ๋๋ ์ด๋ฅผ ์ถ๊ฐ๋ก ์ค sleep(7)
- 41Line: try๋ฌธ๊ณผ except๋ฌธ ์ฝ๋ ๊ตํ
โ ์๋ ์ฝ๋๋๋ก ์คํํ ๊ฒฝ์ฐ, ํฐ์คํ ๋ฆฌ ๋ก๊ทธ์ธ์ ๋จผ์ ๊ฒ์ฆํ๊ธฐ ๋๋ฌธ์ ์ด์ฐจํผ ์นด์นด์ค๋ก ํตํฉ์ด ๋ ์ง๊ธ ๊ตณ์ด try๋ฌธ์ ๋จผ์ ์คํํ ํ์๊ฐ ์๋ค๊ณ ํ๋จ ํจ.
- 66 Line: ์ถ๊ฐ โ ๋๋ ์ด๋ฅผ 3์ด์์ 10์ด๋ก ๋ง๋ค์ด 2์ฐจ ์ธ์ฆ์ ์ํ ์ฌ์ ์๊ฐ ํ๋ณด
์ฐธ๊ณ ์ฌํญ
- ํ๋ก๊ทธ๋จ ์คํ ์ ์นด์นด์คํก 2์ฐจ ์ธ์ฆ์ ํด์ ํด์ผ ๋ก๊ทธ์ธ์ด ๋จ
โ 2์ฐจ ์ธ์ฆ์ ํด๋๋ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ธ์ฆ ์๊ฐ ๋๋ฌธ์ ์ค๋ฅ ๋จ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์
โ 2์ฐจ ์ธ์ฆ์ ์ ์งํ๋ ค๋ฉด SeleniumClient.py ์ฐธ๊ณ
N2T์ ํจ๊ป ์ฌ์ฉ ํ ํฐ์คํ ๋ฆฌ ์คํจ ์ถ์ฒ
- ํฐ์คํ ๋ฆฌ ๋ฏธ๋ด์คํจ
์ฌ๋ฏธ์๋ ๊ธฐ๋ฅ
๋ ธ์ ๋ฐฉ๋ฌธ์ ์ ์นด์ดํธ
https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=๋ ธ์ ํ์ด์ง์ฃผ์
[ Uploaded by N2T ]
๋๊ธ