크롤링/scrapy

scrapy[스크래피] mongo db 인서트

개발자J군 2020. 9. 24. 15:37

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

 

봇 네임등은 스크래피 봇 생성시 기본적으로 작성되기 때문에 MONGO_URI,MONGO_DATABASE 부분만 추가.

#settings.py


#기본 설정되어 있는 부분------
BOT_NAME = 'ecommerce'

SPIDER_MODULES = ['ecommerce.spiders']
NEWSPIDER_MODULE = 'ecommerce.spiders'
DUPEFILTER_CLASS ='scrapy.dupefilters.BaseDupeFilter'

#기본 설정되어 있는 부분---------------------

#로봇 설정 부분, 막힐 경우 False로 변경 
ROBOTSTXT_OBEY = True

#파이프라인을 사용하기 때문에 주석 해제
ITEM_PIPELINES = {
   'ecommerce.pipelines.EcommercePipeline': 300,
}

MONGO_URI = 'mongodb://localhost:27017'  #로컬호스트에 mongdb저장시
MONGO_DATABASE = 'ecommerce'  #자신의 몽고db db명

CONCURRENT_REQUESTS = 1  #순서대로 저장하고 싶을때 주석처리해도 무관

 

몽고 db 콜렉션명만 수정 후.

데이터 정제가 필요할 경우 process_item에서 처리 한 뒤 인서트 시킨다.

class EcommercePipeline:
    collection_name = 'ecommerce'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        ## pull in information from settings.py
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        ## initializing spider
        ## opening db connection
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        ## clean up when spider is closed
        self.client.close()

    def process_item(self, item, spider):

        self.db[self.collection_name].insert(dict(item))
        return item

 

명령창에서 scrapy crawl ecommerce

#ecommerce는 자신의 봇 이름

반응형