Scrapy爬虫异步框架之持久化存储(一篇文章齐全)

1、Scrapy框架初识(点击前往查阅)

2、Scrapy框架持久化存储

3、Scrapy框架内置管道(点击前往查阅)

4、Scrapy框架中间件(点击前往查阅)

5、Scrapy框架全站、分布式、增量式爬虫 

Scrapy 是一个开源的、基于Python的爬虫框架,它提供了强大而灵活的工具,用于快速、高效地提取信息。Scrapy包含了自动处理请求、处理Cookies、自动跟踪链接、下载中间件等功能

Scrapy框架的架构图(先学会再来看,就能看懂了!)

 一、持久化存储(文本)

1:基于终端指令的存储

基于终端指令:简单,但是局限性较大。

scrapy crawl myspider -o project_name.后缀名

命令讲解: (例:scrapy crawl baidu -o baidudata.json

  • myspider:执行的爬虫文件名
  • project_name.后缀名:想要保存的文件名和格式(具体格式参考下面)

终端指令的方法只可以将parse方法的返回值存储到指定后缀的文本文件中。且格式只能是如下展示的。

1.1:执行代码

import scrapyclass BaiduSpider(scrapy.Spider):# 爬虫文件的唯一标识(就是你创建的爬虫文件夹名字)name = "baidu"# 允许的域名,这个代表你只能访问这个网址的子域名,其他的都会禁止(这个我们会注释掉,不会打开)# allowed_domains = ["www.xxx.com"]# 起始的url列表,网址可以随便放,可以放多个,列表中的url都会被框架进行异步请求发送。start_urls = ["https://www.xiachufang.com/category/40076/"]# 数据解析:parse调用的次数取决于start_urls列表元素的个数def parse(self, response):  # response参数就表示响应对象# 创建一个空列表用于存储all_data = []# 利用xpath解析:(scrapy内置xpath,无需另外导入)li_list = response.xpath('//div[@class="pure-u-3-4 category-recipe-list"]//ul/li')for li in li_list:# 1、scrapy中的xpath会返回Selector对象,我们需要的数据在该对象data属性中(extract可以实现该功能,)# 2、extract_first()就是取第一个,因为文本两边有空格,所以.strip() 可以去除两侧的空格title = li.xpath('.//p[1]/a/text()').extract_first().strip()author = li.xpath('.//p[4]/a/text()').extract_first().strip()# 将每次获取到的标题和作者添加到字典中dic = {'title': title,'author': author}# 将字典添加到列表中all_data.append(dic)# 爬取到的数据被作为parse方法的返回值return all_data

1.1:执行结果分析

此代码在这个Scrapy框架初识(点击前往查阅)代码上就加了前4步(如下图)。

  • 第5步:执行代码
  • 第6步:最后生成的文件Scrapy框架初识(点击前往查阅)

 基于终端指令存储就是这样的,虽然简单,但是局限性很大。

2:基于管道的存储(存入本地文件)

基于管道的形式:相比较终端复杂,但是灵活性很大。

管道存储so easy 只需5步

2.1:在爬虫文件中进行数据解析操作。

解析代码如下⬇️

import scrapyclass BaiduSpider(scrapy.Spider):# 爬虫文件的唯一标识(就是你创建的爬虫文件夹名字)name = "baidu"# 允许的域名,这个代表你只能访问这个网址的子域名,其他的都会禁止(这个我们会注释掉,不会打开)# allowed_domains = ["www.xxx.com"]# 起始的url列表,网址可以随便放,可以放多个,列表中的url都会被框架进行异步请求发送。start_urls = ["https://www.xiachufang.com/category/40076/"]# 数据解析:parse调用的次数取决于start_urls列表元素的个数def parse(self, response):  # response参数就表示响应对象# 创建一个空列表用于存储all_data = []# 利用xpath解析:(scrapy内置xpath,无需另外导入)li_list = response.xpath('//div[@class="pure-u-3-4 category-recipe-list"]//ul/li')for li in li_list:# 1、scrapy中的xpath会返回Selector对象,我们需要的数据在该对象data属性中(extract可以实现该功能,)# 2、extract_first()就是取第一个,因为文本两边有空格,所以.strip() 可以去除两侧的空格title = li.xpath('.//p[1]/a/text()').extract_first().strip()author = li.xpath('.//p[4]/a/text()').extract_first().strip()

2.2:创建一个item类型的对象。

创建的item对象,需要封装自己需要的变量。例如:我需要title、author两个变量(框架中有封装好item类型文件)

2.2.1:将解析到的数据存储到该对象中。

如何将解析好的数据存储到item对象中呢?各位看官接着往下看~

2.3:将item对象提交给管道。

什么是管道呢?管道在框架中在哪呢?就在这~

如何将item对象提交给管道呢?只需要 yield 关键字就可以了! 

2.4:在管道中实现process_item的函数,实现对item对象的接收,对其进行指定的持久化存储。

代码讲解:(return是有多个管道把数据传递给下一个,后面会讲解)

  • open_spider函数:这个函数只会在process_item函数之前之前执行一次,所以这就操作的空间了,我们可以先定义一个全局变量,然后在这个函数中创建一个文件句柄。
  • process_item函数:self调用写入数据就行了。
  • close_spider函数:该函数会在process_item函数完全执行结束之后调用一次,这个里边就关闭文件就行了。

错误演示:❌❌❌

可能会有同学会想到用这个方法来储存,这就要想到一个问题了,process_item函数会被执行很多次(执行的次数取决于爬虫文件提交的次数)所以这个方法肯定是不行的。

2.5:在配置文件中开启管道功能。

注释去掉就是开启了,后面的300是优先级的,如果有多个管道会用到,数字越小优先级越高,下面会讲~(另外UA或者Cookie一些反爬根据网站需求决定是否开启

 2.6:执行结果

 执行指令:my_spider就是你的爬虫文件名字

scrapy crawl my_spider

执行代码:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass CsdnPipeline:fp = None  # 全局变量。# 该函数只会被在process_item函数调用前被调用一次。def open_spider(self, item):# 创建文件self.fp = open('baidu.txt', 'w')# 该函数只会被在process_item函数完全执行结束后被调用一次。def close_spider(self, item):# 关闭文件self.fp.close()# 该函数是用来接收爬虫文件提交过来的item对象(此函数执行次数取决于爬虫文件提交的次数)def process_item(self, item, spider):  # item参数就表示接收到的item对象。# 将item中的数据取出来title = item['title']author = item['author']# 数据写入self.fp.write(title + ":" + author + '\n')return item

以我们设置的文件格式,文件名字储存好了。 

二、基于管道的存储(存入数据库)

首先肯定要先安装MySQL数据库的,没有安装可以参考最新版MySQL安装 & 配置 & 启动

还需要安装模块用于操作MySQL数据库

pip install pymsql

存到数据库步骤:(数据库要提前开启哦)

和存入本地文件唯一不同的地方就在第四步管道函数的编写,下面我们就把这方面重点分析一下~

1:settings中配置

前面还提到了 yield 的关键字,是提交给管道的,他优先提交给数字小的,也就是优先级高的。

2:管道原理剖析

还记得前面的 return吗?现在来填坑了!!!

如果 你需要一个管道就OK了下面不需要了,那OK不需要return也是可以的,但是,你下面还有管道,那必须要return的,不然你数据无法传递下去,并且还会报错。

3:代码编写

首先要学会Python操作MySQL方法,不会的可以参考这Python操作中MySQL数据方法

此代码指针对MySQL数据库的,完整的需要包含上面 class CsdnPipeline 中的代码 

import pymysql  # 导入操作数据库模块class MysqlPipeline:# 1、创建一个链接对象conn = pymysql.connect(host='127.0.0.1',  # mysql服务器的ip地址port=3306,  # mysql默认端口号user='root',  # mysql用户名password='root1234',  # mysql密码db='spider',  # mysql指定的数据库)# 2、创建一个游标对象:用来执行sql语句cursor = conn.cursor()def process_item(self, item, spider):# 利用上面传入的item,我们先获取到数据title = item['title']author = item['author']# 将2个字段存储到mysql数据表中sql = 'insert into bili(title,author) values ("{}","{}")'.format(title, author)# 使用游标对象执行sql语句self.cursor.execute(sql)# 提交事物,最后才会将数据存入数据库中self.conn.commit()return itemdef close_spider(self, spider):# 关闭游标和链接对象self.cursor.close()self.conn.close()

 代码分析:

 其中主要就是数据库的链接,要提前创建好表和对应的字段,然后会简单的SQL语句。

 4:执行结果

三、基于管道的存储(存入Redis缓存中)

 首先肯定要先安装Redis的,没有安装可以参考手把手安装部署Redis

 还需要安装模块用于操作Redis,这个安装个低版本的,高的有些数据格式不支持,例如字典就不行的。

pip install redis==2.10.6

存到Redis步骤:(Redis要提前开启哦)

和上面一样的唯一不同的地方就在第四步管道函数的编写,下面我们就把这方面重点分析一下~

1:settings中配置 

2:代码编写

 此代码指针对Redis缓存的,完整的需要包含上面 class CsdnPipeline 和 class MysqlPipeline 中的代码。 

from redis import Redis  # 导入模块class RedisPipeline:# 创建链接对象conn = Redis(host='127.0.0.1', port=6379)def process_item(self, item, spider):# 将item这个字典存储到redis中self.conn.lpush('bili', item)  # lpush(参数1,参数2):参数1新建列表的名称,参数2是向列表中存储的数据return item

 代码分析:

Redis的比较简单,主要就是连接,按照这个写就行了,没有啥理解的,固定语法。

 3:执行结果

自此Scrapy框架持久化存储的2种方法就这些了,另外还有就是图片和视频的持久存储,在内置管道中讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/207557.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于Web标准以及W3C的理解、对viewport的理解、xhtml和html有什么区别?

1、对于Web标准以及W3C的理解 Web标准 Web标准简单来说可以分为结构、表现、行为。 其中结构是由HTML各种标签组成,简单来说就是body里面写入标签是为了页面的结构。 表现指的是CSS层叠样式表,通过CSS可以让我们的页面结构标签更具美感。 行为指的是…

【Python表白系列】这个情人节送她一个漂浮的爱心吧(完整代码)

文章目录 漂浮的爱心环境需求完整代码详细分析系列文章 漂浮的爱心 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这…

c/c++概念辨析-指针常量常量指针、指针函数函数指针、指针数组数组指针

概念澄清: 统一规则: 不管是XX指针,还是指针XX,后者是本体,前者只是个定语,前者也可以替换为其他同类(例如字符串),帮助理解。 XX指针: 可简单理解为&#…

基于helm的方式在k8s集群中部署gitlab - 部署(一)

文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…

从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合

🎏:你只管努力,剩下的交给时间 🏠 :小破站 "从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合 前言准备工作编写docker-compose.yml文件为什么使用本机ip为什么skywa…

python中的字符串

字符串 字符串是编程语言中的一种基本数据类型,用于表示一串字符序列。在Python中,字符串是不可变的,也就是说一旦字符串被创建,就无法修改其中的字符。 Python中的字符串可以用单引号或双引号括起来,例如&#xff1…

【LeetCode】 160. 相交链表

相交链表 题目题解 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&am…

卡码网15 .链表的基本操作III

链表的基础操作III 时间限制:1.000S 空间限制:128MB 题目描述 请编写一个程序,实现以下链表操作:构建一个单向链表,链表中包含一组整数数据。 1. 实现在链表的第 n 个位置插入一个元素,输出整个链表的…

0-1背包问题详解

0-1背包问题 部分一:问题描述 0-1背包问题是一类经典的组合优化问题,它出现在很多实际生活和工业环境中。问题描述如下: 假设你是一个冒险家,带着一个可承重的背包,面对一堆宝物。每件宝物都有自己的价值&#xff0…

【设计模式-2.1】创建型——单例模式

说明:设计模式根据用途分为创建型、结构性和行为型。创建型模式主要用于描述如何创建对象,本文介绍创建型中的单例模式。 饿汉式单例 单例模式是比较常见的一种设计模式,旨在确保对象的唯一性,什么时候去使用这个对象都是同一个…

Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 iced的基本逻辑是: UI交互产生消息message,message传递给后台的update,在这个函数中编写逻辑,然后通过…

Pytest做性能测试?

Pytest其实也是可以做性能测试或者基准测试的。是非常方便的。 可以考虑使用Pytest-benchmark类库进行。 安装pytest-benchmark 首先,确保已经安装了pytest和pytest-benchmark插件。可以使用以下命令安装插件: pip install pytest pytest-benchmark …

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地:代码开发 代码开发:SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用:分层体系、建模实现 2. 内容目标 项目业务介绍:背景、需求 项目技术架构:选型、架构 项目环境…

ubuntu系统下搭建本地物联网mqtt服务器的步骤

那么假如我们需要做一些终端设备,例如温湿度传感器、光照等物联网采集设备要接入呢?怎么样才能将数据报送到服务器呢? 以下内容基于我们ubuntu系统下的emqx成功启动的基础上。我们可以用浏览器键入控制板的地址,如果启动成功&…

数据爬取+可视化实战_告白气球_词云展示----酷狗音乐

一、前言 歌词上做文本分析,数据存储在网页上,需要爬取数据下来,词云展示在工作中也变得日益重要,接下来将数据爬虫与可视化结合起来,做个词云展示案例。 二、代码 # -*- coding:utf-8 -*- # 酷狗音乐 通过获取每首歌…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了💥我已经后悔了😭后悔没早点学习鸿蒙 HarmonyOS 概念,系统定位 1:鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统,它具有以下特别之处: 2:分布式架构:…

SpringBoot+mysql+vue实现大学生健康档案管理系统前后端分离

一、项目简介 本项目是一套基于SpringBoot实现大学生健康档案管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试&#…

数据结构——图解链表OJ题目

学完了单链表之后,我们对其基本结构已经有了一定的了解,接下来我们通过一些题目强化对链表的理解,同时学习一些面试笔试题目的新思路以及加强对数据结构单链表的掌握。 目录 题目一.876. 链表的中间结点 - 力扣(LeetCode&#x…

14.Tomcat和HTTP协议-[一篇通]

文章目录 1.HTTP 协议1.1HTTP 是什么1.2理解 "应用层协议"1.3理解 HTTP 协议的工作过程1.4HTTP 协议格式1.4.1抓包工具的使用(Fiddler)1.4.2抓包工具的原理1.4.3抓包结果1.4.4协议格式总结 1.5HTTP 请求 (Request)1.5.1认识 URL1.5.1.1URL 基本格式1.5.1.2关于 URL e…

二次元检测设备导轨修复指南

二次元检测设备是一种高精度的测量仪器,用于检测物体表面的形状、尺寸和精度等。直线导轨是二次元检测设备中最重要的组成部分之一,它的精度和稳定性直接影响到设备的测量结果和可靠性,因此,对导轨进行修复和保养是非常重要的。 直…