今日概要

基于终端指令的持久化存储
基于管道的持久化存储
今日详情

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

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

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配置文件中开启管道

小试牛刀:将糗事百科首页中的段子和作者数据爬取下来,然后进行持久化存储

  • 爬虫文件:qiubaiDemo.py
# -*- coding: utf-8 -*-
import scrapy
from secondblood.items import SecondbloodItemclass QiubaidemoSpider(scrapy.Spider):name = 'qiubaiDemo'allowed_domains = ['www.qiushibaike.com']start_urls = ['http://www.qiushibaike.com/']def parse(self, response):odiv = response.xpath('//div[@id="content-left"]/div')for div in odiv:# xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。author = div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first()author = author.strip('\n')#过滤空行content = div.xpath('.//div[@class="content"]/span/text()').extract_first()content = content.strip('\n')#过滤空行#将解析到的数据封装至items对象中item = SecondbloodItem()item['author'] = authoritem['content'] = contentyield item#提交item到管道文件(pipelines.py)- items文件:items.pyimport scrapyclass SecondbloodItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()author = scrapy.Field() #存储作者content = scrapy.Field() #存储段子内容

管道文件: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.htmlclass SecondbloodPipeline(object):#构造方法def __init__(self):self.fp = None  #定义一个文件描述符属性#下列都是在重写父类的方法:#开始爬虫时,执行一次def open_spider(self,spider):print('爬虫开始')self.fp = open('./data.txt', 'w')#因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。def process_item(self, item, spider):#将爬虫程序提交的item进行持久化存储self.fp.write(item['author'] + ':' + item['content'] + '\n')return item#结束爬虫时,执行一次def close_spider(self,spider):self.fp.close()print('爬虫结束')

** 配置文件:settings.py**

#开启管道
ITEM_PIPELINES = {'secondblood.pipelines.SecondbloodPipeline': 300, #300表示为优先级,值越小优先级越高
}

2.1 基于mysql的管道存储

小试牛刀案例中,在管道文件里将item对象中的数据值存储到了磁盘中,如果将item数据写入mysql数据库的话,只需要将上述案例中的管道文件修改成如下形式:

- 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#导入数据库的类
import pymysql
class QiubaiproPipelineByMysql(object):conn = None  #mysql的连接对象声明cursor = None#mysql游标对象声明def open_spider(self,spider):print('开始爬虫')#链接数据库self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='123456',db='qiubai')#编写向数据库中存储数据的相关代码def process_item(self, item, spider):#1.链接数据库#2.执行sql语句sql = 'insert into 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:print(e)self.conn.rollback()return itemdef close_spider(self,spider):print('爬虫结束')self.cursor.close()self.conn.close()

- settings.py

ITEM_PIPELINES = {'qiubaiPro.pipelines.QiubaiproPipelineByMysql': 300,
}

2.2 基于redis的管道存储

小试牛刀案例中,在管道文件里将item对象中的数据值存储到了磁盘中,如果将item数据写入redis数据库的话,只需要将上述案例中的管道文件修改成如下形式:

# -*- 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.htmlimport redisclass QiubaiproPipelineByRedis(object):conn = Nonedef open_spider(self,spider):print('开始爬虫')#创建链接对象self.conn = redis.Redis(host='127.0.0.1',port=6379)def process_item(self, item, spider):dict = {'author':item['author'],'content':item['content']}#写入redis中self.conn.lpush('data', dict)return item

- pipelines.py文件

ITEM_PIPELINES = {'qiubaiPro.pipelines.QiubaiproPipelineByRedis': 300,
}
  • 面试题:如果最终需要将爬取到的数据值一份存储到磁盘文件,一份存储到数据库中,则应该如何操作scrapy?

- 答:管道文件中的代码为

#该类为管道类,该类中的process_item方法是用来实现持久化存储操作的。
class DoublekillPipeline(object):def process_item(self, item, spider):#持久化操作代码 (方式1:写入磁盘文件)return item#如果想实现另一种形式的持久化操作,则可以再定制一个管道类:
class DoublekillPipeline_db(object):def process_item(self, item, spider):#持久化操作代码 (方式1:写入数据库)return item

在settings.py开启管道操作代码为:

#下列结构为字典,字典中的键值表示的是即将被启用执行的管道文件和其执行的优先级。
ITEM_PIPELINES = {'doublekill.pipelines.DoublekillPipeline': 300,'doublekill.pipelines.DoublekillPipeline_db': 200,
}#上述代码中,字典中的两组键值分别表示会执行管道文件中对应的两个管道类中的process_item方法,实现两种不同形式的持久化操作。

【python爬虫】第11章——scrapy框架持久化存储相关推荐

  1. python爬虫的基本原理以及scrapy框架的使用

    正则表达式基础 正则表达式用于处理字符串,拥有自己独立的语法以及一个独立的处理引擎. 不同提供正则表达式的语言里正则表达式的语法都式一样. . 和 * + . 匹配任意一个字符 *匹配0或多次前面出现 ...

  2. [python爬虫之路day19:] scrapy框架初入门day1——爬取百思不得姐段子

    好久没学习爬虫了,今天再来记录一篇我的初入门scrapy. 首先scrapy是针对大型数据的爬取,简单便捷,但是需要操作多个文件以下介绍: 写一个爬虫,需要做很多的事情.比如: 发送网络请求, 数据解 ...

  3. 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息

    使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...

  4. Python爬虫进阶三之Scrapy框架安装配置

    初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...

  5. Python 爬虫进阶三之 Scrapy 框架安装配置

    初级的爬虫我们利用 urllib 和 urllib2 库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架 Scrapy,这安装过程也是煞费苦心哪,在此整理如下. 官网 官方安装文档 安装p ...

  6. Python爬虫实战之利用Scrapy框架爬取传智播客课程数据

    1.文件结构: 2.lesson.py代码 import scrapy from ts.items import TsItem from scrapy.http import Requestclass ...

  7. python爬虫从入门到实战笔记——第四章Scrapy框架

    推荐阅读: python爬虫从入门到实战笔记--第一章爬虫原理和数据爬取 python爬虫从入门到实战笔记--第二章非结构化数据和结构化数据的提取 python爬虫从入门到实战笔记--第三章动态HTM ...

  8. python 全栈开发,Day137(爬虫系列之第4章-scrapy框架)

    python 全栈开发,Day137(爬虫系列之第4章-scrapy框架) 一.scrapy框架简介 1. 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所 ...

  9. 爬虫 第六讲 Scrapy框架

    文章目录 爬虫 第六讲 Scrapy框架 一.Scrapy框架 Scrapy简介 工作流程 Scrapy入门 pipline使用 1.scrapy.Request知识点 2.item的介绍和使用 3. ...

  10. Python爬虫学习第二章-1-requests模块简介

    Python爬虫学习第二章-1-requests模块简介   这一章主要是介绍requests模块的相关知识以及使用 1.requests模块简介: 概述:是python中原生的一款基于网络请求的模块 ...

最新文章

  1. left join 临时表_图解SQL的JOIN
  2. python unittest断言大全_Python-unittest框架 断言使用
  3. OpenGL函数:wglCreateContext
  4. 用代码的方式增加servlet mapping定义
  5. .NET Core开发日志——结构化日志
  6. HDMI视频光端机传输故障如何调试?
  7. MySQL---数据库切分
  8. POJ-1050(DP)
  9. qt截图怎样实现橡皮擦_利用QT实现截屏的四种方法
  10. matlab2c使用c++实现matlab函数系列教程-rank函数
  11. [猎豹网校]数据结构与算法_C#语言
  12. JZOJ 3859.【NOIP2014八校联考第3场第2试10.5】孤独一生(sprung)
  13. 你为什么被拒?盘点面试失败的3大原因
  14. Java线程(五):Executors、ThreadFactory
  15. UIUC计算机科学系博士,PhD捷报|计算机博士全美TOP5!清华首批UIUC CS PhD全奖!恭喜Nuts清华学员!...
  16. 爬有道在线翻译(已完善)
  17. <架构师必修课>-nginx
  18. Java 定时任务详解
  19. 零基础学习python(鱼C论坛)
  20. python可视化计算器_GUI最新:python GUI模拟实现计算器_爱安网 LoveAn.com

热门文章

  1. 不吹不黑聊聊前端框架--尤雨溪Live整理
  2. 规则引擎groovy
  3. Python安装 chardet
  4. 交大计算机软件学院,上海交通大学软件学院
  5. Unity桌面程序读取Excel表格
  6. Drools规则引擎快速入门(一)
  7. [源码解读]position_estimator_inav_main解读(如何启动光流)
  8. 人大金仓数据库高可用集群部署教程
  9. 用python操作浏览器的三种方式_经验 | python 操作浏览器的三种方式
  10. Dual Thrust策略