flask 서버, ajax, mongoDB 이용해서 책 좋아요 페이지 만들기
프로젝트라고 말하긴 민망하지만 언젠간 이것도 다 돌아볼 일이 생길테니 우선은 정리정리😊
다음 프로젝트하기 전에 이번에 뭘했는지 한번 짚어보자
📅 기간 : 2020.10.29 ~ 30
책 좋아요 페이지 만든 목적은 링크메모장
, 영화인 좋아요
페이지를 만들면서 배운 것들을 다 넣어서 만들어볼 목적이었다.
내가 좋아하는 책을 컨텐츠로!📕📘📖
링크 입력해서 긁어오는 기능, 좋아요 기능 등을 넣어서 만들어봤다.
yes24 베스트셀러 순위에서 40개 긁어와서 db에 저장
그 중 상세설명이나 평점이 없는 책들은 제외
기존에 등록된 책 외에도 사용자가 yes24 상세페이지 링크를 추가하면
원하는 책을 리스트에 추가할 수 있음
책마다 좋아요
별로에요
버튼을 만들어서 좋아요 순위로 책 보여주기
def get_urls():
base_url = 'http://www.yes24.com/24/category/bestseller?CategoryNumber=001&sumgb=06&FetchSize=40'
data = requests.get(base_url)
soup = BeautifulSoup(data.text, 'html.parser')
target = soup.select('#bestList tr')
mom_url = 'http://www.yes24.com'
urls = []
for one in target:
book = one.select_one('.goodsTxtInfo a')
if book:
url = mom_url + book['href']
urls.append(url)
return urls
베스트셀러 페이지(base_url
)에서 각 책들을 선택한다. (target
)
책들의 url 은 /goods/상품번호
이런 식으로 부여되어있다.
mom_url
을 설정해주고 하나씩 붙여서 list에 담아준다.
def insert_book(url):
data = requests.get(url)
soup = BeautifulSoup(data.text, 'html.parser')
target = soup.select_one('#yDetailTopWrap > div.topColLft > div.gd_imgArea > span > em > img')
img_url = target['src']
title = target['alt']
author = soup.select_one('span.gd_auth > a:nth-child(1)')
desc = soup.select_one('div.infoWrap_txtInner > textarea > b')
rate = soup.select_one('#spanGdRating > a > em')
if (desc == None) or (rate == None):
return
book = {
'url':url,
'title':title,
'img':img_url,
'author':author.text,
'desc':desc.text,
'rate':rate.text,
'like':0,
}
db.bookshop.insert_one(book)
print('완료!', title)
1에서 얻은 상품별 url 하나하나 돌면서 책별 정보 저장해주는 함수
책 상세페이지에서 이미지, 제목, 작가, 책 설명, 평점, 책url 을 긁어와서 book
딕셔너리로 만든다.
book
을 bookshop
db에 넣어준다.
db에 잘 들어갔는지 확인하기위해 마지막에 print
기억에 남는 사항
책마다 책 설명이나 평점이 없는 책들도 있고, 이들은None
을 반환하여.text
시 에러를 발생시킨다.
그래서if (desc == None) or (rate == None): return
해서 설명, 평점 없는 책들은 제외해준다.
에러나서 한참 고생했다🤪
def insert_all():
db.bookshop.drop()
urls = get_urls()
for url in urls:
insert_book(url)
insert_all() #함수 실행
기존에 bookshop
db에 있던 자료는 db.bookshop.drop()
으로 다 지워준다.
get_urls()
함수로 urls 리스트 얻고, 리스트를 돌면서 하나씩 inset_book()
함수로 넣어준다.
목적 | API주소 (요청방법) | 서버 | 클라이언트 |
---|---|---|---|
책 불러오기 | /api/list (GET) | DB에서 책 리스트를 불러온다 | X |
새 링크 저장 | /api/list (POST) | 입력된 url에서 책 정보를 긁어 DB에 저장한다 | url을 입력한다 |
좋아요 | /api/like (POST) | 해당 책의 like 수를 +1 하여 업데이트한다 | 좋아요 버튼 눌린 책의 이름을 전달한다 |
별로에요 | /api/like (POST) | 해당 책의 like 수를 -1 하여 업데이트한다 | 별로에요 버튼 눌린 책의 이름을 전달한다 |