一文搞懂Scrapy与MongoDB交互过程

一文搞懂Scrapy与MongoDB交互过程

在使用Scrapy进行数据爬取的过程中,我们经常需要将爬取下来的数据存储到数据库中。MongoDB是一个非常流行的NoSQL数据库,它与Scrapy的交互非常方便。本文将介绍如何在Scrapy中使用MongoDB进行数据存储。

安装MongoDB

在使用MongoDB之前,需要先安装MongoDB数据库。可以通过MongoDB官网下载相应版本的MongoDB,并进行安装。安装完毕后,可以通过命令行启动MongoDB服务:

$ mongod

安装pymongo

Scrapy使用pymongo来与MongoDB进行交互,因此需要先安装pymongo。可以通过pip进行安装:

$ pip install pymongo

配置MongoDB Pipeline

配置Scrapy的Pipeline可以将爬取的数据存储到MongoDB中。需要在Scrapy项目中创建一个Pipeline,并在settings.py文件中进行配置。

在Scrapy项目中创建一个名为MongoDBPipeline的新文件,并添加以下内容:

import pymongo

class MongoDBPipeline(object):

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

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

    def process_item(self, item, spider):
        collection_name = item.__class__.__name__
        self.db[collection_name].insert(dict(item))
        return item

settings.py中添加以下内容:

ITEM_PIPELINES = {
   'myproject.pipelines.MongoDBPipeline': 300,
}

MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'items'

在上述代码中,我们定义了一个名为MongoDBPipeline的Pipeline。在process_item方法中,我们将爬取的数据存储到MongoDB中。默认情况下,每个爬虫CrawlSpider中的每个Item子类都会被存储到自己的集合中。例如,如果我们有一个名为MyItem的Item类,则数据将被存储在MongoDB的myitem集合中。

settings.py中,我们将MongoDBPipeline添加到ITEM_PIPELINES中,并设置了MongoDB的连接地址和数据库名称。

使用MongoDB Pipeline

在Spider中使用MongoDB Pipeline非常简单。只需将要存储的数据传递给Pipeline,Pipeline将自动将数据存储到MongoDB中。

以下是一个示例:

import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        yield scrapy.Request('https://www.example.com', self.parse)

    def parse(self, response):
        item = MyItem()
        item['name'] = 'example'
        item['url'] = response.url
        yield item

在上述代码中,我们定义了一个名为MySpider的Spider。在parse方法中,我们创建了一个名为MyItem的新Item,并将它的name字段和url字段设置为了固定值。这个Item将会被传递给Pipeline进行存储。

示例一

下面我们通过一个具体的示例来演示如何使用Scrapy和MongoDB进行数据交互。

假设我们要从豆瓣电影中爬取正在热映的电影信息,并将电影的标题、评分、导演、主演和封面链接保存到MongoDB中。

首先,创建一个新的Scrapy项目:

$ scrapy startproject doubanmovie

在项目中创建一个新的名为movies.py的Spider:

import scrapy
from doubanmovie.items import DoubanmovieItem

class MoviesSpider(scrapy.Spider):
    name = 'movies'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/']

    def parse(self, response):
        movie_links = response.xpath('//div[@id="screening"]//a[@data-psource]/@href')
        for link in movie_links:
            yield scrapy.Request(link.extract(), callback=self.parse_movie)

    def parse_movie(self, response):
        item = DoubanmovieItem()
        item['title'] = response.xpath('//h1/span/text()').extract_first()
        item['score'] = response.xpath('//strong[@class="rating_num"]/text()').extract_first()
        item['directors'] = response.xpath('//span[contains(text(),"导演")]/following-sibling::span/a/text()').extract()
        item['stars'] = response.xpath('//span[contains(text(),"主演")]/following-sibling::span/a/text()').extract()
        item['image_url'] = response.xpath('//img[@rel="v:image"]/@src').extract_first()
        yield item

在上述代码中,我们定义了一个名为MoviesSpider的Spider,在parse方法中解析正在热映的电影页面,并将每个电影的详情页面链接传递给parse_movie方法。在parse_movie方法中,我们解析了电影详情页面中的电影标题、评分、导演、主演和封面链接,并将它们保存到一个新的名为DoubanmovieItem的Item中。

接下来,创建一个新的Pipeline,并将它配置到settings.py中:

import pymongo

class MongoDBPipeline(object):

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

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

    def process_item(self, item, spider):
        collection_name = item.__class__.__name__
        self.db[collection_name].insert(dict(item))
        return item

settings.py中添加以下内容:

ITEM_PIPELINES = {
   'doubanmovie.pipelines.MongoDBPipeline': 300,
}

MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'doubanmovie'

在上述代码中,我们将Pipeline的名称设置为了doubanmovie.pipelines.MongoDBPipeline,将MongoDB的连接地址设置为了mongodb://localhost:27017/,将数据库名称设置为了doubanmovie

最后,运行这个Spider:

$ scrapy crawl movies

Spider将会将爬取到的电影信息存储到MongoDB中。可以在MongoDB的命令行中使用以下命令查询保存的数据:

$ mongo
> use doubanmovie
> db.doubanmovieitem.find()

示例二

下面我们再通过一个示例来演示如何在Scrapy中使用MongoDB进行数据存储。

假设我们要从某个电商网站爬取iPhone的信息,并将名称、价格、尺寸和颜色保存到MongoDB中。

首先,创建一个新的Scrapy项目:

$ scrapy startproject iphone

在项目中创建一个新的名为phones.py的Spider:

import scrapy
from iphone.items import IphoneItem

class PhonesSpider(scrapy.Spider):
    name = 'phones'
    allowed_domains = ['example.com']
    start_urls = ['https://www.example.com/phones/']

    def parse(self, response):
        phone_links = response.xpath('//a[contains(@href,"/iphone/")]')
        for link in phone_links:
            yield scrapy.Request(link.xpath('@href').extract_first(), callback=self.parse_phone)

    def parse_phone(self, response):
        item = IphoneItem()
        item['name'] = response.xpath('//h1/text()').extract_first()
        item['price'] = response.xpath('//span[@class="price"]/text()').extract_first()
        item['size'] = response.xpath('//dt[text()="尺寸"]/following-sibling::dd/text()').extract_first()
        item['color'] = response.xpath('//dt[text()="颜色"]/following-sibling::dd/text()').extract_first()
        yield item

在上述代码中,我们定义了一个名为PhonesSpider的Spider,在parse方法中解析电商网站的iPhone页面,并将每个iPhone的详情页面链接传递给parse_phone方法。在parse_phone方法中,我们解析了iPhone详情页面中的名称、价格、尺寸和颜色,并将它们保存到一个新的名为IphoneItem的Item中。

接下来,创建一个新的Pipeline,并将它配置到settings.py中:

import pymongo

class MongoDBPipeline(object):

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

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

    def process_item(self, item, spider):
        collection_name = item.__class__.__name__
        self.db[collection_name].insert(dict(item))
        return item

settings.py中添加以下内容:

ITEM_PIPELINES = {
   'iphone.pipelines.MongoDBPipeline': 300,
}

MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'phone'

在上述代码中,我们将Pipeline的名称设置为了iphone.pipelines.MongoDBPipeline,将MongoDB的连接地址设置为了mongodb://localhost:27017/,将数据库名称设置为了phone

最后,运行这个Spider:

$ scrapy crawl phones

Spider将会将爬取到的iPhone信息存储到MongoDB中。可以在MongoDB的命令行中使用以下命令查询保存的数据:

$ mongo
> use phone
> db.iphoneitem.find()

至此,我们已经成功实现了在Scrapy中使用MongoDB进行数据存储。

阅读剩余 82%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Scrapy与MongoDB交互过程 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • python实现请求数据包签名

    要实现请求数据包签名,有多种方式,我们这里介绍一种常见的方式。 步骤 安装必要的库 需要安装 requests 和 hashlib 两个库。 pip install requests hashlib 准备请求参数 将所有的请求参数按照参数名的字典序升序排序,然后按照 key1=value1&key2=value2…keyN=valueN 的方式进…

    人工智能概览 2023年5月25日
    00
  • Python OpenCV学习之图像滤波详解

    Python OpenCV学习之图像滤波详解 本文将详细讲解Python OpenCV中的图像滤波技术,内容涵盖了图像滤波的基本概念、不同类型的滤波器及代码示例。如果你想要深入学习Python OpenCV中的图像处理技术,那么本篇文章将会是一个很好的起点。 滤波的基本概念 图像滤波可以理解为在图像上应用一个特定的操作,以达到消除噪声、增强图像等目的。 滤波…

    人工智能概论 2023年5月24日
    00
  • ubuntu系统中nginx启动脚本

    让我来为您详细讲解在Ubuntu系统中启动Nginx的脚本。 1. 安装Nginx 在安装Nginx之前,请确保已经安装了Ubuntu系统,并具有sudo权限。在安装Nginx之前,您需要使用以下命令更新你的系统: sudo apt update sudo apt upgrade 接下来,运行以下命令以安装Nginx: sudo apt install ng…

    人工智能概览 2023年5月25日
    00
  • Nginx配置https的实现

    Nginx配置https的实现需要进行以下几个步骤: 1. 申请SSL证书 首先需要申请可信的SSL证书,可以选择一些常见的证书颁发机构(CA)如LetsEncrypt等,也可以自己生成证书。如果是自己生成,则需要使用openssl命令生成证书: openssl req -x509 -newkey rsa:4096 -keyout key.pem -out …

    人工智能概览 2023年5月25日
    00
  • python使用celery实现异步任务执行的例子

    下面是详细讲解Python使用Celery实现异步任务执行的完整攻略。 Celery 简介 Celery 是一个 Python 分布式任务队列,在异步执行任务和调度任务方面表现得非常优秀。它通常被用来处理高负载负责耗时的任务,例如邮件发送、数据处理等。Celery 是一个开源的分布式任务队列,使用 Python 编写。它基于消息传递,并允许您通过任务队列和工…

    人工智能概览 2023年5月25日
    00
  • 浅谈服务发现和负载均衡的来龙去脉

    浅谈服务发现和负载均衡的来龙去脉 什么是服务发现 服务发现是指客户端应用程序通过查询服务发现系统或者中心组件来获取可用服务实例的列表的过程。服务发现对于微服务架构非常关键,因为在微服务中服务实例的数量很多,且容易变化。服务发现的常见实现方式有两种:客户端发现和服务端发现。 客户端发现 客户端发现是指客户端应用程序负责发现可用服务实例并从中选择一个来进行请求的…

    人工智能概览 2023年5月25日
    00
  • python利用platform模块获取系统信息

    使用Python中的platform模块可以获取到当前系统的相关信息,例如操作系统名称、版本号、机器的网络名称、Python版本信息等。 下面是使用platform模块获取系统信息的示例代码: import platform # 获取操作系统名称及版本号 print(‘操作系统名称及版本号:’, platform.platform()) # 获取操作系统版本…

    人工智能概览 2023年5月25日
    00
  • jquery ready函数深入分析

    jQuery Ready函数深入分析 什么是jQuery Ready函数? jQuery Ready 函数是一个用于在文档完全加载并解析后执行的事件处理程序。它被广泛使用来确保所有的 DOM 就绪后再执行 JavaScript。 为什么需要使用Ready函数 在JavaScript中,通常会尝试在DOM加载完毕之前修改/操作DOM元素,这会导致错误或元素无法…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部