爬虫scrapy框架学习(二)(爬虫框架的运行流程)
ccwgpt 2024-09-27 07:29 150 浏览 0 评论
五、爬取苏宁易购下所有图书信息案例
5.1先利用scrapy框架创建一个爬虫项目,再创建sn_book_spider爬虫
5.2在sn_book_spider.py中构造请求,提取数据:
5.3案例总结:1.该案例最难的地方在于需要层层传递参数和请求数据,
请求顺序是分类-》列表-》详情,
2.而在运行时会遇到数据重复的问题,原因是scrapy框架是异步结构,
所以同一时间可能会有多个请求操作同一个item字典,就会导致数据重复覆盖,
解决方法是每个请求传递参数时,传递深拷贝过的参数,
因为深拷贝会开辟一个新的内存地址来存放对象,
所以拷贝后的对象和拷贝前的对象相互独立,互不干扰
六、Scarpy中的CrawlSpider:
6.1生成crawlspider的命令:scrapy genspider –t crawl csdn “csdn.cn”
6.2crawlspider的使用:
6.3crawlspider的参数说明:
七、下载中间件
7.1使用方法:和pipeline一样,定义一个类,然后在setting.py中开启
7.2Downloader Middlewares默认的方法:
process_request(self, request, spider):
当每个request通过下载中间件时,该方法被调用。
process_response(self, request, response, spider):
当下载器完成http请求,传递响应给引擎的时候调用
7.3下载中间件的用途主要是使用多UA或者多代理,提高反爬效率:
八、scrapy模拟登陆
8.1模拟登陆的意义:为了爬取登陆后的页面数据
8.2模拟登陆的方法:
1.直接携带cookie登陆
a.应用场景:
1.cookie过期时间很长,常见于一些不规范的网站
2.能在cookie过期之前把搜有的数据拿到
3.配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地,
scrapy发送请求之前先读取本地cookie
b.关键认知:
1.通过查看scrapy.Spider源码,可以知道我们定义在spider下的start_urls=[]
都是默认交给start_requests处理的,
所以我们可以重写start_requests方法来让其携带cookie请求
2.要使用cookie时,需要在setting.py中开启cookie
c.使用示例:
2.发送post请求:
a.应用场景:适用于大部分网站
b.关键认知:我们使用scrapy.FormRequest来发送Post请求,
还可以使用scrapy.FormRequest.from_response来自动寻找表单登录
c.使用示例:
1.首先使用常规的scrapy.FormRequest函数,需要我们自己拼接参数:
2.然后使用scrapy.FormRequest.from_response函数,自动寻找表单登录:
九、scrapy_redis使用
9.1意义:Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,
具体体现在:reqeust去重,爬虫持久化,和轻松实现分布式
9.2工作流程:scrapy_redis的工作流程如下:
9.3使用:我们通过阅读scrapy_redis源码和示例来学习如何使用它
1.示例1:
a.编写一个爬取domz网站数据的爬虫,主体逻辑如下:
b.不同的是在setting.py中加入以下配置:
c.这样配置以后,运行该爬虫,会发现redis多出了三个键,如下:
d.其中需要注意的是,redispipeline中仅仅实现了item数据存储到redis的过程,
我们可以新建一个pipeline(或者修改默认的ExamplePipeline),让数据存储到任意地方
e.总结:上述示例通过在setting.py中配置使用了scrapy_redis的功能,
使得爬虫多了持久化和request去重的功能
2.源码解析:
a.RedisPipeline代码如下:
b.RFPDupeFilter代码如下:
解析:上述源码的流程是先使用sha1加密request得到指纹
然后把指纹存在redis的集合中
当新来一个request时,先用同样的方式生成指纹,
然后判断该指纹是否存在reids的集合中
c.Scheduler代码如下:
解析:上述源码的流程是先判断爬虫的持久性,
如果设置为不持久则会在程序退出以后清空redis中的数据
然后判断request是否可以入队,入队的条件有以下几种:
1.dont_filter = True ,构造请求的时候,把dont_filter置为True,
该url会被反复抓取(url地址对应的内容会更新的情况)
2.一个全新的url地址被抓到的时候,构造request请求
3.url地址在start_urls中的时候,会入队,不管之前是否请求过
d.总结:由scrapy_redis的源码,我们可以看出,
它的工作原理是将先所有的request都存入队列中,
当一次请求完成后,将对应的request从队列中pop出来,
将pop出来的request使用sha1加密生成指纹,存入指纹集合中
每当有request过来的时候,程序会先用同样的方法生成指纹,
然后判断该指纹是否在指纹集合中,如果在则表示这个request已经被请求过了,
故不再让它入队,如果不在则说明这是个全新的request,让它入队
这样就可以实现request的去重功能
相关推荐
- 十分钟让你学会LNMP架构负载均衡(impala负载均衡)
-
业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...
- AGV仓储机器人调度系统架构(agv物流机器人)
-
系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...
- 远程热部署在美团的落地实践(远程热点是什么意思)
-
Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...
- springboot搭建xxl-job(分布式任务调度系统)
-
一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...
- 大模型:使用vLLM和Ray分布式部署推理应用
-
一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...
- 国产开源之光【分布式工作流调度系统】:DolphinScheduler
-
DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...
- 简单可靠高效的分布式任务队列系统
-
#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...
- 虚拟服务器之间如何分布式运行?(虚拟服务器部署)
-
在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...
- 一文掌握 XXL-Job 的 6 大核心组件
-
XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...
- 京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?
-
京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...
- 企业级项目组件选型(一)分布式任务调度平台
-
官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...
- python多进程的分布式任务调度应用场景及示例
-
多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...
- SpringBoot整合ElasticJob实现分布式任务调度
-
介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...
- 分布式可视化 DAG 任务调度系统 Taier 的整体流程分析
-
Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...
- SpringBoot任务调度:@Scheduled与TaskExecutor全面解析
-
一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)