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

Cherry·2023년 5월 21일
0


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개의 댓글