[프로젝트] 책 좋아요 페이지 - #1.구상, DB 세팅, API 설계

예니·2020년 10월 31일
1

프로젝트

목록 보기
2/8
post-thumbnail

flask 서버, ajax, mongoDB 이용해서 책 좋아요 페이지 만들기

프로젝트라고 말하긴 민망하지만 언젠간 이것도 다 돌아볼 일이 생길테니 우선은 정리정리😊
다음 프로젝트하기 전에 이번에 뭘했는지 한번 짚어보자

📅 기간 : 2020.10.29 ~ 30

책 좋아요 페이지 만든 목적은 링크메모장, 영화인 좋아요 페이지를 만들면서 배운 것들을 다 넣어서 만들어볼 목적이었다.
내가 좋아하는 책을 컨텐츠로!📕📘📖
링크 입력해서 긁어오는 기능, 좋아요 기능 등을 넣어서 만들어봤다.

📖 구상

yes24 베스트셀러 순위에서 40개 긁어와서 db에 저장
그 중 상세설명이나 평점이 없는 책들은 제외
기존에 등록된 책 외에도 사용자가 yes24 상세페이지 링크를 추가하면
원하는 책을 리스트에 추가할 수 있음
책마다 좋아요 별로에요 버튼을 만들어서 좋아요 순위로 책 보여주기


📖 DB 세팅

1. 베스트셀러 페이지에서 상품별 url 얻기

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에 담아준다.


2. DB에 책 넣기 (한권)

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 딕셔너리로 만든다.
bookbookshop db에 넣어준다.
db에 잘 들어갔는지 확인하기위해 마지막에 print

기억에 남는 사항

책마다 책 설명이나 평점이 없는 책들도 있고, 이들은 None을 반환하여 .text시 에러를 발생시킨다.
그래서 if (desc == None) or (rate == None): return 해서 설명, 평점 없는 책들은 제외해준다.
에러나서 한참 고생했다🤪


3. DB에 책 전체 넣기

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주소 (요청방법)서버클라이언트
책 불러오기/api/list
(GET)
DB에서 책 리스트를 불러온다X
새 링크 저장/api/list
(POST)
입력된 url에서 책 정보를 긁어 DB에 저장한다url을 입력한다
좋아요/api/like
(POST)
해당 책의 like 수를 +1 하여 업데이트한다좋아요 버튼 눌린 책의 이름을 전달한다
별로에요/api/like
(POST)
해당 책의 like 수를 -1 하여 업데이트한다별로에요 버튼 눌린 책의 이름을 전달한다

0개의 댓글