본문 바로가기
개발(Develop)/웹(Web) _프로젝트project

웹 / 페이스북 좋아요 기능 웹 사이트 만들기(1) - 개발환경 설정 및 크롤링을 통한 데이터베이스(DB) 준비

by 왁왁s 2021. 6. 8.
오늘 할 프로젝트

이번에 할 프로젝트는 영화 유명 배우들의 프로필을 만들고

우리가 좋아요를 누르거나 싫어요, 삭제를 누르는 등의 평가를 할 수 있는

예를 들면 페이스북 좋아요 기능(?) 비슷한 것을 구현해보고자 한다.


새 프로젝트를 만들어준다.

 

매일 색칠을 해서 가리는 부분은... 개인정보라 이해해주길 바란다.


새 프로젝트가 생성되었다면 아래와 같이

static 폴더, templates 폴더, index.html 파일, app.py 파일을 만들어준다.

 

static 폴더에는 CSS나 이미지 파일들을 담아둘 때 사용할 것이다.

그리고 templates 폴더에는 HTML 파일들을 담아둘 때 사용할 것이다.

 

그리고 서버로 활용할 app.py 파일

 templates 폴더에 index.html 파일


그리고 라이브러리를 설치해줘야 하는데 이번 프로젝트에서는

데이터베이스, 크롤링, 서버를 사용할 것이다.

 

서버를 위한 flask

 

DB를 위한 pymongo

 

크롤링을 위한 requests bs4

 

파이참 패키지 다운로드 방법은 아래 링크 클릭 ▼

파이참(PyCharm) 패키지 설치하기/ 파이썬 라이브러리 설치/ pip 패키지 설치하기


이전에 다뤘던 프로젝트와는 다르게 이번에는 API에서 DB 데이터를 채우는 것이 아니라,

 

API 설계와 다른 것을 만드는 데에 집중할 수 있도록 미리 사용할 데이터를

데이터베이스(DB)에 넣어두는 작업을 할 것이다.

 

개발 프로젝트에 참가해보았다면 데이터베이스(DB)를 먼저 쌓는 작업을 해봤을 것이다.

 

데이터베이스를 쌓을 때는 크롤링을 사용한다.

오늘 프로젝트에서 크롤링할 부분은 유명 배우들의 정보들이다.

유명인들의 이름, 사진, 최근 작품 등에 대한 정보를 가져올 것이다.

 

마침 우리가 필요한 데이터를 크롤링하기 좋은

네이버 영화배우 랭킹 사이트가 있다.

https://movie.naver.com/movie/sdb/rank/rpeople.nhn 

2021.06.07. 기준의 랭킹이다.


랭킹에 나온 배우 이름을 클릭해 들어가게 되면 아래와 같이 우리가 필요한 정보들이 모두 나온다.

배우 이름, 배우 사진, 배우 최근 작품, 배우의 정보.. 심지어 키와 몸무게까지 나온다..


크롤링의 예시를 하나 들면, 엠마 스톤의 사진을 한번 가져와보도록 하자.

 

아래 링크는 랭킹에서 엠마 스톤 이름을 클릭했을 때 들어가지는 사이트이다. ▼

https://movie.naver.com/movie/bi/pi/basic.nhn?st=1&code=135256 

 

사이트에 들어가 마우스 오른쪽을 클릭해 [검사]를 누르자.

해당 버튼을 누르고 엠마 스톤 이미지를 클릭하게 되면 이미지에 해당하는 코드로 나를 안내해준다.


엠마 스톤의 이미지 코드가 맞다면 마우스 오른쪽을 눌러 Copy -> Copy selector을 누른다.

셀렉터 복사가 완료되면 셀렉터를 붙여넣기 해보자.

 

#content > div.article > div.mv_info_area > div.poster > img

 

해당 셀렉터는 다른 배우들의 이미지에서도 동일한 셀렉터를 가질 것이다. 이를 활용하자.

 

크롤링은 이전 글에서 많이 다뤘기 때문에 완성코드만 나타내고,

자세한 설명은 이전 글을 참고하자 ▼

\네이버 영화 순위 크롤링, 웹스크래핑 해보기/ 파이썬 bs4 패키지 사용법/ 네이버 API 크롤링하기

데이터베이스(DB)/ 파이썬으로 네이버 영화순위 크롤링한 데이터를 DB에 넣기/ 몽고DB에 데이터 삽입하기(insert)

 


아래에 첨부된 크롤링 코드에 대한 간단 설명

아래 크롤링 코드에 대해 조금 설명하자면, '엠마 스톤' 이름에 있는

하이퍼링크 셀렉터를 가져왔을 때 

 


1위. 엠마 스톤

#old_content > table > tbody > tr:nth-child(2) > td.title > a

2. 엠마 톰슨

#old_content > table > tbody > tr:nth-child(3) > td.title > a

 

6. 마동석

#old_content > table > tbody > tr:nth-child(7) > td.title > a


#old_content > table > tbody > tr 여기까지는 공통적인 부분이다.

이를 trs 변수에 넣고, 

td.title > a 부분을 select_one으로 가져오는데

 

순위 사이사이 마다 구분해준 구분선 None 값은 제외시켜주는 것이다. 그것이 바로 if문.


base_url + a['href'] 는 a태그의 href 속성의 속성 값과 base_url을 더해서

url 변수에 넣어주는 것이다.

그리고 위에서 선언한 urls 리스트에 append 함수로 넣어준다.

 

def insert_star 함수에선

url 변수에 들어 있는 url을 통해 

배우들의 이름, 이미지, 최근 영화에 대한 정보를 가지고 크롤링하여

딕셔너리 형태로 만들어 데이터베이스에 넣어주는 작업을 한다.


def insert_all( ):

insert_all 함수는 기존에 있던 mystar 이라는 컬렉션을 .drop( ) 드랍한다. 

드랍은 mongoDB에서 삭제와 마찬가지다.

 

urls 리스트에 get_urls( ) 함수를 실행시켜 return 값으로 배우에 대한 하이퍼링크가 담긴

URL 들을 받는다.

 

그리고 for url in urls:

for 반복문을 돌리는데 urls에 있는 하이퍼링크 모두 돌 때까지

insert_star(url) 메소드를 실행시킨다.

 

그리고 마지막엔 insert_all( ) 함수 실행 코드가 있다.

 

 

데이테비이스에 넣을 때 mystar이라는 컬렉션을 만들어 넣었는데,

 


dbstore.py 파일 / 네이버 영화 랭킹 사이트에서 필요한 데이터를 가져오는 크롤링 코드
import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client.dbhwanActor


# DB에 저장할 영화인들의 출처 url을 가져옵니다.
def get_urls():
    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('https://movie.naver.com/movie/sdb/rank/rpeople.nhn', headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    trs = soup.select('#old_content > table > tbody > tr')

    urls = []
    for tr in trs:
        a = tr.select_one('td.title > a')
        if a is not None:
            base_url = 'https://movie.naver.com/'
            url = base_url + a['href']
            urls.append(url)

    return urls


# 출처 url로부터 영화인들의 사진, 이름, 최근작 정보를 가져오고 mystar 콜렉션에 저장합니다.
def insert_star(url):
    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')

    name = soup.select_one('#content > div.article > div.mv_info_area > div.mv_info.character > h3 > a').text
    img_url = soup.select_one('#content > div.article > div.mv_info_area > div.poster > img')['src']
    recent_work = soup.select_one(
        '#content > div.article > div.mv_info_area > div.mv_info.character > dl > dd > a:nth-child(1)').text

    doc = {
        'name': name,
        'img_url': img_url,
        'recent': recent_work,
        'url': url,
        'like': 0
    }

    db.mystar.insert_one(doc)
    print('완료!', name)


# 기존 mystar 콜렉션을 삭제하고, 출처 url들을 가져온 후, 크롤링하여 DB에 저장합니다.
def insert_all():
    db.mystar.drop()  # mystar 콜렉션을 모두 지워줍니다.
    urls = get_urls()
    for url in urls:
        insert_star(url)


### 실행하기
insert_all()

크롤링이 완료되면 완료! [배우 이름]이 뜬다. 컴퓨터 성능이 좋을수록 빠르게 크롤링이 된다.

내가 사용하는 컴퓨터는 매우 느려서 조금 오래 기다렸다.

그리고 Robo 3T를 통해 mongoDB 데이터베이스 mystar 컬렉션을 확인하면

성공적으로 크롤링이 완료되었음을 확인할 수 있다.

 

데이터베이스(DB) mongoDB가 안 깔려 있다면 ▼

mongoDB(몽고DB) 쉬운 설치/ mongoDB 환경변수 설정까지/ mongoDB란/ mongoDB 다운로드

 

mongoDB를 GUI로 보여주는 Robo 3T가 안 깔려 있다면 ▼

Robo 3T 쉬운 설치/ MongoDB 편리하게 작업하는 Robo 3T/ Robo 3T 다운로드/ Robo 3T란

 

파이썬 위주의 코드를 작성하는 파이참(PyCharm)이 안 깔려 있다면 ▼

파이참(PyCharm) 쉬운 설치/ Pycharm IDE 다운로드/파이참(PyCharm)이란?/ IDE 추천

댓글