[Scrapy] Scrapy로 크롤링 후 Mongo DB에 저장하기

Cherry·2023년 5월 21일


MongoDB는 여러곳에서 사용하고 있는 NoSQL 데이터베이스 중에 하나이다. 이번 과제에서 크롤링후 데이터를 저장하는 db로 사용할 예정이다.

일단 로컬 PC에 Mongo DB를 설치해 보기로 한다.

Mongo DB 설치

pip install pymongo
# Security 관련문제로 인하여 install이 안될경우 아래와 같이 실행한다.
pip install --upgrade --trusted-host pypi.python.org pymongo

설치후 scrapy프로젝트와 연결해준다

Mongo DB 연결

스크래피(scrapy)로 크롤링한 정보를 몽고db에 인서트 시킬 경우 settings.py 와 pipelines.py 수정이 필요하다.

piplines.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

settings.py 작성

연결할 몽고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  #순서대로 저장하고 싶을때 주석처리해도 무관

Mongo DB 저장

위와 같이 코드 작성 후 scrapy crawl test 로 scrapy를 실행해주면 아래와 같이 데이터베이스에 저장된다.

0개의 댓글