크롤링과 함께 쓰는 mongoDB 예제
이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 강의 사이트와 유투브 채널을
오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
● 잔재미코딩 유투브 오픈
[구독해보기]
6. 크롤링과 함께 쓰는 mongoDB 예제¶
In [1]:
import requests
import re
import datetime
from bs4 import BeautifulSoup
from pymongo import MongoClient
import pymongo
In [2]:
username = 'davelee'
password = 'happy91'
connection = pymongo.MongoClient('mongodb://%s:%s@www.funcoding.xyz' % (username, password))
In [3]:
mongodb = connection.cine21
In [4]:
actor_collection = mongodb.actor_collection
In [8]:
actor_list = actor_collection.find()
for actor in actor_list:
print(actor['actor'])
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
cine21 인물 랭킹 알아내기¶
- http://www.cine21.com/rank/person/
- 조회를 눌렀을 때, Go to Network -> content 의 Request URL/Method 와 Form 데이터 알아내기
- Request URL: http://www.cine21.com/rank/person/content
- Request Method: POST
- Form Data
- section:actor
- period_start:2017-09
- gender:all
- page:1
- 하단부 페이지를 누를 때마다, Form Data 의 page 값이 바뀜
In [62]:
cine21_url = 'http://www.cine21.com/rank/person/content'
In [63]:
month = "2017-10"
In [64]:
conditions = dict()
conditions['section'] = 'actor'
conditions['period_start'] = month
conditions['gender'] = 'all'
conditions['page'] = 1
In [65]:
response = requests.post(cine21_url, data = conditions)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
In [66]:
response
Out[66]:
In [ ]:
response.content
In [68]:
soup = BeautifulSoup(response.content.decode('utf-8'), 'html.parser')
In [ ]:
soup
In [70]:
actors = soup.select('li.people_li div.name')
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
In [71]:
actors
Out[71]:
실습
actors 리스트에서 배우 이름만 추출하기 예) 마동석(3편) --> 마동석
actors 리스트에서 배우 이름만 추출하기 예) 마동석(3편) --> 마동석
In [72]:
import re
for actor in actors:
print(re.sub("\(\w+\)", "", actor.text))
각 배우별 상세 정보를 document에 넣고 싶다.¶
- 각 배우별 상세 정보를 별도 컬럼으로 만들려했더니, 각 배우별 상세 정보 항목이 다르다!
- 모든 상세 정보 항목을 컬럼으로 만들고, 각 컬럼에 매칭되는 컬럼값을 넣기가 쉽지 않다. 코드도 복잡하고!
- Mongodb는 NoSQL -> 통째로 집어넣자.!
- embedded document
- document 의 컬럼값으로 document를 넣을 수 있다.
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
크롤링해서, embedded document 로 각 배우별 상세 정보를 통째로 만들고, document 컬럼에 넣기¶
In [79]:
actor_detail_info = list()
for actor in actors:
actor_info_dict = dict()
actor_info = 'http://www.cine21.com' + actor.select_one('a').attrs['href']
response_actor = requests.get(actor_info)
soup_actor = BeautifulSoup(response_actor.content.decode('utf-8'), 'html.parser')
actor_datas = soup_actor.select('ul.default_info')
for actor_data in soup_actor.select('ul.default_info'):
for actor_item in actor_data.select('li'):
actor_item_text = re.sub('<span.*?>.*?</span>', '', str(actor_item))
actor_item_text = re.sub('<.+?>', '', actor_item_text)
actor_info_dict[actor_item.select_one('span.tit').text] = actor_item_text.strip()
actor_detail_info.append(actor_info_dict)
print(actor_detail_info)
In [66]:
actor_info_dict = dict()
actor_info = 'http://www.cine21.com/db/person/info/?person_id=19889'
response_actor = requests.get(actor_info)
soup_actor = BeautifulSoup(response_actor.content.decode('utf-8'), 'html.parser')
actor_datas = soup_actor.select('ul.default_info')
for actor_data in soup_actor.select('ul.default_info'):
for actor_item in actor_data.select('li'):
actor_item_text = re.sub('<span.*?>.*?</span>', '', str(actor_item))
actor_item_text = re.sub('<.+?>', '', actor_item_text)
actor_info_dict[actor_item.select_one('span.tit').text] = actor_item_text.strip()
print(actor_info_dict)
In [73]:
actor_info_dict = dict()
actor_info = 'http://www.cine21.com/db/person/info/?person_id=19889'
response_actor = requests.get(actor_info)
soup_actor = BeautifulSoup(response_actor.content.decode('utf-8'), 'html.parser')
In [ ]:
soup_actor
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
In [75]:
actor_datas = soup_actor.select('ul.default_info')
In [76]:
actor_datas
Out[76]:
In [77]:
for actor_data in soup_actor.select('ul.default_info'):
for actor_item in actor_data.select('li'):
actor_item_text = re.sub('<span.*?>.*?</span>', '', str(actor_item))
actor_item_text = re.sub('<.+?>', '', actor_item_text)
actor_info_dict[actor_item.select_one('span.tit').text] = actor_item_text.strip()
In [78]:
print(actor_info_dict)
흥행지수 뽑기¶
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
In [80]:
actor_rates = soup.select('li.people_li ul.num_info strong')
In [81]:
for actor_rate in actor_rates:
print(actor_rate.text)
흥행지수 숫자로 만들어주기¶
In [82]:
actor_rate_list = list()
In [83]:
for actor_rate in actor_rates:
actor_rate_list.append(int(actor_rate.text.replace(",",""))) # int() 로 해주지 않으면, 문자열로 됩니다.
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
In [84]:
actor_rate_list
Out[84]:
In [85]:
actor_list = list()
In [86]:
for actor in actors:
actor_list.append(re.sub("\(\w+\)", "", actor.text))
In [87]:
actor_list
Out[87]:
각 배우별 출연 영화를 document에 저장하고 싶다.¶
- 출연 영화는 한 개가 될 수도 있고, 여러 개가 될 수도 있음
- 파이썬은 리스트, mongodb document는 컬럼에 배열(array)로 넣으면 됨
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
- 어떻게? 다음과 같이 합니다.
In [88]:
movie_list = list()
In [89]:
movies = soup.select('li.people_li ul.mov_list')
In [90]:
for movie in movies:
actor_movie = list()
movie_titles = movie.select('li a span')
for movie_title in movie_titles:
actor_movie.append(movie_title.text)
movie_list.append(actor_movie)
In [91]:
movie_list
Out[91]:
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
- 이렇게 만든 리스트를 넣으면 됩니다.
insert_one() 로 하나씩 데이터 입력하기 (반복문과 함께 사용하면, 여러 데이터를 넣을 수 있음)¶
- actor_list: 배우 이름
- actor_details: 배우 상세 정보
- actor_rate: 흥행 지수
- date: 기준월
- movie_list: 출연 영화 리스트!
In [92]:
for num, actor in enumerate(actor_list):
actor_collection.insert_one(
{"actor":actor_list[num],
"actor_details": actor_detail_info[num],
"actor_rate":actor_rate_list[num],
"date":month,
"movie_list":movie_list[num]})
In [93]:
docs = actor_collection.find()
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
In [ ]:
for doc in docs:
print(doc)
collection 삭제하기¶
In [95]:
actor_collection.drop()
In [96]:
docs = actor_collection.find()
In [97]:
for doc in docs:
print(doc)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
Dictionary 타입으로 만들어서 한번에 insert_many() 로 데이터 입력하기¶
In [98]:
actor_info = list()
In [99]:
for num, actor in enumerate(actor_list):
actor_info.append(
{"actor":actor_list[num],
"actor_details": actor_detail_info[num],
"actor_rate":actor_rate_list[num],
"date":month,
"movie_list":movie_list[num]}
)
In [ ]:
actor_info
In [101]:
actor_collection.insert_many(actor_info)
Out[101]:
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
가장 빠르게 풀스택 개발자가 될 수 있도록, 최적화된 로드맵을 제공합니다
In [102]:
docs = actor_collection.find()
In [103]:
for doc in docs:
print(doc)
Update (컬럼명 변경 예제)¶
In [104]:
actor_collection.update_many( {}, { "$rename": { "actor": "actor_name" } } )
Out[104]:
In [105]:
docs = actor_collection.find()
for doc in docs:
print(doc)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
실습
actor_details 필드 이름을 actor_info 로 변경하기
actor_details 필드 이름을 actor_info 로 변경하기
In [106]:
actor_collection.update_many( {}, { "$rename": { "actor_details": "actor_info" } } )
Out[106]:
In [107]:
docs = actor_collection.find()
for doc in docs:
print(doc)
- 컬렉션 객체 이름도 바꿀 수 있겠지요
In [ ]:
actor = actor_collection