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规则对字符串进行定位和提取

  1. response.xpath 方法的返回结果是一个类列表的类型 其中包含的是 selector 对象,操作和列表一样,但是有一些额外的方法
  2. 额外方法 extract():返回一个包含字符串的列表
  3. 额外方法 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文件中定义对数据的操作

  1. 定义一个管道类
  2. 重写管道类的process_item方法
  3. 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()

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

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

相关文章

k8s集群部署metrics-server

1、Metrics Server介绍 Metrics Server 是集群级别的资源利用率数据的聚合器。从 Kubelets收集资源指标&#xff0c;并通过 Metrics API 在 Kubernetes apiserver 中公开它们&#xff0c;以供 Horizontal Pod Autoscaler 和Vertical Pod Autoscaler 使用。 Metrics API 也可以…

什么是串联谐振

比如有一个由电阻、电容和电感的串联电路中&#xff0c;存在一个频率能使这个电路的电流最大&#xff0c;这个现象就叫谐振。 那么这个频率是多少呢&#xff1f; 交流电频率与电路固有频率一致时&#xff0c;它就能发生谐振&#xff0c;此时这个电路的电流是最大的 这个固有频…

(vue)启动项目报错The project seems to require pnpm but it‘s not installed

(vue)启动项目报错The project seems to require pnpm but it’s not installed 原因 该错误信息表明你的项目需要使用 pnpm 作为包管理工具&#xff0c;但系统中尚未安装 pnpm。 解决方法 【1】删除pnpm.lock 【2】npm install -g pnpm 之后再重新启动 yarn报错&#xff0…

Laravel8.5+微信小程序实现京东商城秒杀方案

一、商品秒杀涉及的知识点 鉴权策略封装掊口访问频次限制小程序设计页面防抖接口调用订单创建事务使用超卖防御 二、订单库存系统方案&#xff08;3种&#xff09; 下单减库存 优点是库存和订单的强一致性&#xff0c;商品不会卖超&#xff0c;但是可能导致恶意下单&#xff…

JVM:即时编译器,C2 Compiler,堆外内存排查

1&#xff0c;即时编译器 1.1&#xff0c;基本概念 常见的编译型语言如C&#xff0c;通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译&#xff0c;处处运行”的特性&#xff0c;把编译的过程分成两部分&#xff0c;首先它会先由javac编译成通用的…

屏幕分辨率|尺寸|颜色深度指纹修改

一、前端通过window.screen接口获取屏幕分辨率 尺寸 颜色深度&#xff0c;横屏竖屏信息。 二、window.screen c接口实现&#xff1a; 1、third_party\blink\renderer\core\frame\screen.idl // https://drafts.csswg.org/cssom-view/#the-screen-interface[ExposedWindow ] …

【C#设计模式(15)——命令模式(Command Pattern)】

前言 命令模式的关键通过将请求封装成一个对象&#xff0c;使命令的发送者和接收者解耦。这种方式能更方便地添加新的命令&#xff0c;如执行命令的排队、延迟、撤销和重做等操作。 代码 #region 基础的命令模式 //命令&#xff08;抽象类&#xff09; public abstract class …

Linux基础项目包含(DNS,FTP,Samba)

今天我们来实现一个linux的基础项目&#xff0c;多做项目可以加深我们对每个服务的掌握程度&#xff0c;能更加的熟悉各个服务的使用&#xff0c;以及每个服务之间如何相互应用&#xff0c;我们可以有一个清晰的认知&#xff0c;那么接下来我们就开始项目的实操。 一、 项目背…

鸿蒙面试 --- 性能优化

性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中&#xff0c;动画可以为用户界面增添生动、流畅的交互效果&#xff0c;提升用户对应用的好感度。然而&#xff0c;滥用动画也会导致应用性能下降&#xff0c;消耗过多的系统资源&#xff0c;…

UWB数字钥匙安全测距和场景应用

1. CCC数字钥匙 2021年7月CCC将UWB定义为第三代数字钥匙的核心技术&#xff0c;并发布CCC R3&#xff08;第三代数字钥匙&#xff09;规范。 CCC R3是基于NFC/BLE/UWB作为基础的无线电技术的使用&#xff0c;该系统采用非对称密码技术对车辆和设备进行相互签名认证&#xff0…

使用Compose Multiplatform开发跨平台的Android调试工具

背景 最近对CMP跨平台很感兴趣&#xff0c;为了练手&#xff0c;在移动端做了一个Android和IOS共享UI和逻辑代码的天气软件&#xff0c;简单适配了一下双端的深浅主题切换&#xff0c;网络状态监测&#xff0c;刷新调用振动器接口。 做了两年多车机Android开发&#xff0c;偶…

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…

前端学习笔记之文件下载(1.0)

因为要用到这样一个场景&#xff0c;需要下载系统的使用教程&#xff0c;所以在前端项目中就提供了一个能够下载系统教程的一个按钮&#xff0c;供使用者进行下载。 所以就试着写一下这个功能&#xff0c;以一个demo的形式进行演示&#xff0c;在学习的过程中也发现了中文路径…

FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->芯片解码的…

借助nntools的模型训练(图像去噪任务, PyTorch)

在跑通开源代码的过程中&#xff0c;一直难以找到很合适的代码框架或代码模板&#xff0c;尤其对于初学者而言是不小的挑战。本人在跑代码的过程中&#xff0c;发现在GitHub上有一个辅助训练过程的模板。这篇文章主要记录它的使用方法&#xff0c;并标记来源。 代码均在jupyter…

C# 常量

文章目录 前言一、整数常量&#xff08;一&#xff09;合法与非法实例对比&#xff08;二&#xff09;不同进制及类型示例 二、浮点常量三、字符常量四、字符串常量五、定义常量 前言 在 C# 编程的世界里&#xff0c;常量是一类特殊的数据元素&#xff0c;它们如同程序中的 “定…

PHP 生成分享海报

因为用户端有多个平台&#xff0c;如果做分享海报生成&#xff0c;需要三端都来做&#xff0c;工作量比较大。 所以这个艰巨的任务就光荣的交给后端了。经过一定时间的研究和调试&#xff0c;最终圆满完成了任务&#xff0c;生成分享海报图片实现笔记如下。 目录 准备字体文件…

探索Python词云库WordCloud的奥秘

文章目录 探索Python词云库WordCloud的奥秘1. 背景介绍&#xff1a;为何选择WordCloud&#xff1f;2. WordCloud库简介3. 安装WordCloud库4. 简单函数使用方法5. 应用场景示例6. 常见Bug及解决方案7. 总结 探索Python词云库WordCloud的奥秘 1. 背景介绍&#xff1a;为何选择Wo…

git 学习笔记

目录 一、git 前期配置准备 1、托管平台的账号注册&#xff08;以gitee码云为demo&#xff09; 2、本地个人电脑配置 &#xff08;1&#xff09;配置用户属性 ​编辑 &#xff08;2&#xff09;配置SSH密钥 二、git 工作流程图 三、git 提交命令 &#xff08;1&#x…

uniapp中使用uni-forms实现表单管理,验证表单

前言 uni-forms 是一个用于表单管理的组件。它提供了一种简化和统一的方式来处理表单数据&#xff0c;包括表单验证、字段绑定和提交逻辑等。使用 uni-forms可以方便地创建各种类型的表单&#xff0c;支持数据双向绑定&#xff0c;可以与其他组件及API进行良好的集成。开发者可…