스크래피(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는 자신의 봇 이름
반응형
'크롤링 > scrapy' 카테고리의 다른 글
scrapy(스크래피) 크롤링 실전 (csv 저장까지) (0) | 2020.09.24 |
---|---|
scrapy 동일한 url Request (0) | 2020.09.24 |
[scrapy] 엑셀(csv) 필드 정렬, 순서대로 저장, 한글 깨짐 현상 (1) | 2020.09.22 |
scrapy shell 접속, 크롤링 (0) | 2020.09.22 |
scrapy(스크래피) 프로젝트 생성방법 (0) | 2020.09.18 |