(六--二)scrapy框架之持久化操作

scrapy框架之持久化操作

  • 基于终端指令的持久化存储
  • 基于管道的持久化存储

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

  • 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作。
执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储
    scrapy crawl 爬虫名称 -o xxx.json
    scrapy crawl 爬虫名称 -o xxx.xml
    scrapy crawl 爬虫名称 -o xxx.csv

以爬取糗事百科(https://www.qiushibaike.com/text/)为例

import scrapy

class QiubaiSpider(scrapy.Spider):
    name = ‘qiubai‘                                  # 表示该爬虫文件的名称
    allowed_domains = [‘www.qiushibaike.com/text/‘]
    start_urls = [‘https://www.qiushibaike.com/text/‘]
    # 解析函数
    def parse(self, response): # response就是对起始url发起请求后,对应的响应对象
        author_list = response.xpath(‘//div[@id="content-left"]/div‘)

        all_data = []
        for div in author_list:       # extract_first()可以将xpath返回列表中第一个列表元素进行extract解析操作
            author = div.xpath(‘./div/a[2]/h2/text()‘).extract_first()       # extract()可以将Selector对象中存储的数据进行解析操作        author = div.xpath(‘./div/a[2]/h2/text()‘).extract()
            content = div.xpath(‘./a/div/span/text()‘).extract_first()

            dict={
                ‘author‘:author,
                ‘content‘:content
            }
            all_data.append(dict)
        return all_data  # 可迭代的对象

在终端写入

执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储
    scrapy crawl 爬虫名称 -o xxx.json
    scrapy crawl 爬虫名称 -o xxx.xml
    scrapy crawl 爬虫名称 -o xxx.csv

2 基于管道的持久化存储

scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:

    items.py:数据结构模板文件。定义数据属性。
    pipelines.py:管道文件。接收数据(items),进行持久化操作。

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

1 爬虫文件qiubai.py

# -*- coding: utf-8 -*-
import scrapy
from ..items import FirstProjectItem
‘‘‘基于管道存储‘‘‘

‘‘‘
1 爬虫文件中解析数据
2 【items.py】将解析到的数据值全部分装在item对象中
3 pipelines.py
4 settings.py配置文件

‘‘‘
class QiubaiSpider(scrapy.Spider):
    name = ‘qiubai‘
    allowed_domains = [‘www.qiushibaike.com/text/‘]
    start_urls = [‘https://www.qiushibaike.com/text/‘]

    def parse(self, response):

        author_list = response.xpath(‘//div[@id="content-left"]/div‘)

     for div in author_list:

            author = div.xpath(‘./div/a[2]/h2/text()‘).extract_first()
            # author = div.xpath(‘./div/a[2]/h2/text()‘)[0].extract()
            content = div.xpath(‘./a/div/span/text()‘).extract_first()
        ----------------------------------------------------
            items = FirstProjectItem()

            items["author"] = author         重点
            items["content"] = content
            # 提交给管道
            yield items        ----------------------------------------------------

2 items.py

import scrapy

# items会实例化一个items对象; 用来存储解析到的数据值

class FirstProjectItem(scrapy.Item):
    # define the fields for your item here like:   -----------------------------------------
    author = scrapy.Field()
    content = scrapy.Field()    重点  你在第一步中有几个要持久化的这就写上对应的     -----------------------------------------

3 pipelines.py

# 爬虫文件每向管道提交一次item则process_item方法就会被执行一次class FirstProjectPipeline(object):                # item就是爬虫文件提交过来的
    def process_item(self, item, spider):
        return item

4 settings.py

# 第67行ITEM_PIPELINES = {
   ‘first_project.pipelines.FirstProjectPipeline‘: 300,
}

依据上面四步我们就学会了基本的“基于管道的持久化”的步骤,但是我们要在piplines.py做一些操作

只是修改第3步pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

class FirstProjectPipeline(object):
# 每次都会打开多次文件,我们重写 open_spider方法来开文件一次
    fp = None
    def open_spider(self, spider):
        print(‘开始爬虫‘)
        self.fp = open(‘qiubai1.txt‘, ‘w‘, encoding=‘utf-8‘)

    def process_item(self, item, spider):

        self.fp.write(item[‘author‘]+‘:‘+item["content"]+"\n")    # 生成qiubai1.txt文件
        return item

    def close_spider(self,spider):
        print(‘结束爬虫‘)
        self.fp.close()

3 写入数据库

import pymysqlclass MysqlPipline(object):
    cursor = None
    conn = None
    def open_spider(self, spider):
        print(‘mysql开始‘)
        self.conn = pymysql.connect(host=‘127.0.0.1‘, user=‘root‘, password=‘123456‘, port=3306, db=‘s18‘,charset=‘utf8‘)
    def process_item(self, item, spider):
        sql = "insert into t_qiubai VALUES (‘%s‘,‘%s‘)"%(item["author"], item["content"])
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
        return item

    def close_spider(self, spider):
        print(‘mysql结束‘)
        self.cursor.close()
        self.conn.close()

settings.py

ITEM_PIPELINES = {
   ‘first_project.pipelines.FirstProjectPipeline‘: 300,
   ‘first_project.pipelines.MysqlPipline‘: 400,           # settings 配置      值越小 越优先
}

4 写入redis数据库

wins安装redis

import redis

class RedisPipline(object):

    r = None

    def open_spider(self, spider):
        print(‘redis开始‘)
        self.r = redis.Redis(host=‘127.0.0.1‘, port=6379)

    def process_item(self, item, spider):
        dict = {
            ‘author‘:item[‘author‘],
            ‘content‘:item[‘content‘]
        }
        self.r.lpush(‘data‘, dict)
        return item

    def close_spider(self, spider):
        print(‘redis结束‘)

settings.py设置

ITEM_PIPELINES = {
   ‘first_project.pipelines.FirstProjectPipeline‘: 300,
   ‘first_project.pipelines.RedisPipline‘: 500,
}

我们可以去redis里面查看

key *   # 查看所有的key
lrange key 0 -1  # 从头到尾查看key

原文地址:https://www.cnblogs.com/a438842265/p/10212463.html

时间: 2024-10-01 20:48:51

(六--二)scrapy框架之持久化操作的相关文章

scrapy框架之持久化操作

1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储 scrapy crawl 爬虫名称 -o xxx.json scrapy crawl 爬虫名称 -o xxx.xml scrapy crawl 爬虫名称 -o xxx.csv 2.基于管道的持久化存储 scrapy框架中已经为我们专门集成好了高效.便捷的持

6 scrapy框架之分布式操作

分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux:   redis-server redis.conf windows: redis-server.exe redis-windows.conf 2.对redis配置文件进行配置: - 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis - 将yes该为no:protected-mode no,表示可以让其他ip操作redis 二.scrapy基于redis的数据持久化操作流程 1.安装scrapy

Scrapy框架之分布式操作

一.分布式爬虫介绍 分布式爬虫概念:多台机器上执行同一个爬虫程序,实现网站数据的分布爬取. 1.原生的Scrapy无法实现分布式爬虫的原因? 调度器无法在多台机器间共享:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url. 管道无法给多台机器共享:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储. 2.scrapy-redis组件 scrapy-redis是专门为scrapy框架开发的一套组件.该组件可以解决上

Scrapy 框架,持久化文件相关

持久化相关 相关文件 items.py 数据结构模板文件.定义数据属性. pipelines.py 管道文件.接收数据(items),进行持久化操作. 持久化流程 1.爬虫文件爬取到数据后,需要将数据封装到 items对象 中. 2.使用 yield 关键字将items对象提交给 pipelines 管道进行持久化操作. 3.在管道文件中的 process_item 方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象中存储的数据进行持久化存储 4.settings.

Scrapy框架实现持久化存储

硬盘存储 (1) 基于终端指令 * 保证parse方法返回一个可迭代类型的对象(存储解析到页面内容) * 使用终端指定完成数据存储到磁盘文件的操作     scrapy crawl 爬虫文件名称 -o 磁盘文件.后缀 def parse(self, response): # 建议使用xpath进行解析(框架集成了xpath解析的接口) div_list = response.xpath('//div[@id="content-left"]/div ') # 存储解析到的页面数据 dat

爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline、对接Selenium

1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被发送给Spider,在发送给Spider之前,Response会首先经过Spider Middleware处理,当Spider处理生成Item和Request之后,Item Request还会经过Spider Middleware的处理. Spider Middleware有三个作用: 我们可以在D

(六--一)scrapy框架简介和基础应用

一 什么是scrapy框架 官方解释 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫 自己理解 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功

Scrapy框架初级篇

1.概念:scrapy.框架. Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板.对于框架的学习,重点是要学习其框架的特性.各个功能的用法即可.2.安装:Linux: pip3 install scrapy Windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu/~go

Scrapy框架基础应用和持久化存储

一.Scrapy框架的基础应用 1.Scrapy的概念 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板. 2.安装 windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted c. 进入下载目录,执行 pip3 in