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- -*-
import scrapy
from ..items import FirstProjectItem
'''基于管道存储''' '''
爬虫文件中解析数据
【items.py】将解析到的数据值全部分装在item对象中
pipelines.py
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()')[].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': ,
}

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

只是修改第3步pipelines.py

# -*- coding: utf- -*-

# 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 pymysql
class 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': ,
'first_project.pipelines.MysqlPipline': , # 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

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

  1. scrapy框架之持久化操作

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

  2. 爬虫开发8.scrapy框架之持久化操作

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  3. scrapy框架之分布式操作

    分布式概念 分布式爬虫: 1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取. 2.原生的scrapy是不可以实现分布式爬虫? a)调度器无法共享 b)管道无法共享 3.scrapy- ...

  4. 6 scrapy框架之分布式操作

    分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux:   redis-server redis.conf windows: redis-server.exe redis-wi ...

  5. scrapy框架的持久化存储

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

  6. 爬虫开发14.scrapy框架之分布式操作

    分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux:   redis-server redis.conf windows: redis-server.exe redis-wi ...

  7. scrapy框架之CrawlSpider操作

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...

  8. 爬虫开发11.scrapy框架之CrawlSpider操作

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...

  9. Scrapy 框架,持久化文件相关

    持久化相关 相关文件 items.py 数据结构模板文件.定义数据属性. pipelines.py 管道文件.接收数据(items),进行持久化操作. 持久化流程 1.爬虫文件爬取到数据后,需要将数据 ...

随机推荐

  1. QQ企业通-----客户端消息发送模块设计---知识点

    Guid.NewGuid 方法    初始化 Guid 结构的新实例. Guid 结构   表示全局唯一标识符 (GUID). Encoding..::.Unicode 属性 获取使用 Little- ...

  2. Date.parse在IE/Firefox下有兼容性问题

    原因: IE和Firefox是不支持含有'-'字符的日期格式,如:"2018-11-23" 解决方法: 日期格式 'yyyy-mm-dd' 改成 'yyyy/mm/dd' 代码: ...

  3. 检测皮肤PH值、感知你的便意,健康是可穿戴设备的新风口?

    在经历最初的喧嚣与疯狂后,可穿戴设备近年来有些低调和沉寂.换句话说,虽然可穿戴设备销量在持续走高,但从形态和功能上,呈现出高度一致性.这似乎也在证明着,可穿戴设备已成为寻常可见的普通产品而已.不过在迈 ...

  4. MariaDB——SQL语句分类汇总

    常用SQL语句汇总 SQL语句在所有的关系型数据库中都是通用的,算起来sql语句也是一门语言,只不过这门语言的主要操作对象是关系型的数据库,其中最常用的还是查询相关的语句. sql语句主要分为: DQ ...

  5. android数据的四种存储方式之一——SharedPreference

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  6. java web开发缓存方案,ehcache和redis哪个更好

    Ehcache在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apac ...

  7. VScode禁用alt+key触发菜单栏快捷键

    因为用惯了Mac,突然改回Windows,但是已经习惯了按Command键.所以在Windows下把vscode的快捷键全改成alt+key了.但是Windows的alt+key快捷键就比较烦人了.所 ...

  8. linux systemctl命令

    转自systemctl详解 systemctl 是系统服务管理器命令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconf ...

  9. InnoDB 和 MyISAM的索引区别

    MyISAM索引实现 MyISAM索引文件和数据文件是分离的,索引文件的data域保存记录所在页的地址(物理存储位置),通过这些地址来读取页,进而读取被索引的行数据. MyISAM的索引原理图如下,C ...

  10. Google宣布安全奖励项目(GPSRP)覆盖上亿的 Android 应用程序

    自 2010 年推出除虫赏金项目以来,谷歌已经向安全研究人员支付了超过 1500 万美元的奖励.今天,这家科技巨头宣布进一步拓展 Google Play 安全奖励项目(GPSRP)的范围,以覆盖上亿的 ...