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)
_floor | address1 | rent | size | deposit | options | |
---|---|---|---|---|---|---|
89 | 2층 | 서울시 성동구 성수동2가 | 0 | 16.0 | 23000 | - |
90 | 3층 | 서울시 성동구 성수동1가 | 60 | 15.0 | 3000 | - |
- 크롤링된 정보 중 필요한 정보들(층, 주소, 월세, 방 사이즈, 보증금, 옵션)만 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 | _id | address1 | deposit | options | rent | size | |
---|---|---|---|---|---|---|---|
61 | 5층 | 5dbbdfeaa547631b003bbd04 | 서울시 성동구 성수동2가 | 26000 | - | 0 | 12.0 |
62 | 3층 | 5dbbdfeaa547631b003bbd05 | 서울시 성동구 성수동1가 | 35000 | - | 0 | 22.0 |
63 | 2층 | 5dbbdfeaa547631b003bbd08 | 서울시 성동구 성수동1가 | 18000 | - | 0 | 12.0 |
64 | 옥탑방 | 5dbbdfeaa547631b003bbd0a | 서울시 성동구 성수동1가 | 1000 | - | 50 | 10.0 |
65 | 2층 | 5dbbdfeaa547631b003bbd0b | 서울시 성동구 성수동2가 | 23000 | - | 0 | 16.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(데이터베이스)이라는 메서드를 사용해서 삭제함