Posts Pymongo - MongoDB를 Python에서 사용해보기
Post
Cancel

Pymongo - MongoDB를 Python에서 사용해보기

1. Pymongo


1.1 Pymongo란?

  • Python 에서 MongoDB 작업을 위한 패키지


1.2 설치

1
pip install pymongo==2.8.1
  • pip install pymongo==설치할 버전으로 설치함


2. Pymongo 실습


2.1 Import

1
import pymongo
  • Pymongo를 import 함


1
import zigbang as zb
  • zigbang의 매물을 크롤링하는 패키지를 import 함
  • 위의 패키지는 따로 만든 패키지로, 실제로는 없음


1
import pandas as pd
  • 데이터프레임으로 생성을 하기 위해 판다스를 import함


2.2 데이터 베이스 서버 연결

1
2
client = pymongo.MongoClient("mongodb://user:passwd@ip:27017/")
client
1
MongoClient('ip주소', 27017)
  • MongoDB의 서버와 연결하여 client 객체를 생성함
  • 연결은 pymongo의 Mongoclient를 사용하여 ip와 port를 입력함


2.3 데이터 베이스와 컬렉션 생성

1
2
zigbang = client.crawling.zigbang
zigbang
1
Collection(Database(MongoClient('ip주소', 27017), 'crawling'), 'zigbang')
  • crawling 이라는 데이터베이스에 zigbang이라는 컬렉션을 생성함
  • client(위에서 생성한 객체).database.collection 으로 생성


2.4 Insert

1
2
items = zb.oneroom("성수동")
len(items)
1
9
  • Zigbang패키지로 성수동의 원룸 매물을 크롤링함
  • 크롤링된 정보는 Dictionary형태로 Key : Value 로 여러 정보들이 저장되어있음
  • 총 9개의 매물이 크롤링되었음


1
2
ids = zigbang.insert(items)
len(ids)
1
91
  • 위에서 크롤링한 데이터를 zigbang이라는 컬렉션에 insert함
  • 이전에 크롤링된 데이터까지 하여 91개의 데이터가 저장되어 있음


2.5 데이터 프레임 저장

1
2
3
4
sungsoo_df = pd.DataFrame(items)
columns = ["_floor", "address1", "rent", "size", "deposit", "options"]
sungsoo_df = sungsoo_df[columns]
sungsoo_df.tail(2)


_flooraddress1rentsizedepositoptions
892층서울시 성동구 성수동2가016.023000-
903층서울시 성동구 성수동1가6015.03000-


  • 크롤링된 정보 중 필요한 정보들(층, 주소, 월세, 방 사이즈, 보증금, 옵션)만 sungsoo_df라는 데이터프레임으로 생성함


2.6 필요한 정보만 다시 Insert

1
zigbang2 = client.crawling.zigbang2
  • 위에서 정리한 sungsoo_df를 crawling 데이터베이스에 zigbang2라는 collection에 넣기 위해 collection을 재 생성함


1
items = sungsoo_df.to_dict("records")
  • df.to_dict(‘records’)를 사용하여 데이터프레임을 리스트안에 딕셔너리로 만듬
  • to_dict는 판다스의 기능으로 데이터프레임을 딕셔너리로 만들어주며, 아래의 옵션들을 가진다
    • dict(기본값) : dict like {column -> {index -> value}}
    • list : dict like {column -> [values]}
    • series : dict like {column -> Series(values)}
    • split : dict like {index -> [index], columns -> [columns], data -> [values]}
    • records : list like [{column -> value}, … , {column -> value}]
    • index : dict like {index -> {column -> value}}


1
items[0]
1
2
3
4
5
6
{'_floor': '4층',
 'address1': '서울시 성동구 성수동1가',
 'rent': 50,
 'size': 8.0,
 'deposit': 1000,
 'options': '에어컨,냉장고,세탁기,인덕션,옷장,신발장,싱크대'}
  • 데이터 1개 확인
  • 위의 딕셔너리 형식이 리스트안에 생성되어 있음


1
ids = zigbang2.insert(items)
  • zigbang2 컬렉션에 itmes를 insert함


2.7 Find

1
2
query = 질의
results = zigbang2.find(query)
  • find를 하기 위해서 컬렉션에 query에 조회하는 질의(조건)을 넣어서 result 변수에 넣어줌


1
2
3
QUERY = {"rent": {"$lte": 50}}
results = zigbang2.find(QUERY)
pd.DataFrame(results).tail()


_floor_idaddress1depositoptionsrentsize
615층5dbbdfeaa547631b003bbd04서울시 성동구 성수동2가26000-012.0
623층5dbbdfeaa547631b003bbd05서울시 성동구 성수동1가35000-022.0
632층5dbbdfeaa547631b003bbd08서울시 성동구 성수동1가18000-012.0
64옥탑방5dbbdfeaa547631b003bbd0a서울시 성동구 성수동1가1000-5010.0
652층5dbbdfeaa547631b003bbd0b서울시 성동구 성수동2가23000-016.0


  • $lte를 사용하여 rent(월세)가 50이하인 매물만 find하는 Query를 생성
  • collection.find(query)를 사용하여 조회함
  • 조회한 데이터를 데이터프레임으로 생성 한 뒤 마지막 5개 매물만 조회

2.8 컬렉션 삭제

1
client.crawling.drop_collection("zigbang")
  • drop_collecntion(컬렉션)이라는 메서드를 사용해서 삭제함


2.9 데이터 베이스 삭제

1
client.drop_database("crawling")
  • drop_database(데이터베이스)이라는 메서드를 사용해서 삭제함
This post is licensed under CC BY 4.0 by the author.