存数据库 mongo 如何操作,在scrapy里

使用 scrapy 连接 mongo db 完成数据存储

在 Scrapy 中将数据存入 MongoDB,可以通过定义一个 Item Pipeline 来处理。这种方法可以确保爬虫和数据库操作分离,使代码更加清晰和易于维护。以下是如何在 Scrapy 中将数据存入 MongoDB 的步骤:

实现步骤

  1. 安装 pymongo:首先,你需要安装 pymongo 库来与 MongoDB 进行交互。
pip install pymongo
  1. 定义 Item:定义你要抓取的数据结构。
import scrapy

class MyItem(scrapy.Item):
    title = scrapy.Field()
    description = scrapy.Field()
    url = scrapy.Field()
  1. 编写 Spider:编写你的 Spider 来抓取数据,并将数据传递给 Item Pipeline。
import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'my_spider'
    start_urls = ['http://example.com']

    def parse(self, response):
        item = MyItem()
        item['title'] = response.xpath('//title/text()').get()
        item['description'] = response.xpath('//meta[@name="description"]/@content').get()
        item['url'] = response.url
        yield item
  1. 编写 Item Pipeline:在 Pipeline 中实现数据存储逻辑。
from pymongo import MongoClient

class MongoDBPipeline(object):

    def open_spider(self, spider):
        self.client = MongoClient('localhost', 27017)
        self.db = self.client['mydatabase']
        self.collection = self.db['mycollection']

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.collection.insert_one(dict(item))
        return item
  1. 在 settings.py 中启用 Pipeline
ITEM_PIPELINES = {
   'myproject.pipelines.MongoDBPipeline': 300,
}

通过上述步骤,你可以将数据存储逻辑独立到 Pipeline 中,使得爬虫代码更简洁、模块化、易于维护。

具体细节解释

  1. 安装 pymongopymongo 是一个官方的 MongoDB 驱动程序,用于 Python 与 MongoDB 进行交互。

  2. 定义 Item:定义一个 Scrapy Item 来存储抓取的数据。这里定义了 titledescriptionurl 字段。

  3. 编写 Spider:编写一个简单的 Spider 从网页抓取数据。抓取的数据通过 yield 语句传递给 Pipeline。

  4. 编写 Item Pipeline

    • open_spider 方法中,连接到 MongoDB 数据库并选择要使用的数据库和集合。
    • close_spider 方法中,关闭与 MongoDB 的连接。
    • process_item 方法中,将 Item 转换为字典并插入到 MongoDB 的集合中。
  5. 在 settings.py 中启用 Pipeline:通过在 Scrapy 项目的 settings.py 文件中启用 Pipeline,将其添加到 ITEM_PIPELINES 配置中。数字 300 表示 Pipeline 的优先级,数字越低,优先级越高。

这样,你就可以使用 Scrapy 抓取数据并将其存储到 MongoDB 中。