๐ค[์น์์ค] ์ผํ๊ฐ์ฌ AI์ ๊ธฐ๋งํ ์ถ์ฒ
[์น์์ค] ์ผํ๊ฐ์ฌ AI์ ๊ธฐ๋งํ ์ถ์ฒ
๋จธ์ ๋ฌ๋ ์ถ์ฒ ์์คํ ํ๋ก์ ํธ
๋ค์ด๋ฒ ์๋ฆฌ์ฆ์์ ํ๋งค์ค์ธ ์น์์ค ์ํ์ ์ํ์ ๋ณด๋ฅผ ํฌ๋กค๋งํ์ฌ ์ป์ ์ค๊ฑฐ๋ฆฌ๋ฅผ ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์น์์ค์ ์คํ ๋ฆฌ๋ฅผ ๋ฒกํฐ ์๋ฒ ๋ฉ์ ํตํด ์ฌ์ฉ์๊ฐ ์ ํธํ ์์ค์ ์ค๊ฑฐ๋ฆฌ์ ์ ์ฌ๋๊ฐ ๋์ ์ํ์ ์ถ์ฒํด์ฃผ๋ ์๋น์ค
ํ๋ก์ ํธ์ ๋ํ ๋์ ์ญํ โ โ๋ณด๋ฌ๊ฐ๊ธฐ๐โ
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
| ๋ก๊ทธ์ธ | ํ์๊ฐ์ | ๋ฉ์ธ ํ์ด์ง | ์ฅ๋ฅด๋ณ ์ํ ๋ฆฌ์คํธ |
![]() |
![]() |
![]() |
![]() |
| ๊ฒ์ ๊ฒฐ๊ณผ | ์ํ ์์ธ ํ์ด์ง | ๋ง์ด ํ์ด์ง | ๋์ ๋ฆฌ๋ทฐ ๋ชจ์๋ณด๊ธฐ |
ํ๋ก์ ํธ ๊ธฐ๊ฐ
2022-06-02 ~ 2022-06-13
์ฃผ์ ๊ธฐ๋ฅ
- Django ๋ด์ฅ ๋ชจ๋ธ์ ์ฌ์ฉํ ํ์๊ฐ์ /๋ก๊ทธ์ธ/๋ก๊ทธ์์ ๊ธฐ๋ฅ
- ๋ค์ด๋ฒ ์๋ฆฌ์ฆ์์ ํ๋งค์ค์ธ ์น์์ค ์ํ์ ์ํ์ ๋ณด๋ฅผ BeautifulSoup๊ณผ Selenium์ ์ด์ฉํ์ฌ ํฌ๋กค๋ง
- ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ด์ฉํด ์น์์ค์ ์คํ ๋ฆฌ๋ฅผ ๋ฒกํฐ ์๋ฒ ๋ฉ
- ์ฌ์ฉ์๊ฐ ์ข์ํ ์ํ์ ์ค๊ฑฐ๋ฆฌ์ ์ ์ฌ๋๊ฐ ๋์ ์ํ์ ์ถ์ฒ
- ๋ฑ๋ก๋ ์ ํธ์์ด ์๋ค๋ฉด ๋ณ์ ์ด ๋์ ์ํ๋ค์ ์ถ์ฒ
- ์ํ์ ๋ํ ๋ฆฌ๋ทฐ CRUD ๊ธฐ๋ฅ
- ๋ฆฌ๋ทฐ๋ฅผ ๋ถ์ํ์ฌ ๊ฐ์ฅ ๋ง์ ํค์๋ 5๊ฐ ํ์ (์ํ ์์ธ ํ์ด์ง)
- ์ข์ํ ์ํ์ ์คํ ๋ฆฌ ํค์๋ ๋น๋์ ์์ 10๊ฐ ํ์ (๋ง์ด ํ์ด์ง)
ํ๋ก์ ํธ ๊ธฐ๋ก
ํ ๊ตฌ์ฑ ๋ฐ ์ญํ
| ์ด๋ฆ | ์ญํ | ๊นํ๋ธ |
|---|---|---|
| ์ด์ ์ย ย ย ย | ์๋ฏผ์ฆ ๋ฐ๊ธ ํ์ด์ง, ์์ ํ์ด์ง(back), ๋ฐฉ ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋ฅ, ๋ฅ๋ฌ๋ย ย ย ย | ๐zeonga1102 |
| ๋ ธ์ | ๊ฒ์ํ ํ์ด์ง, ์์ ํ์ด์ง(front), ๋ก๊ณ ์ ์ | ๐minkkky |
| ์ดํ๊ฒฝ | ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ํ์ด์ง, AWS ๋ฐฐํฌ | ๐LULULALA2 |
| ๊น๋๊ทผ | ๋ง์ด ํ์ด์ง | ๐yinmsk |
- ๋ชจ๋ธ์ ์ - ํ ์ ์ฒด ์ฐธ์ฌ
์คํฌ ๋ฐ ์ฌ์ฉํด
Python, Django, BeautifulSoup, Selenium, Colab, MeCab, Doc2Vec
DB(ERD)

ํ๋ก์ ํธ์ ๋ํ ๋์ ์ญํ ๋ฐ ๊ฒฝํ
๋์ ์ญํ
-
์ํ ์์ธํ์ด์ง ์ ์
-
์ํ ๋ฆฌ๋ทฐ CRUD ๊ธฐ๋ฅ
-
๋ฉ์ธํ์ด์ง Today best top 20 ํฌ๋กค๋ง ๋ฐ ์ํ ํด๋ฆญ์ ๋ค์ด๋ฒ์ ํด๋น ์ํ ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ (๊ณผ์ ๋ณด๋ฌ๊ฐ๊ธฐ๐)
1. ๋ฉ์ธํ์ด์ง Today best top 20 ํฌ๋กค๋ง
import requests
from bs4 import BeautifulSoup
url = 'https://series.naver.com/novel/top100List.series?rankingTypeCode=DAILY&categoryCode=ALL'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
lis = soup.select('#content > div > ul > li')
li_list = []
for li in lis:
cover_line = li.select_one('a > img')
cover = cover_line['src']
title = cover_line['alt']
author = li.select_one('div.comic_cont > p.info > span:nth-child(4)').text
star = li.select_one('div.comic_cont > p.info > em.score_num').text
detail = li.select_one('div.comic_cont > p.info > span:nth-child(6)').text
dic = {'cover':cover, 'title':title, 'author':author, 'author':author, 'star':star, 'detail':detail}
li_list.append(dic)
print(li_list)
๐งจTroubleShooting
1. ํฌ๋กค๋งํ ํ์ด์ง๊ฐ ๋์ ํ์ด์ง์ฌ์ BeautifulSoup ์ฌ์ฉ ๋ถ๊ฐ
์ฒ์์ ํฌ๋กค๋ง์ ํ ๋ bs4๋ฅผ ์ด์ฉํด ์ ์ฒด ์ํ๋ชฉ๋ก์์ ๊ฐ ์ํ์ ์์ธํ์ด์ง๋ก ์ฐ๊ฒฐ๋๋ url์ ํฌ๋กค๋งํ๊ณ , ํฌ๋กค๋งํ url์ ๊ฐ๊ฐ ์ ์ํ์ฌ ์ํ๋ค์ ์์ธ์ ๋ณด๋ฅผ ํฌ๋กค๋งํด์๋ค. ๊ฐ ์ํ ์์ธํ์ด์ง์์ ์ํ์ ์ ์ฒด ์ค๊ฑฐ๋ฆฌ๋ <๋๋ณด๊ธฐ> ๋ฒํผ์ ๋๋ฌ์ผ๋ง ๋ณด์ด๋ ๋ฐฉ์์ด์ด์ ํฌ๋กค๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์ํ์ค๊ฑฐ๋ฆฌ๊ฐ ์ ๋ถ ์๋ ค์์๋ค. ๊ทธ๋์ ๋์ ํ์ด์ง์์๋ ์ฌ์ฉ๊ฐ๋ฅํ selenium ์ ๊ฐ์ด ์ฌ์ฉํ๋ค.๋๋ณด๊ธฐ>
(์ฝ๋ฉ : https://colab.research.google.com/drive/1olprD0sgSfZdq36o8ox0_lx8DLN1f7US?usp=sharing)
2. ๋ฆฌ๋ทฐ ์์ ํ ์ ์ฅ์ ๋๋ฅด๋ฉด โReviewModelโ object has no attribute โupdateโ ์๋ฌ๊ฐ ๋๋ ๋ฌธ์
์ค๋ฅ๋ฉ์ธ์ง๋ฅผ ๋ณด๊ณ ์ฒ์์ update ํจ์์์ ๋ฌธ์ ๊ฐ ์๋ ์ค ์์๋๋ฐ, origin_review ๋ก ๋ถ๋ฌ์ค๋ ๋์์ด ์๋ชป๋์๋ค๋ ๊ฒ์ ์์๋ค. get() ์ด ๊ฐ์ ธ์ค๋ ๊ฒ์ ํด๋นํ๋ ๊ฐ์ฒด ํ๋์ด๊ณ , filter()๋ ํด๋นํ๋ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ QuerySet์ ๊ฐ์ ธ์จ๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด์ origin_review ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ReviewModel.objects.get(id=review_id) ๋ฅผ ReviewModel.objects.filter(id=review_id) ๋ก ์์ ํ์๋ค.
# modify_review
@login_required
def modify_review(request, book_id, review_id):
origin_review = ReviewModel.objects.filter(id=review_id)
if request.method == "POST":
star = int(request.POST.get('rating', 0))
review = request.POST.get('review', '')
date = timezone.now()
origin_review.update(star=star, desc=review, date=date)
return redirect('book_info', book_id)
ํ๊ณ
ํฌ๋กค๋ง์ ํ๋ ๋ถ๋ถ์์ ์๊ฐ๋ณด๋ค ๋ง์ ์๊ฐ์ ์ก์๋จน์๋ค. ๊น๋ํ๊ฒ ํฌ๋กค๋ง์ ํ๊ธฐ์ํด ๊ณ ๋ คํด์ผํ ๊ฒ๋ ๋ง์๊ณ , ๊ท์น์ ์ด์ง ์์์ ํฌ๋กค๋ง์ด ๋ถ๊ฐ๋ฅ ํ ๊ฒ๋ ๋ง์๋ค.์๋ ์นํ์ถ๋ก ๊ตฌํํ๊ณ ์ถ์๋ ๊ฒ์ ์ฌ์ฉ์์ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์์ค์ ์ถ์ฒํด์ฃผ๋ ํ์ ํํฐ๋ง ๋ฐฉ์์ ์ถ์ฒ์์คํ ์ด์๋๋ฐ, ์ ์ ๋ฐ์ดํฐ๊ฐ ์์ด์ ์ค๊ฑฐ๋ฆฌ๋ฅผ ๋ถ์ํด์ ์ ์ฌ๋๊ฐ ๋์ ์น์์ค์ ์ถ์ฒํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ ธ์ ์ ๋ณ๊ฒฝํด์ ์กฐ๊ธ ์์ฌ์ ๋ค.
ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ์ ํ ์คํธํด๋ณธ ๊ฒฐ๊ณผ ์ค๊ฑฐ๋ฆฌ๊ฐ ์ ์ฌํ ์ํ์ ์ ์ถ์ฒํ๊ธฐ๋ ํ์ง๋ง, ์ค๊ฑฐ๋ฆฌ๊ฐ ์์ค์ ์ ์ฒด๋ฅผ ์ ๋ฐ์ํ๊ธฐ๋ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ํ ๋ถ์๊ธฐ๋ ๋ฌธ์ฒด ๋ฑ์ ๊ณ ๋ คํ ์ ์์ด์ ์ค์ ์๋น์ค๋ฅผ ํ์ ๋ ์ฌ์ฉ์์ ๋ง์กฑ๋๊ฐ ๋์ ๊ฒ ๊ฐ์ง๋ ์์๋ค.
ํ๋ก์ ํธ ํ๋ฐ์๋ ํ๋ฉด๊ณต์ ๋ฅผ ํ๋ฉด์ ์ธ๋ถ์ ์ธ ๋์์ธ ๋ณ๊ฒฝ์ด๋ ์์ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ , ๋ฒ๊ทธ๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ๊ฒฌํ๊ณ ๋๋ ์ ์์ ํ๋ ์๊ฐ์ ๊ฐ์ก๋ค. ์ ์ ํ์ํฌ๋ ๋ ์ ๋ง๋ ๊ฒ ๊ฐ๊ณ , ๋ค๋ค ์ด์ ์ ์ด๋ผ ํ๋ก์ ํธ๊ฐ ๋ ์ฌ๋ฏธ์์๋ ๊ฒ ๊ฐ๋ค.







