๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ
๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ๋ ์๋์ง๋งโฆ
- N2T Winform (์ง๊ธ์ ์ ๋๋ ๋ฏ. ํ์ง๋ง ์ค๋ช
์ด ์ ๋์ด ์์)
- ๋
ธ์
API๋ ๋ฑ๋กํ์ง ์์๋ ๋จ๋ ธ์ ๊ธ์ ํฐ์คํ ๋ฆฌ๋ก ์๋ ์ ๋ก๋ - Notion to Tistory (N2TWinform)๐ก 2022-09-22 (๋ชฉ) - ํฐ์คํ ๋ฆฌ ์นด์นด์ค ๋ก๊ทธ์ธ์ HTML์ด ๋ณ๊ฒฝ๋์ด ๋ก๊ทธ์ธ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์์ ๋์์ต๋๋ค. N2TWinform_1.0.0.1.ziphttps://drive.google.com/file/d/1HCUCdP5l-PSCXyLr7iw9txfUuso4caVb/view?usp=sharing ์๋ก ํฐ์คํ ๋ฆฌ(Tistory)๋ฅผ ์์ํ๋ฉด์ ์์์ ์ข ๋ ์ด์๊ณ ๊ฐํธํ๊ฒ ์์ฑํ์ฌ ์ ๋ก๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์์ง ์๊ฐํ๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด์ ๋ ์๊ฐ์ ๋ ธ์ (Notion)์ ์์ฑํ ๊ธ์ด ๊ทธ๋๋ก ํฐ์คํ ๋ฆฌ(Tistory)์ ์ ๋ก๋ํ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด์๋๋ฐ์. ํ์ฐฝ ๊ตฌ๊ธ๋ง์ ํตํด ๋ฐ๊ฒฌํ ๊ธ์ด ์์์ต๋๋ค. ํ์ด์ฌ์ผ๋ก ๊ตฌํํ ์์ค๋ฅผ ์คํ์์ค๋ก ๊ณต์ ํ ๊ธ์ด์๋๋ฐ์. ๋งฅ(Mac) OS์์ ๊ตฌํํ ์์ค์ฌ์..
https://joel-helloworld.tistory.com/65
์์ ํญ๋ชฉ
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']
ํ๊ทธ ๋ณํ
๐กNotion์ ํ๊ทธ: ์ ๋ชฉ1=h1, ์ ๋ชฉ2=h2, ์ ๋ชฉ3=h3Tistory์ ํ๊ทธ: ์ ๋ชฉ1=h2, ์ ๋ชฉ2=h3, ์ ๋ชฉ3=h4
์ด๊ธฐ ๋๋ฌธ์ ํ๊ทธ๋ฅผ ๋ณํํด์ค ํ์๊ฐ ์์
- 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://sangminem.tistory.com/506
ํฐ์คํ ๋ฆฌ ๋ฏธ๋ด ์คํจ 2.7.3 ์ ๋ฐ์ดํธ - ์ด์ ๊ธ ๋ค์ ๊ธ ํ์ ๊ธฐ์ค ๋ณ๊ฒฝ์๋ ํ์ธ์. ์ด๋ฒ ๋ฒ์ ์ ํฐ์คํ ๋ฆฌ์์ ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฅ์ ์ฌ์ ๊ณต์ง ์์ด ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ธ, ๋ค์ ๊ธ ํ์ ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ์๋ํ์ง ์์์ ๋ด ๋๊ฒ ๋์์ต๋๋ค. ์ด์ ๊ธ, ๋ค์ ๊ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์๋ ๋ถ๋ค์ ํํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ผ์๊ธฐ ๋ฐ๋๋๋ค. ๋ชฉ์ฐจ ๊ฐ์ ์ฌํญ 1. ์ด์ ๊ธ, ๋ค์ ๊ธ ์ค๋ฅ๋ฅผ ์์ ํ์์ต๋๋ค. 2. ํ๋กํ ๋ชฉ์ฐจ๋ฅผ ๋ณธ๋ฌธ ๋ชฉ์ฐจ ์์น์ ๊ด๊ณ์์ด ๋ฐ๋ก ํ์ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์์ต๋๋ค. 3. ๊ธฐํ ์์ํ ๋ฌธ์ ์ ์ ๊ฐ์ ํ์์ต๋๋ค. ์์ธ ์ค๋ช ํ๋จ์ ๋์์ ๋๋ฆฌ๊ธฐ ์ํด ๊ฐ์ ๋ ๋ถ๋ถ์ ๋ํ ์ค๋ช ์ ๊ฐ๋จํ ํด๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ด์ ๊ธ ๋ค์ ๊ธ ์ค๋ฅ ์์ ํฐ์คํ ๋ฆฌ ๊ธฐ๋ณธ ํ๋ฌ๊ทธ์ธ '์นดํ ๊ณ ๋ฆฌ ๊ธ ๋ ๋ณด๊ธฐ'๋ฅผ ํ์ฉํ์ฌ ๋ง๋ ๊ธฐ๋ฅ์ธ๋ฐ ์ฌ์ ๊ณต์ง ์์ด ์์ ์ด ๋์ด ์ ์ ๋์ํ์ง ์์์ ๊ธด๊ธ ์์ ์ ํด ๋ณด์์ต๋๋ค. ์๋ ํ์ฌ ๋ณด..https://sangminem.tistory.com/836
๋ฏธ๋ด ์คํจ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ(FAQ)๋ฏธ๋ด ์คํจ ๊ฒ์๋ฌผ์ ๋๋ถ๋ถ ์ค๋ช ์ด ๋์ ์์ง๋ง ๋ด์ฉ์ด ๋ง์์ ์ฐพ๊ธฐ ์ด๋ ต๊ฑฐ๋ ๋นจ๋ฆฌ ํ์ด ๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ํด ์์ฑํ์์ต๋๋ค. ์ง์์ ์ผ๋ก ์ถ๊ฐํด ๋๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ชฉ์ฐจ ์ต์ข ์์ : 2022.02.23 ์ฌ์ด๋๋ฐ ๊ธฐ๋ฅ๋ค์ ์ด๋ป๊ฒ ์ค์ ํ๋์? ๊ธฐ๋ฅ ์์ฒด๋ฅผ ๋ฃ๊ณ ๋นผ๊ฑฐ๋ ์์น๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ ๊พธ๋ฏธ๊ธฐ > ์ฌ์ด๋๋ฐ์์ ํ ์ ์๋๋ก ๊ฐ์ ํ์ต๋๋ค. ์ถ๊ฐ ์ค์ ์ด ํ์ํ ๊ฒฝ์ฐ๋ ์คํจ ํธ์ง์์ ํ์ค ์ ์์ต๋๋ค. ํธํฐ ๋ด์ฉ์ ์ด๋๊น์ง ์์ ํ ์ ์๋์? ์ ๋ถ ์์ ํ์ ๋ ๋๊ณ html ์ฝ๋ ์ Mynem Skin x.x.x๋ง ์ ์งํด ์ฃผ์๋ฉด ๋ฉ๋๋ค. ๋คํฌ ๋ชจ๋์์ ๊ธ์ด ์ ์ ๋ณด์ฌ์! ๋ณธ๋ฌธ์ ์ด๋์ด ํฐํธ ์ปฌ๋ฌ๊ฐ ์ ์ฉ๋์ด ์์ด์ ๊ทธ๋ ์ต๋๋ค. ๊ธ์์์ ์ ํ์ง ์๊ฑฐ๋ ๋ฐ๊ณ ์ด๋์ด ๊ณณ์์ ๋ชจ๋ ์ ๋ณด์ด๋ ์์ผ๋ก ์ค์ ํ์ ์ผ ํ๋๋ฐ ๊ณ ..https://sangminem.tistory.com/579
์ฌ๋ฏธ์๋ ๊ธฐ๋ฅ
๋ ธ์ ๋ฐฉ๋ฌธ์ ์ ์นด์ดํธ
[Notion] ๋ ธ์ ์ ๋ฐฉ๋ฌธ์ ์ ์นด์ดํธํ๊ธฐ (๋ ธ์ ๊ฟํ)[Notion] ๋ ธ์ ์ ๋ฐฉ๋ฌธ์ ์ ์นด์ดํธํ๊ธฐ๊ฐ์์ฌ์ฉ๋ฐฉ๋ฒpage link ์์๋ด๊ธฐnotion์์ embedํ๊ธฐ์ฐธ๊ณ ์๋ฃ๊ฐ์์์ฆ์๋ ๋ ธ์ ์ ๊ฐ์ธ ๋ธ๋ก๊ทธ์ฒ๋ผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ๋ง๋ค. ๊ทธ๋ฌ๋ ํ ๋ธ๋ก๊ทธ์ ๋ฌ๋ฆฌ ๋ ธ์ ์๋ ๋ฐฉ๋ฌธ์ ๋ํ ํต๊ณ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๋๋ค. ์ด์ embed๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์์ฃผ ๊ฐ๋จํ๊ฒ ๋ฐฉ๋ฌธ์ ํ์๋ฅผ ์์๋ผ ์ ์๋ค. ์ฌ์ฉ๋ฐฉ๋ฒpage link ์์๋ด๊ธฐ์ํ๋ notion page์์ share ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋น page์ ๋งํฌ๊ฐ ๋์ค๋๋ฐ, copy link ๋ฒํผ์ ๋๋ฌ์ฃผ๋ฉด ๋งํฌ๊ฐ ๋ณต์ฌ๋๋ค.notion์์ embedํ๊ธฐ์์์ ๋ณต์ฌํ page ๋งํฌ๋ฅผ ์๋ ์ฃผ์์ [๋ ธ์ ํ์ด์ง ์ฃผ์] ๋ฅผ ์ง์ฐ๊ณ ํด๋น ์๋ฆฌ์ ๋ถ์ฌ๋ฃ๊ธฐํ์ฌ ๋ฐ๊ฟ์ค๋ค.๋ฐฉ๋ฌธ์ ์๋ฅผ ํ์ธํ ํ์ด์ง์์ /embed ๋ฅผ ์์ฑํ์ฌ [๋ ธ์ ํ์ด์ง ์ฃผ..https://minimin2.tistory.com/116
https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=๋ ธ์ ํ์ด์ง์ฃผ์
[ Uploaded by N2T ]
๋๊ธ