MongoDB는 여러곳에서 사용하고 있는 NoSQL 데이터베이스 중에 하나이다. 이번 과제에서 크롤링후 데이터를 저장하는 db로 사용할 예정이다.
일단 로컬 PC에 Mongo DB를 설치해 보기로 한다.
pip install pymongo
# Security 관련문제로 인하여 install이 안될경우 아래와 같이 실행한다.
pip install --upgrade --trusted-host pypi.python.org pymongo
설치후 scrapy프로젝트와 연결해준다
스크래피(scrapy)로 크롤링한 정보를 몽고db에 인서트 시킬 경우 settings.py 와 pipelines.py 수정이 필요하다.
import pymongo
from . import items
# connect mongodb
class MusinsaPipeline:
collection_name = 'test'
def __init__(self, mongodb_uri, mongodb_db):
self.mongodb_uri = mongodb_uri
self.mongodb_db = mongodb_db
@classmethod
def from_crawler(cls, crawler):
# pull in information from settings.py
return cls(
mongodb_uri=crawler.settings.get('MONGODB_URI'),
mongodb_db=crawler.settings.get('MONGODB_DATABASE', 'test')
)
def open_spider(self, spider):
# initializing spider
# opening db connection
self.client = pymongo.MongoClient(self.mongodb_uri)
self.db = self.client[self.mongodb_db]
def close_spider(self, spider):
## clean up when spider is closed
self.client.close()
def process_item(self, item, spider):
data = dict(items.MusinsaItem(item))
self.db[self.collection_name].insert_one(data)
return item
연결할 몽고db에 관한 내용들을 추가(MONGO_URI,MONGO_DATABASE)
#settings.py
#기본 설정되어 있는 부분------
BOT_NAME = 'test'
SPIDER_MODULES = ['test.spiders']
NEWSPIDER_MODULE = 'test.spiders'
#기본 설정되어 있는 부분---------------------
#로봇 설정 부분, 막힐 경우 False로 변경
ROBOTSTXT_OBEY = True
#파이프라인을 사용하기 때문에 주석 해제
ITEM_PIPELINES = {
'ecommerce.pipelines.MusinsaPipeline': 300,
}
MONGO_URI = 'mongodb://localhost:27017' #로컬호스트에 mongdb저장시
MONGO_DATABASE = 'test' #자신의 몽고db db명
CONCURRENT_REQUESTS = 1 #순서대로 저장하고 싶을때 주석처리해도 무관
위와 같이 코드 작성 후 scrapy crawl test
로 scrapy를 실행해주면 아래와 같이 데이터베이스에 저장된다.