ํ๊ต ๊ณต์ง์ฌํญ ๋ด ๊ฐ๋ฐ๊ธฐ
๋ณตํ์ด ํ ๋ฌ ๋จ์ง ๋จ์์ ๋์๋ค. ์ฌ์ฌ ํ๊ต๋ก ๋์๊ฐ ์ค๋น๋ฅผ ํ๋ค๋ณด๋ ํ๊ต ํํ์ด์ง๋ฅผ ๊ณ์ ๋ค์ด๊ฐ์ผ ํ๋ค. ์๊ฐ์ ์ฒญ ์ผ์ ์ด๋ฉฐ, ์ฅํ๊ธ ์ ์ฒญ ๊ธฐ๊ฐ ๋ฑ์ ๊ณต์ง์ฌํญ์ ๋ณด๋ ค๋ฉด ์ด์ฉ ์ ์์๋ค. ์ด ๊ณผ์ ์ด ์๊ฐ๋ณด๋ค ๊ท์ฐฎ์๋ค. (๊ณต์ง์ฌํญ์ด ์ธ์ ์ฌ๋ผ์ฌ์ง ๋ชจ๋ฅด๋) ๊ทธ๋์ ๊ณต์ง์ฌํญ์ด ์ฌ๋ผ์ค๋ฉด ์๋ ค์ฃผ๋ ๋ด
์ ๋ง๋ค๊ธฐ๋ก ํ๋ค.
์ด ๊ธ์ ๊ธฐ์ด๋ก ๋ง๋ค์๋ค. ์ข์ ์๋ฃ ๊ฐ์ฌํฉ๋๋ค๐
โ์๊ฐํ๊ธฐ
์ฒ์์ ์์ฃผ ๋จ์ํ๊ฒ ์๊ฐํ๋ค. ์ฐ๋ฆฌ ํ๊ต ํํ์ด์ง๋ ๋ฉ์ธ์์ ์์ ฏ์ผ๋ก ๋๋ต ์ด ๊ฐ ๋จ์ง์ ๊ณต์ง์ฌํญ์ ์๋ ค์ค๋ค. ์ด๊ฑธ ํฌ๋กค๋งํ๋ฉด ๋์ง ์์๊น?
๊ทธ๋์ ์ฒ์ ๋ง๋ค ๋๋ ๋ฉ์ธ์ ์๋ ์์ ฏ์ ํฌ๋กค๋งํ๋ค. ๋ค ๋ง๋ค๊ณ ๋๋ ๋ฌธ์ ์ ๋ด์ฐฉํ๋ค. ์์ ฏ์ ์ผ์ชฝ ์๋จ์ ๊ฒ์ํ ์ด๋ฆ์ด ์ถ๋ ฅ๋๋ ํํ์๋๋ฐ ์ค์ ๊ฒ์ํ ์ด๋ฆ๊ณผ ๋งค์นํ์ง ์์๋ค…. (๋ฒ๊ทธ๋ผ๊ณ ์๊ฐํ๋ค.) ๊ทธ๋ฆฌ๊ณ ๋ด
์ ํ์ฅ์ฑ์ ๊ณ ๋ คํด์ ์์ ฏ ํฌ๋กค๋ง์์ ๊ฒ์ํ๋ณ ํฌ๋กค๋ง์ผ๋ก ๋ฐฉํฅ์ ํ์๋ค.
๐๊ด์ฐฐ
์ฐ๋ฆฌํ๊ต ๊ฒ์ํ URL
์ ์๋์ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
https://www.ut.ac.kr/cop/bbs/BBSMSTR_๊ฒ์ํ๋ฒํธ/selectBoardList.do
๊ณต์ง์ฌํญ์ ํ ๊ฐ์ ๊ฒ์ํ์์๋ง ์ฌ๋ผ์ค๋ ๊ฒ ์๋๊ณ , ๋ถ๋ฅ์ ๋ฐ๋ผ ์ ์ฉ ๊ฒ์ํ์ด ์๋ค.(์ฅํ์๋ด, ํ์ฌ์๋ด ๋ฑ)
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌํ๊ต ๊ฒ์๊ธ์ URL
์ ๋ค์๊ณผ ๊ฐ๋ค.
https://www.ut.ac.kr/cop/bbs/BBSMSTR_๊ฒ์ํ๋ฒํธ/selectBoardArticle.do?nttId=๊ฒ์๊ธ๋ฒํธ
์ ๋ฆฌํ์๋ฉด ํฌ๋กค๋ง์ ํ๊ธฐ ์ํด์๋ ๊ฒ์ํ๋ฒํธ์ ๊ฒ์๊ธ ๋ฒํธ๊ฐ ํ์ํ๋ค๋ ๊ฑธ ์ ์ ์๋ค.
๐๋ฐ์ดํฐ๋ฒ ์ด์ค
์ ๊ธ์ด ์๋์ง์ ์ฌ๋ถ๋ฅผ ์๋ ค๋ฉด ๊ธฐ์กด์ ๊ธ๊ณผ ๋น๊ต๋ฅผ ํด์ผํ๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ๊ธฐ์กด์ ๊ธ์ ์ ์ฅํ ํ์๊ฐ ์๋ค.
๋งํฌ์์๋ ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ Django
์ ์ ์ฅํ๋ค. ๊ทธ๋์ ๋๋ ๋น์ทํ๊ฒ Django
์ heroku
๋ฅผ ์ด์ฉํด์ ๊ตฌ์ฑํ๋ ค ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ ๋ง๋ค๋ค๋ณด๋ ์ต์ํ์ง ์์์ ๋ถํธํ๋ค. ๊ทธ๋์ Mysql
์ ์ธ๊นํ๋ค๊ฐ... PostgreSQL
์ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์ ์ด๋ ๊ฒ ๋์๋์ง๋ ๋๋ ๋ชจ๋ฅด๊ฒ ๋ค.
knut_bbs
: ๊ฒ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ
์ด๋ธ
Column | Type | Collation | Nullable | Default |
---|---|---|---|---|
pk_id | integer | not null | nextval('knut_bbs_pk_id_seq'::regclass) | |
title | character varying(100) | not null | ||
category | character varying(100) | |||
bbs_id | character varying(200) | not null |
pk_id
: ๊ธฐ๋ณธํคtitle
: ๊ฒ์ํ ์ด๋ฆ(ex. ํ์ฌ์๋ด)category
: ๊ฒ์ํ์ด ์ํ ์์ ์นดํ
๊ณ ๋ฆฌ์ ์ด๋ฆ(ex. ํ์ฌ์ ๋ณด)bbs_id
: ๊ฒ์ํ ๋ฒํธ
๊ธฐ๋ณธํค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ ๊ฒ์ํ ๋ฒํธ๋ฅผ ๊ธฐ๋ณธํค๋ก ์จ๋ ๊ด์ฐฎ์์ ๊ฑฐ ๊ฐ๋ค.
knut_article
: ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ
์ด๋ธ
Column | Type | Collation | Nullable | Default |
---|---|---|---|---|
pk_id | integer | not null | nextval('knut_article_pk_id_seq'::regclass) | |
bbs_title | character varying(100) | |||
title | character varying(300) | not null | ||
link | character varying(300) | not null |
pk_id
: ๊ธฐ๋ณธํคbbs_title
: ๊ฒ์ํ ์ด๋ฆ(ex. ํ์ฌ์๋ด) knut_bbs
์ title
์ ์ธ๋ํค๋ก ์ง์ ํด๋์๋ค.title
: ๊ฒ์๊ธ ์ ๋ชฉlink
: ๊ฒ์๊ธ ๋งํฌ
๋ค์๋ณด๋ ํ
์ด๋ธ์ ์๋ชป ๋ง๋ ๊ฑฐ ๊ฐ๋ค. link
๋์ ๊ฒ์๊ธ ๋ฒํธ๋ฅผ ์ ์ฅํ๋๊ฒ ๋ง๋ ๊ฑฐ ๊ฐ๊ณ , bbs_title
์ ๊ฒ์ํ ์ด๋ฆ์ด ์๋๋ผ bbs_id
๋ฅผ ์ ์ฅํ์ด์ผ ํ๋๋ฐ…. ๋์ค์ ๊ณ ์ณ์ผ๊ฒ ๋ค. ๐๐๐
๐ฉ๐ป๊ฐ๋ฐ
ํ๋ก๊ทธ๋จ์ ๋์ ์์๋ฅผ ์ ์ด๋ดค๋ค.
knut_bbs
๋ก๋ถํฐ category๊ฐ ๊ณต์ง์ฌํญ, ํ์ฌ์ ๋ณด์ธ ๊ฒ์ํ ์ด๋ฆ๊ณผ ๊ฒ์ํ ๋ฒํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.- 1์์ ๊ฐ์ ธ์จ ๊ฒ์ํ์ ์ฒซํ์ด์ง๋ฅผ ํฌ๋กค๋งํ๋ค.
- ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค๋ณต๋ ๊ฒ์๊ธ์ด ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ ํ ํ ๋ ๊ทธ๋จ ์ฑ๋๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค.
๋๋ ๋ฉ์ธ์ผ๋ก ํ์ด์ดํญ์ค๋ฅผ ์ฌ์ฉํ๊ณ ํฌ๋กฌ์ ๊ฑฐ์ ์ฐ์ง ์๋๋ฐ, ํฌ๋กค๋ง์ ์ํด CSS ์ ํ์
๋ฅผ ๊ฐ์ ธ์ค๋ฉด์ ๋ธ๋ผ์ฐ์ ์ ์ฐจ์ด์ (?)์ ๋๊ผ๋ค. ๊ฐ์ ์์ดํ
์ ๊ฐ์ ธ์จ ๊ฑด๋ฐ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋๋ค.
์๋ฅผ ๋ค๊ธฐ ์ํด ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ๋ค์ด๋ฒ์ ๋ก๊ณ ๋ฅผ ํด๋ฆญํด์ XPath
๋ฅผ ๊ฐ์ ธ์๋ดค๋ค.
ํฌ๋กฌ
//*[@id="PM_ID_ct"]/div[1]/div[1]/div/div[1]/h1/a/span
ํ์ด์ดํญ์ค
/html/body/div[3]/div[1]/div[1]/div/div[1]/h1/a/span
๋ํ ์ผ์ด ๋ค๋ฅด๋ค๊ณ ํด์ผํ ๊น? ์ค์ ๋ก ์ฐ๊ธฐ์ ํฌ๋กฌ์ด ๋ ์ข์๋ค. ํ์ด์ดํญ์ค๋ก ๊ธ์ด์ค๋๊น ์ ์ฉ์ด ์๋๋ค…. ๊ฐ๋ฐํ ๋ ํฌ๋กฌ์ ์จ์ผํ๋ค๋ ๊ฑธ ๋ค์๊ธ ๊นจ๋ฌ์๋ค.
๋๊ด์ ๋ถ๋ชํ๊ฑด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ๋ถ์ด์๋๋ฐ, ์ฝ์ง ํ ๋ฒ ๊ฑฐํ๊ฒ ํ๋ค.
def latest_notice(bbs_title):
latest_query = 'select title from knut_article where bbs_title = \'%s\' LIMIT 1;' % bbs_title
cur.execute(latest_query)
if cur.fetchall is not None:
latest_result = cur.fetchall().pop()[0]
return latest_result
else:
return None
์ฟผ๋ฆฌ๋ฌธ์ด ๋ฌธ์ ๋ผ๊ธฐ๋ณด๋ค๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์ ๋๋ก ๋ค๋ฃจ์ง ๋ชปํด์ ์ค๋ฅ๊ฐ ์๊ฒผ๋ค. ํ
์คํธ ์ค์ด๋ ๋น์ฐํ ์์ฌ์๋ ๋ฐ์ดํฐ๊ฐ ์์๊ณ ๊ทธ๋์ ๊ฒฐ๊ณผ๊ฐ์ด ์๋ฌด๊ฒ๋ ์๋๋ฐ ๊ฐ์ ๋ก pop()[0]
๋ฅผ ํ๋ ์ค๋ฅ๊ฐ ์๊ธธ ์ ๋ฐ์.
๊ทธ๋์ ๋ฐ๊ฟจ๋ค.
def getArticle(article_title):
search_query = 'select count(title) from knut_article where title = \'%s\';' % article_title
cur.execute(search_query)
result = cur.fetchone()[0]
if result:
return False
else:
return True
๊ฒฐ๊ณผ๊ฐ์ด 1์ด๋ฉด ๋์ผํ ์ ๋ชฉ์ ๊ฒ์๊ธ์ด ์๋ ๊ฑฐ๋๊น False
๋ฅผ ๋ฐํํ๊ณ , 0์ด๋ฉด True
๋ฅผ ๋ฐํํ๊ฒ ๋ฐ๊ฟจ๋ค.
๊ฒ์๊ธ ์ ๋ชฉ์ด ์๋๋ผ ๊ฒ์๊ธ ๋ฒํธ๋ก ํ ๊ฑธํ๋ ์์ฌ์์ด ๋จ๋๋ค.
์ ์ฒด ์ฝ๋: Github
๐ก์๋ฒ & ๐ฅ๏ธ๊ฐ๋ฐํ๊ฒฝ
heroku
๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ ๊ฒ๋ Django
๋๋ฌธ์ด์๋๋ฐ Django
๋ฅผ ์ฐ์ง ์๊ฒ ๋์์ผ๋ ๊ตณ์ด ์ ์จ๋ ๋๊ฒ ๋ค ์ถ์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด? ์นด๋ ๋ฑ๋ก์ ํด์ผํ๋ ๋ฐ ํ๊ธฐ ์ซ์๋ค. ๊ฒฐ๊ตญ ์ง์์ ๋๊ณ ์๋ ์๋ฒ๋ฅผ ๋๋ฆฌ๊ธฐ๋ก ํ๋ค.
์๋ฒ ์ด์์ฒด์ ๋ Ubuntu 18.04.3 LTS
๋ฅผ ์ค์นํ๋ค. ํฌ๋กค๋ง+๋ด
ํ๋ก๊ทธ๋จ์ cron
์ ์ด์ฉํ์ฌ 1๋ถ๋ง๋ค ์คํ๋๋ค.
๊ฐ๋ฐ์ Windows 10 + PyCharm Professional
ํ๊ฒฝ์์ ํ๊ณ ์๋ค. git
์ผ๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ๊ณ github
๋ฅผ ์ด์ฉํด ์๋ฒ์ ํ๋ก์ ํธ๋ฅผ ๊ณต์ ํ๊ณ ์๋ค.
๋งค๋ฒ git pull origin master
๋ฅผ ์น๊ธฐ ๊ท์ฐฎ์์ ์ด๊ฒ๋ง์ ๋ cron
์ผ๋ก 10๋ถ๋ง๋ค ์คํ๋๊ฒ ํด๋จ๋ค.
๐์์ฑ!
ํผ์ ์ฐ๋ ค๊ณ ๋ง๋ ๊ฑฐ์์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ์ฐ๋ฉด ์ข์ ๊ฑฐ ๊ฐ์์ ํ์ด์ค๋ถ ํ์ด์ง์ ํ๋ณด๊ธ์ ๋จ๊ฒผ๋ค. ๋์ ๋ด
์ ์ ์ธํ๋ฉด 35๋ช
์ด ์ฐธ์ฌํ๊ณ ์๋ค. ๋ด๊ฐ ๋ง๋ ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ๋ค๋ฅธ ์ฌ๋์ด ์ฐ๋ ๊ฑด ์ฒ์์ด๋ค. ๋งค์ฐ ๋ฟ๋ฏ!
๐ค์์ผ๋ก์ ๊ณํ & ๐ถํ๊ธฐ
์ผ๋จ ์ฝ๋ ๋ฆฌํฉํ ๋ง
์ ํด์ผํ ๊ฑฐ ๊ฐ๋ค. ํ์ด์ฌ์ค๋ฝ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ ์๋ ค์ฃผ๋ฉด ์ข๊ฒ ๋ค.
knut_article
์ ํ
์ด๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ด๋ ๊ทธ์ ๋ฐ๋ฅธ ํจ์ ์ฟผ๋ฆฌ๋ฌธ ๋ณ๊ฒฝ์ ํ ์์ ์ด๊ณ , ๋๋๊ณ ๋๋ฉด ์ฌ์ฉ์๋ณ ํ๊ณผ ๊ฒ์ํ ๊ณต์ง์ฌํญ ์๋ฆผ ๊ธฐ๋ฅ์ ๋ง๋ค ์์ !
์ง๊ธ์ ๊ตํต๋ ์๋ฆฌ๋ฏธ
๋ ํ
๋ ๊ทธ๋จ ์ฑ๋์ ์ด์ฉํด์ ๋ด
์ด ์ฑ๋๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ๋ณ ์๋ฆผ์ ์ฑ๋์ด ์๋๋ผ ๋ด
์ด ๊ฐ์ธ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ํํ๋ผ์ API
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ ๊ณต๋ถํด์ผํ ๊ฑฐ ๊ฐ๋ค.
๋ณ ๊ฑฐ ์๋ ๊ฐ๋ฐ๊ธฐ๋ฅผ ๊ฑฐ์ฐฝํ๊ฒ ์์ฑํ๊ณ ๋๋ ๋ง๋ ํ๋ก๊ทธ๋จ๋ณด๋ค ๋ ๊ธธ๋ค….
๋๋ Java
๋ฅผ ๋ ์ข์ํ์ง๋ง, Python
์ด ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์๋ค๋ ๊ฑด ๋ถ์ ํ ์ ์๋ค. ์๋ฌดํผ, ๊ฐ๋ง์ ์ฌ๋ฐ๋ ๊ฑฐ ๋ง๋ค์ด์ ์ข์๋ค.
๊ทธ๋์ ๋ ์กธ์ ์ํ์ ๋ญํ์ง….
+ 2021๋ 8์ 2์ผ ์ฑ๋ ์ด์ ์ข ๋ฃ
์ด๋ฏธ ์กธ์ ์ ํ์ง๋ง, ์ ์ง ๋ณด์๊ฐ ํ์ํ์ง ์์ ๊ณ์ ์ด์ ์ค์ด์๋ค. ๊ทธ๋ฐ๋ฐ ์ค๋ ํ๋ก๊ทธ๋จ์ ๊ณ ์ณ์ผ ํ ์ํฉ์ด ์๊ณ , ์ด๋ฏธ ์กธ์ ๋ ํ ๋ง๋น์ ๋ ์ ์งํ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ง ์์ ์ฑ๋์ ์ญ์ ํ๋ค. ๋ง์ง๋ง ์ธ์์ ๋์ ๋ด์ ์ ์ธํ๊ณ 95๋ช ์ด์๋ค. ์๋ ๐
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote