Scarpy框架持久化存储

一、介绍

  持久化存储操作分为两类:磁盘文件数据库
  而磁盘文件存储方式又分为:基于终端指令基于管道

二、基于终端指令的持久化存储

  Scrapy是通过 scrapy 命令行工具进行控制的。 这里我们称之为 “Scrapy tool” 以用来和子命令进行区分。 对于子命令,我们称为 “command” 或者 “Scrapy commands”。

1、保证parse方法返回一个可迭代类型的对象(存储解析到的页面内容)

  改写parse方法,让方法返回值为迭代器。

class QiubaiproSpider(scrapy.Spider):
    name = 'qiubaipro'
    # allowed_domains = ['www.qiushibaike.com/text']  # 图片等信息可能不属于指定域名之下
    start_urls = ['https://www.qiushibaike.com/text/']  # 注意修改默认协议头
    def parse(self, response):
        # 建议使用xpath来执行指定内容的解析(Scrapy已经集成好了xpath解析的接口)
        # 段子的内容和作者
        div_list = response.xpath('//div[@id="content-left"]/div')

        # 存储解析到的页面数据
        data_list = []

        for div in div_list:
            author = div.xpath('./div/a[2]/h2/text()').extract_first()  # './'表示解析当前局部div; a[2]表示第二个a标签
            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()  # './/'表示当前局部所有元素;@class匹配类属性

            dict = {
                'author': author,
                'content': content
            }
            data_list.append(dict)

        # parse方法的返回值必须是迭代器或空
        return data_list

2、使用终端指令完成数据存储到指定磁盘文件中

  执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储。
  常用文件格式:json、xml、csv、txt等。

# scrapy crawl 爬虫文件名称 -o 磁盘文件.后缀
$ scrapy crawl qiubaipro -o qiubai.csv --nolog
$ ls
firstBlood  qiubai.csv  readme.md   scrapy.cfg

3、csv持久化存储效果

csv表格

三、基于管道的持久化存储

  scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。

1、持久化需要的项目文件

  想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:

items.py:数据结构模板文件,定义数据属性。存储解析到的页面数据
pipelines.py:管道文件。接收数据(items),进行持久化存储的相关操作。

2、持久化实现流程

  1. 爬虫文件爬取到数据后,需要将数据封装到items对象中。
  2. 使用yield关键字将items对象提交给pipelines管道进行持久化操作。
  3. 在管道文件中的process_item方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象中存储的数据进行持久化存储
  4. settings.py配置文件中开启管道

3、代码示例

(1)将解析到的数据值(author和content)存储到items对象(存储前先声明item属性)

  在爬虫文件qiubaipro.py中引入了项目的items.py文件中的FirstbloodItem类。

# -*- coding: utf-8 -*-
import scrapy
from firstBlood.firstBlood.items import FirstbloodItem

class QiubaiproSpider(scrapy.Spider):
    name = 'qiubaipro'
    # allowed_domains = ['www.qiushibaike.com/text']  # 图片等信息可能不属于指定域名之下
    start_urls = ['https://www.qiushibaike.com/text/']  # 注意修改默认协议头

    def parse(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')
        # 存储解析到的页面数据
        data_list = []
        for div in div_list:
            author = div.xpath('./div/a[2]/h2/text()').extract_first()
            content = div.xpath('.//div[@class="content"]/span/text()').extract_first() 
            
            # 1、将解析到的数据值(author和content)存储到items对象(存储前先声明item属性)
            item = FirstbloodItem()
            item['author'] = author
            item['content'] = content

注意:
  1)解析的数据存储到items对象前要先声明item属性。
  2)items.py文件内容配置如下:

import scrapy

class FirstbloodItem(scrapy.Item):
    # 必须遵从如下属性声明规则
    # name = scrapy.Field()

    # 声明item属性
    author = scrapy.Field()  # 存储解析到的作者
    content = scrapy.Field()  # 存储解析到的内容信息

(2)yield将item对象提交给管道进行持久化存储操作

  qiubaipro.py文件中:

import scrapy
from firstBlood.items import FirstbloodItem

class QiubaiproSpider(scrapy.Spider):
    def parse(self, response):
        """省略代码"""
        for div in div_list:
            """省略代码"""

            # 2、yield将item对象提交给管道进行持久化存储操作
            yield item

(3)在管道文件(pipelines.py)中编写代码完成数据存储的操作

class FirstbloodPipeline(object):
    fp = None
    def open_spider(self, spider):
        """
        该方法只会在爬虫开始爬数据的时候被调用一次
        :param spider:
        :return:
        """
        print("开始爬虫")
        # 在该方法中打开文件
        self.fp = open('./qiubai_pipe.txt', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        """
        接收爬虫文件中提交的item对象,并对item对象中存储的页面数据进行持久化存储
        每当爬虫文件向管道提交一次item,porcess_item方法就会执行一次
        :param item: 表示接收到的item对象
        :param spider:
        :return:
        """
        # 取出Item对象中存储的数据值
        author = item['author']
        content = item['content']
        # 将item对象中存储的数据进行持久化存储
        # with open('./qiubai_pipe.txt', 'w', encoding='utf-8') as fp:
        self.fp.write(author + ":" + content+ '\n\n\n')  # 写入数据
        return item

    def close_spider(self, spider):
        """
        该方法只会在爬虫结束时被调用一次
        :param spider:
        :return:
        """
        print("爬虫结束")
        # 关闭文件
        self.fp.close()

注意:
  1)每当爬虫文件向管道提交一次item,process_item方法就会执行一次,因此最后输出的爬虫结果只保存了最后一次打开写入的数据,前面的数据均被覆盖。
  2)使用open_spider方法特性:只会在爬虫开始爬数据的时候被调用一次。可解决多次打开文件的问题。
  3)使用close_spider方法特性:只会在爬虫结束时被调用一次。可在爬虫结束后关闭文件。

(4)在配置文件(settings.py)中开启管道操作

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'firstBlood.pipelines.FirstbloodPipeline': 300,      # 优先级
}

(5)执行爬虫操作

$ scrapy crawl qiubaipro --nolog

四、基于数据库的持久化存储

1、基于数据库编码流程

  1. 将解析到的页面数据存储到items对象
  2. 使用yield关键字将items提交给管道文件进行处理
  3. 在管道文件中编写代码完成数据存储的操作
  4. 在配置文件中开启管道操作

2、基于mysql的管道存储

3、基于redis的管道存储

猜你喜欢

转载自www.cnblogs.com/xiugeng/p/10051913.html
今日推荐