Scrapy管道设置和数据保存
1.1 介绍部分:
文字提到常用的Web框架有Django和Flask,接下来将学习一个全球范围内流行的爬虫框架Scrapy。
1.2 内容部分:
Scrapy的概念、作用和工作流程
Scrapy的入门使用
Scrapy构造并发送请求
Scrapy模拟登陆
Scrapy管道的使用
Scrapy中间件的使用
Scrapy_redis概念作用和流程
Scrapy_redis原理分析并实现断点续爬以及分布式爬虫
Scrapy_splash组件的使用
Scrapy的日志信息与配置
Scrapyd部署Scrapy项目
1.2.1 原始爬虫工作流程

原始框架转换成矩形展示

1.2.2 scrapy框架模型



其流程可以描述如下:
爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器
调度器把request–>引擎–>下载中间件–>下载器
下载器发送请求,获取response响应–>下载中间件–>引擎–>爬虫中间件–>爬虫
爬虫提取url地址,组装成request对象–>爬虫中间件–>引擎–>调度器,重复步骤2
用人话描述 spiders模块会解析最初始的url,发送给engine引擎调度器,然后由调度器发送给Downloader下载器,下载器将响应返回给调度器,调度器把响应派发给Spiders,想用传递给Spider会被内部的parse解析
自定义的下载器代码
import scrapyclass ItcastSpider(scrapy.Spider):name = "itcast"allowed_domains = ["itcast.cn"]start_urls = ["https://itcast.cn"]def parse(self, response):#定义对于网站的相关操作pass
1.2.3 scrapy3个内置对象
request请求对象:由url、method、post_data、header等构成
response响应对象:由url、body、status、headers等构成
item数据对象:本质是个字典
1.2.4 scrapy每个模块的作用

1.2.5 安装scrapy
pip install scrapy
1.2.6 开发流程
创建项目:
scrapy startproject mySpider
生成一个爬虫:
scrapy genspider itcast itcast.cn
提取数据:
根据网站结构在spider中实现数据采集相关内容
保存数据:
使用pipeline进行数据后续处理和保存
1.2.7 创建项目
创建scrapy项目的命令:
scrapy startproject <项目名字>
示例:
scrapy startproject myspider
生成的目录和文件结果如下:

1.2.8 scrapy中各文件作用
- spider文件夹一般爬虫都放置在该文件夹中。
- items.py负责处理被spider提取出来的item,定义数据。
- pipelines.py通道文件, 当我们的items被返回的时候,会自动调用我们的pipelines类中process_item()(需要加到settings.py里面)
- middlewares.pyscrapy框架的扩展插件
- setting.pyscrapy爬虫的配置文件。
1.2.9 创建爬虫
通过命令创建出爬虫文件,爬虫文件为主要的代码作业文件,通常一个网站的爬取动作都会在爬虫文件中进行编写。
命令:
在项目路径下执行:
scrapy genspider <爬虫名字> <允许爬取的域名>
爬虫名字:作为爬虫运行时的参数
允许爬取的域名:为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。
示例:
cd myspider
scrapy genspider itcast itcast.cn
1.2.10 启动爬虫
import scrapyclass ItcastSpider(scrapy.Spider):name = "itcast"# 2.检查域名allowed_domains = ['itcast.cn']# 1.修改起始urlstart_urls = ['http://www.itcast.cn/channel/teacher.shtml#ajavaee']# 3. 在parse方法中实现爬取逻辑def parse(self, response):# 定义对于网站的相关操作# with open('itcast.html', 'wb') as f:# f.write(response.body)# 获取所有教师节点node_list = response.xpath('//div[@class="li_txt"]')print("获取所有教师节点长度:",len(node_list))data_list = []# 遍历教师节点列表for node in node_list:temp = {}#xpath 方法返回的是选择器对象列表,extract()会获取不是空列表的第一个值temp['name'] = node.xpath('./h3/text()').extract()temp['title'] = node.xpath('./h4/text()').extract()temp['desc'] = node.xpath('./p/text()').extract()print(temp)yield temp# data_list.append(temp)# return data_list
运行scrapy
命令:在项目目录下执行scrapy crawl
示例:scrapy crawl itcast
scrapy crawl itcast --nolog 可以关闭日志,降低干扰
关于Scrapy爬虫的要点,包括:
- Scrapy.Spider爬虫必须有名为parse的解析函数:该函数是处理和提取数据的关键。
- 可以自定义其他解析函数:如果网站结构复杂,可以通过自定义解析函数处理特定的页面或数据。
- 解析函数中提取的URL地址如果要发送请求,必须属于allowed_domains范围内:这是一种安全措施,确保爬虫只访问指定的域名范围。
- start_urls中的URL地址不受这个限制:初始URL可以不在allowed_domains范围内,但后续解析的URL必须符合规定。
- 启动爬虫时注意启动的位置:应该在项目路径下启动,以确保正确加载项目配置和资源。
- parse()函数中使用yield返回数据:yield可以返回BaseItem, Request, dict或None。
1.2.11 定位元素以及提取数据、属性值的方法
解析并获取Scrapy爬虫中的数据:利用XPath规则对字符串进行定位和提取
response.xpath方法的返回结果是一个类列表的类型 其中包含的是selector对象,操作和列表一样,但是有一些额外的方法- 额外方法
extract():返回一个包含字符串的列表 - 额外方法
extract_first():返回列表中的第一个字符串,列表为空时返回None
1.2.12 response响应对象的常用属性
- response.url: 当前响应的 URL 地址
- response.request.url: 当前响应对应的请求的 URL 地址
- response.headers: 响应头
- response.request.headers: 当前响应的请求头
- response.body: 响应体,也就是 HTML 代码,类型为 byte
- response.status: 响应状态码
1.2.13 保存数据
利用管道pipeline来处理(保存)数据
1.2.14 在pipelines.py文件中定义对数据的操作
- 定义一个管道类
- 重写管道类的process_item方法
- process_item方法处理完item之后必须返回给引擎
import jsonclass ItcastPipeline():# 爬虫文件中把数据传输的方法每次yield一个item, 就会运行一次# 该方法为固定存储函数def process_item(self, item, spider):print(item)return item

1.2.15 在 settings.py 配置启用管道
ITEM_PIPELINES = {'myspider.pipelines.ItcastPipeline': 400
}
这个配置用于在 Scrapy 项目的 settings.py 文件中启用数据管道。通过将管道类 ItcastPipeline 添加到 ITEM_PIPELINES 字典中,并设置一个优先级(例如 400),Scrapy 将会在处理每个 item 时调用该管道。

配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。
配置项中值为管道的使用顺序,设置的数值越小越优先执行,该值一般设置为1000以内。
1.2.16 pipelines.py更新数据操作,保存数据
# 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
import json# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass MyspiderPipeline:def __init__(self):self.file = open('itcast.json', 'w',encoding='utf-8')def process_item(self, item, spider):# print("itcast:", item)# 默认使用完管道之后将需要的数据返回给引擎# 将字典数据序列化json_data = json.dumps(item,ensure_ascii=False)+',\n'# 将数据写入文件self.file.write(json_data)return itemdef __del__(self):self.file.close()

相关文章:
Scrapy管道设置和数据保存
1.1 介绍部分: 文字提到常用的Web框架有Django和Flask,接下来将学习一个全球范围内流行的爬虫框架Scrapy。 1.2 内容部分: Scrapy的概念、作用和工作流程 Scrapy的入门使用 Scrapy构造并发送请求 Scrapy模拟登陆 Scrapy管道的使用 Scrapy中…...
D84【python 接口自动化学习】- pytest基础用法
day84 pytest常用断言类型 学习日期:20241130 学习目标:pytest基础用法 -- pytest常用断言类型 学习笔记: 常用断言类型 代码实践 def test_assert():assert 11assert 1!2assert 1<2assert 2>1assert 1>1assert 1<1assert a…...
如何正确书写sh文件/sh任务?bash任务
正确书写xx.sh文件的方式为: source /usr/local/miniconda3/bin/activate condaEnv export CUDA_VISIBLE_DEVICES0 cd /hy-tmp/test export PYTHONPATH"xxx:$PYTHONPATH" python AAA.py python BBB.py python CCC.py 直接运行: bash xx.sh 即可…...
多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)
常见的线程类型包括用户线程(User Threads)、守护线程(Daemon Threads)、主线程(Main Thread)、工作线程(Worker Threads)和线程池中的线程。 一、用户线程(User Thread…...
docker快速部署gitlab
文章目录 场景部署步骤默认账号密码效果 场景 新增了一台机器, 在初始化本地开发环境,docker快速部署gitlab 部署步骤 编写dockerfile version: 3.7services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlabenviron…...
C# 数据类型详解:掌握数据类型及操作为高效编码奠定基础
本文将带你深入了解C#中各种数据类型的特点、用途和最佳实践,让你不仅能熟练运用基本类型,还能掌握如何在实际项目中做出最合适的选择。 目录 C#基本语法 C#数据类型 C#类型转换 C#变量常量 C#基本语法 在学习C#之前我们要先知道C#的基础构建是由哪些…...
burp2
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
[ACTF2020 新生赛]BackupFile--详细解析
信息搜集 让我们寻找源文件,目录扫描: 找到了/index.php.bak文件,也就是index.php的备份文件。 后缀名是.bak的文件是备份文件,是文件格式的扩展名。 我们访问这个路径,就会直接下载该备份文件。 我们把.bak后缀删掉…...
循环神经网络(RNN)简述
RNN及其变体 1、概述 (一)、概念 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出。 RNN的循环机制使模型隐层**上一时间步产生的结果, 能够作为当下时间步…...
九、Ubuntu Linux操作系统
一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统,于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量,用户可以方便地从社区获得帮助其官方网站:http…...
SpringBoot 新冠密接者跟踪系统:校园疫情防控的智能守护者
摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…...
【Ubuntu】E: Unable to locate package xxx
报错描述 在 Ubuntu 上 执行 apt install xxx 出现下面的报错: 即无法定位到该 Package,一般形式如下: # apt install xxx Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable …...
vue多页面应用集成时权限处理问题
在多页面应用(MPA)中,权限管理通常会涉及到每个页面的访问控制、身份验证、以及权限校验。以下是几种常见的权限处理方式: 1. 前端路由权限控制 原理:虽然是多页面应用,通常每个页面会独立加载和渲染&…...
Socket编程(TCP/UDP详解)
前言:之前因为做项目和找实习没得空,计算机网络模块并没有写成博客,最近得闲了,把计算机网络模块博客补上。 目录 一,UDP编程 1)创建套接字 2)绑定端口号 3)发送与接收数据 4&…...
qt QConicalGradient详解
1、概述 QConicalGradient是Qt框架中QGradient的一个子类,它用于创建锥形渐变效果。锥形渐变是从一个中心点出发,沿着360度的圆周扩散的颜色渐变。这种渐变通常用于模拟光线旋转、创建彩虹效果或实现其他复杂的颜色过渡。QConicalGradient允许你定义渐变…...
存储过程与自然语言处理逻辑的不同与结合
在现代软件开发中,存储过程与自然语言处理(NLP)逻辑都发挥着重要作用。存储过程是一种在数据库内部运行的预编译程序,通常用于处理与数据相关的任务,例如插入、更新、删除数据以及复杂的查询操作。而自然语言处理&…...
了解Linux —— 理解其中的权限
前言 在了解Linux权限之前,先来探讨我们使用的shell 命令它到底是什么? Linux 是一个操作系统,我们称其为内核(kernel) ,正常情况下,我们一般用户操作并不是去直接使用内核,而是通过kernel 的外壳程序&…...
知识图谱嵌入与因果推理的结合
知识图谱通过节点(实体)和边(关系)来表示现实世界中的信息,但如何将这些信息转化为可进行推理和决策的形式,仍然是一个挑战。 另一方面,因果推理(Causal Inference)作为…...
STM32 PWM波形详细图解
目录 前言 一 PWM介绍 1.1 PWM简介 1.2 STM32F103 PWM介绍 1.3 时钟周期与占空比 二.引脚映像关系 2.1引脚映像与寄存器 2.2 复用功能映像 三. PWM 配置步骤 3.1相关原理图 3.2配置流程 3.2.1 步骤一二: 3.2.2 步骤三: 3.2.3 步骤四五六七: …...
Python Web 开发 FastAPI 入门:从基础架构到框架比较
Python Web 开发 FastAPI 入门:从基础架构到框架比较 目录 🖥️ Web 服务器概述(如 Nginx、Apache)🔗 前后端分离架构详解🔄 HTTP 路由和请求处理机制🧰 Web 框架概述:Django、Fla…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
