This repository was archived by the owner on Apr 6, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
Scrapy 를 MongoDB와 연동하는 방법
Sean Hong(홍성민) edited this page Jul 25, 2021
·
2 revisions
Stack Lounge
에서는 필요한 데이터를 Scrapy 를 통해 가져와 도커로 생성한 MongoDB 컨테이너에 저장합니다. 이것을 정리한 내용입니다.
stackspider
├── scrapy.cfg
└── stackspider
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
└── <spider name>.py
-
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 에 저장