Skip to content
This repository has been archived by the owner on Apr 6, 2022. It is now read-only.

Scrapy 를 MongoDB와 연동하는 방법

Sean Hong(홍성민) edited this page Jul 25, 2021 · 2 revisions

Introduction

Stack Lounge에서는 필요한 데이터를 Scrapy 를 통해 가져와 도커로 생성한 MongoDB 컨테이너에 저장합니다. 이것을 정리한 내용입니다.

Scrapy 구조

stackspider                                             
├── scrapy.cfg                                           
└── stackspider                                         
    ├── __init__.py                                       
    ├── items.py                                         
    ├── middlewares.py                                   
    ├── pipelines.py                                    
    ├── settings.py                                      
    └── spiders                                          
        ├── __init__.py                                 
        └── <spider name>.py

How To

  • pympongo 설치

    pip install pymongo
  • 스파이더 생성

       scrapy genspider <spider name> <domain(크롤할 웹 도메인 이름)>
  • settings.py 변경

       ITEM_PIPELINES = {
    'stackspider.pipelines.<pipelines.py에 정의해줄 class name>': 300,
     }
     MONGODB_SERVER = "mongodb://<docker-mongo-container-name>"
     MONGODB_PORT = 27017
     MONGODB_DB = "<mongodb name>"
     USERNAME = "<admin username>"
     PASSWORD = "<admin password>"
     MONGODB_COLLECTION = <mongodb collection name>
  • pipelines.py 변경

     from pymongo import MongoClient
     from scrapy.utils.project import get_project_settings
     settings = get_project_settings() # settings.py 에 정의한 환경변수에 접근하기 위함
    
     # 위 settings.py 에서 호출할 <pipelines.py에 정의해줄 class name>
     class MongoDBPipeline:
     def __init__(self):
         connection = MongoClient(
             host=settings['MONGODB_SERVER'],
             port=settings['MONGODB_PORT'],
             username=settings['USERNAME'],
             password=settings['PASSWORD']
         )
    
         db = connection[settings['MONGODB_DB']]
         self.collection = db[settings['MONGODB_COLLECTION']] 
    
     # Scrapy 에서 호출하는 기본 함수, 이 함수호출을 통해 pymongo 의 mongo 인스턴스의 컬렉션에 값을 삽입
     def process_item(self, item, spider):
         # how to handle each post
         valid = True
         for data in item:
             if not data:
                 valid = False
                 raise DropItem("Missing {0}!".format(data))
         if valid:
             self.collection.insert(dict(item))
             logging.debug("Posted to MongoDB database!")
         return item
  • items.py 변경

      from scrapy import Field, Item
    
      # key : value 값을 지정하기 위해서 새로운 item을 만들어 줍니다.
      # 해당 객체는 딕셔너리 타입으로 접근하면 됩니다.
      class MyItem(Item):
         item_id = Field()
         item_name = Field()
  • 만들어준 spider-name.py 변경

       # 기타 import 문 생략
       from stackspider.items import MyItem
       import json
    
    
       class <spider-name>(Spider):
          # 자동으로 생성되는 코드 ...
          
          def parse(self, response):
             my_json = json.loads(response.text)
             myitems = MyItem()
             myitems['items_id'] = my_json['id']
             myitems['items_name'] = my_json['name']
    
             yield myitems # pipelines.py 를 통해 MongoDB 에 저장

참고로 도커 내부에 network 을 설정해줘야 합니다. 이 network name을 통해서 컨테이너 간 통신이 이루어집니다.

참고문헌

1 2