如何设置Scrapy-Redis在Python爬虫结束后将数据存储到MongoDB数据库?需要提供相关的Setting.py配置以及pipelines文件的代码
时间: 2024-12-18 14:33:08 浏览: 15
项目需求文档:Python+Scrapy-Redis的分布式网页爬虫框架(大规模数据采集架构)0基础!!易懂!!!.md
在Scrapy框架中,你可以通过`Scrapy-Redis`中间件和自定义`Pipeline`来将爬取的数据存储到MongoDB。首先,你需要安装必要的库,如`scrapy_redis`, `pymongo` 和 `redis`。
**1. Setting.py 配置:**
```python
# 设置文件(settings.py)
# 引入所需的中间件和数据库连接信息
import os
# Redis 中间件配置
SPIDER_MIDDLEWARES = {
'scrapy_redis.spiders.RedisSpiderMiddleware': 700,
}
ITEM_PIPELINES = {
# 自定义的 MongoDB Pipeline
'your_project.pipelines.MongoDBPipeline': 800,
}
# Redis 的连接信息,假设你使用默认的 6379 端口
REDIS_URL = f'redis://{os.environ.get("REDIS_HOST", "localhost")}:{os.environ.get("REDIS_PORT", 6379)}'
DOWNLOAD_DELAY = 1 # 为了减少对服务器的压力,可以适当增加下载延迟
# MongoDB 连接信息
MONGO_URI = 'mongodb://username:password@localhost:27017/your_database'
# 如果你想基于 spider 来区分数据集合,可以在 pipelines 文件里设置
FEED_EXPORTERS = {
'mongo': {
'module': 'scrapy.exporters.mongoexporter',
'args': {
'uri': MONGO_URI,
'coll_name': lambda item: f'spider_{item["spider_name"]}',
},
}
}
```
**2. 自定义Pipeline (MongoDBPipeline):**
```python
from pymongo import MongoClient
from scrapy.item import Item
from scrapy.exceptions import DropItem
class MongoDBPipeline:
def __init__(self):
self.client = MongoClient(MONGO_URI)
self.db = self.client['your_database']
self.collection = None
def open_spider(self, spider):
if not hasattr(spider, 'name'):
raise DropItem("Spider needs a name")
self.collection = self.db[f'spider_{spider.name}']
def process_item(self, item, spider):
try:
self.collection.insert_one(dict(item))
except Exception as e:
print(f"Error inserting item: {e}")
raise DropItem("Failed to save item, dropping it")
return item
def close_spider(self, spider):
self.client.close()
```
这个 pipeline 在 `open_spider` 中根据 spider 的名称创建相应的 MongoDB 数据集合,然后在 `process_item` 中将每个 item 插入到该集合中。记得替换 `your_project`, `your_database` 和数据库连接信息。
阅读全文