1. mongo_connection.py
HOSTNAME = "localhost"
PORT = 27017
import pymongo
client = pymongo.MongoClient(HOSTNAME, PORT)
db = client.test
collection = db.python
def save(title, directorList, castList):
collection.save({"title": title, "director": directorList, "cast": castList})
MongoDB에 넣기 위해 위와 같이 mongo_connection.py 파일을 만든다.
HOSTNAME은 당연히 자기 컴퓨터에 데이터에 넣을 것이므로 localhost를 쓰고, 기본적으로 MongoDB 포트는 27017이다.
또한 MongoDB와 Python을 연결하기 위한 pymongo도 필요하다.
client로 DB 접속 주소를 정해주고, db로 데이터베이스명을 지정해준 뒤에 마지막으로 collection에서 지정한 db내의 컬렉션을 선택한다. 즉 "localhost:27017"에 DB는 "test", DB의 컬렉션은 "python"을 사용하겠다는 것이다.
save 함수는 영화 제목, 감독 리스트, 배우 리스트를 매개변수로 받아 해당 collection에 save 하는 역할을 가진다.
2. naver_movie.py
# import
from bs4 import BeautifulSoup
from urllib.request import urlopen
# 몽고 DB 연결
import mongo_connection
url = urlopen("https://movie.naver.com/movie/running/current.nhn")
bs = BeautifulSoup(url, 'html.parser')
body = bs.body
target = body.find(class_="lst_detail_t1")
list = target.find_all('li')
no = 1
for n in range(0, len(list)) :
print("=================================")
print("No.",no)
no += 1
# 영화 제목
title = list[n].find(class_="tit").find("a").text
print("영화 제목 :\t", title)
# 감독
try:
director = list[n].find(class_="info_txt1").find_all("dd")[1].find("span").find_all("a")
directorList = [director.text.strip() for director in director]
print("제작 감독 :\t", directorList)
except IndexError:
print("제작 감독 :\t 정보 없음")
directorList = "정보 없음"
# 출연 배우
try:
cast = list[n].find(class_="lst_dsc").find("dl", class_="info_txt1").find_all("dd")[2].find(class_="link_txt").find_all("a")
castList = [cast.text.strip() for cast in cast]
print("출연 배우 :\t", castList)
except IndexError:
print("출연 배우 :\t 정보 없음")
castList = "정보 없음"
mongo_connection.save(title,directorList,castList)
이전과 같은 파일이지만, MongoDB에 넣기 위해 달라진 점이 몇 군데 있다.
import mongo\_connection
로 위에 작성한 mongo\_connection.py
를 불러오는 것이다. 그리고 directorList = "정보 없음"
과 castList = "정보 없음"
만약 감독이나 출연 배우의 정보가 없을 경우에는 except로 넘어가서 콘솔창에 "출연 배우 : 정보 없음"을 띄우고 넘어가는 데, 문제는 넘어가면서 이전의 값을 현재의 값에 추가한다는 것이다. 즉 <30번째 영화>에 출연 배우가 없다면 DB에는 <29번째의 출연 배우> 값을 가지고 <30번째 영화 출연 배우>에 넣는다는 것이다.
mongo\_connection.save(title,directorList,castList)
영화 제목, 감독 리스트, 출연 배우 리스트를 mongo_connection 의 save 함수를 통해 넣는 것이다.
3. MongoDB
=================================
No. 1
영화 제목 : 앤트맨과 와스프
제작 감독 : ['페이튼 리드']
출연 배우 : ['폴 러드', '에반젤린 릴리', '마이클 더글라스', '마이클 페나', '로렌스 피시번', '미셸 파이퍼', '해나 존-케이먼']
=================================
No. 2
영화 제목 : 마녀
제작 감독 : ['박훈정']
출연 배우 : ['김다미', '조민수', '박희순', '최우식']
=================================
No. 3
영화 제목 : 스카이스크래퍼
제작 감독 : ['로슨 마샬 터버']
출연 배우 : ['드웨인 존슨', '니브 캠벨']
파이썬 콘솔 창에서는 위와 같이 뜨고, MongoDB에 값이 들어가면 아래와 같은 문서를 가지게 된다.
/* 1 */
{
"_id" : ObjectId("5b4db5c133835b1a7872a939"),
"title" : "앤트맨과 와스프",
"director" : [
"페이튼 리드"
],
"cast" : [
"폴 러드",
"에반젤린 릴리",
"마이클 더글라스",
"마이클 페나",
"로렌스 피시번",
"미셸 파이퍼",
"해나 존-케이먼"
]
}
/* 2 */
{
"_id" : ObjectId("5b4db5c133835b1a7872a93a"),
"title" : "마녀",
"director" : [
"박훈정"
],
"cast" : [
"김다미",
"조민수",
"박희순",
"최우식"
]
}
/* 3 */
{
"_id" : ObjectId("5b4db5c133835b1a7872a93b"),
"title" : "스카이스크래퍼",
"director" : [
"로슨 마샬 터버"
],
"cast" : [
"드웨인 존슨",
"니브 캠벨"
]
}