架构学习(四):scrapy下载中间件实现动态切换User-Agent

scrapy下载中间件实现动态与固定UserAgent

  • 前言
  • 关卡:实现动态切换User-Agent
    • scrapy设置User-Agent方式梳理
    • User-Agent生效梳理
    • 为何选择在下载中间件中实现
    • 自定义User-Agent下载中间件
  • 结束

前言

请求头User-Agent是比较常规的反爬手段,不同站点对其检测机制各异,有的是检测是否是合规的浏览器User-Agent,有的是在这基础上检测使用次数与频率,更有甚者是跟ip和cookie绑定在一起检测,这就要求我们能够动态去切换User-Agent(随机or判定切换)。

关卡:实现动态切换User-Agent

scrapy设置User-Agent方式梳理

这里整理一下笔者已知的scrapy设置User-Agent的方式:

  1. setting配置文件中设置DEFAULT_REQUEST_HEADERS
    在这里插入图片描述
  2. 生成requests请求时设置请求头
    在这里插入图片描述
  3. setting配置文件中设置USER_AGENT
    我们在源码看一下USER_AGENT的默认值
    在这里插入图片描述
    scrapy是有自带的USER_AGENT中间件的,而USER_AGENT就是跟它一起配合生效的,这个中间件默认也是开启的。所以大家注意了,如果我们直接使用scrapy自带的USER_AGENT机制,是很容易被是被为爬虫的!!!
    在这里插入图片描述
  4. 自定义User-Agent下载中间件,这种方式其实跟方式3是一样的逻辑

User-Agent生效梳理

我们来调试一下方式1方式2方式3,看看三种方式同时设置时最终是哪个方式生效
如下图,按顺序分别为三种方式设置好User-Agent
在这里插入图片描述在这里插入图片描述
如下图,在发起请求生成request队列前,方式1设置成功
在这里插入图片描述
如下图,生成request队列后,经过下载中间件可以看到方式2覆盖了方式1
在这里插入图片描述
我们仔细看下中间件的代码,特别是process_request这个具体实现方法。
在此之前先了解一下setdefault这个方法:
setdefault是Python中字典的一个方法, 它用于在字典中查找指定键 如果键存在, 则返回对应的值; 如果键不存在,则在字典中添加该键,并将其值设置为指定的默认值
由于request.headersUser-Agent有值且是2,所以经过下载中间件后,它还是2
在这里插入图片描述
综上,我们可以得到结论:

  1. 方式1方式2方式3共存时,结果会取方式2
  2. 只存在方式1方式2时,结果会取方式2
  3. 只存在方式1方式3时,结果会取方式1
  4. 方式3要生效必须只有它这种方式

为何选择在下载中间件中实现

首先要说明一下,并非一定要在中间件中才能实现User-Agent动态切换,也可以在脚本开发中对每次生成的request请求时动态设置User-Agent(请求头),但这种方式在笔者看来是不符合python之美的,功能未解耦而不够灵活,每个脚本都要单独实现,既繁琐又提高学习成本。

自定义User-Agent下载中间件

既然选择自定义中间件,那我们就可以随便玩了
首先思考一下,根据需求整理出设计方案:

  1. 动态:随机生成User-Agent
  2. 切换:控制是否动态生成
  3. 全局:需要适配不同场景(固定、动态、切换)

通过上面的思考,在一个全局改动的位置要适配各式各样的脚本应用场景,就需要引入全局控制参数来实现点对点应用,下面是笔者的想法:
在request.meta中增加 auto_change_uachange_ua_ua三个参数来实现,
auto_change_ua是自动切换,每次request都会切换User-Agent
change_ua是一个切换,当前request会切换User-Agent
_ua是固定存储,不切换时一直使用它
同时准备User-Agent列表,用于随机生成,大致样式如下:

def get_random_ua(self):"""Return a ua if possible"""return random.choice(self.ua_list)def process_request(self, request, spider):meta = request.metaua = Noneif meta.get('auto_change_ua') or meta.get('change_ua', None):ua = self.get_random_ua()elif meta.get('_ua', None):ua = meta['_ua']elif not request.headers.get('User-Agent', None):ua = self.get_random_ua()if ua:request.headers['User-Agent'] = uadef process_response(self, request, response, spider):request.meta['_ua'] = request.headers['User-Agent']if 'change_ua' in request.meta:del request.meta['change_ua']if 'auto_change_ua' in request.meta:request.meta['change_ua'] = Truereturn response

开发好后需要在settingDOWNLOADER_MIDDLEWARES配置才能生效,同时,记得把原生的UserAgentMiddleware设置为None,不然它还是会开启的。
在这里插入图片描述

结束

这个关卡的设计方案是笔者根据自己业务场景实现的,大家如果有同样的需求,需要结合自己的业务场景来思考、设计与实现。
好了,分享就到这了,有啥错误的地方请指正~

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

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

相关文章

thinkphp6入门(17)-- 网站开发中session、cache、cookie的区别

Session(会话): 定义: Session是一种用于在服务器端存储用户信息的机制,以跟踪用户的状态。 数据存储位置: 存储在服务器端,可以存在于内存、数据库或文件系统中。 生命周期: 存在于用户访问应…

离散数学——图论(笔记及思维导图)

离散数学——图论(笔记及思维导图) 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰

AI助力农作物自动采摘,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物,专家设计出来了很多用于采摘不同农作物的大型机械,看着非常震撼,但是我们国内农业的发展还是相对比较滞后的&#xff0…

Dockerfile文件参数配置和使用

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现

前言 我们开发的tcp客户端程序在连接服务器以后,经常会遇到服务器已经关闭但是作为客户端的我们不知道,这时候应该应该有一个机制我们可以实时监测客户端和服务器已经断开连接,如果已经断开了连接,我们应该及时报警提示用户客户端和服务器已经断开连接,本文介绍三种可以监…

幸福小院小区中央空调节能改造项目

空调计费是指“中央空调计费”,这种技术实际上是在对水、电、煤气的基础上发展起来的对冷热能量进行计量的一种计费系统技术。 节能改造项目:幸福小院小区. 项目情况需求: 该项目是小区住宅用户建筑,根据功能分区管理…

Vue中路由的使用

目录 1 作用 2 使用方法 2.1 安装路由 2.2 创建路由并导出 2.3 在应用实例中使用vue-router 2.4 声明router-view,展示组件内容 2.5 页面跳转 3 补充内容-子路由 1 作用 能够按不同的访问路径,展示不同组件的内容。 2 使用方法 2.1 安装路由 …

问题:塑瓷后的牙冠要比完成的牙冠大() #学习方法#其他

问题:塑瓷后的牙冠要比完成的牙冠大() A.10% B.10%-15% C.15%-20% D.20%-30% E.50% 参考答案如图所示

springboot157基于springboot的线上辅导班系统的开发与设计

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码) 源码设计 clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000;

PiflowX新增Apache Beam引擎支持

参考资料: Apache Beam 架构原理及应用实践-腾讯云开发者社区-腾讯云 (tencent.com) 在之前的文章中有介绍过,PiflowX是支持spark和flink计算引擎,其架构图如下所示: 在piflow高度抽象的流水线组件的支持下,我们可以…

【Leetcode】1696. 跳跃游戏 VI

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i 1, min(n -…

sqli.labs靶场(54-65关)

54、第五十四关 提示尝试是十次后数据库就重置,那我们尝试union 原来是单引号闭合 id-1 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schemadatabase()) -- 数据库:challenges&#xff0c…

【计算机网络】计算机网络复习资料(期末)

复习要点 一、填空题 1.计算机网络的两个重要基本特点 连通性、共享 2.计算机中的端口号类型 两类端口号 { 服务器端 { 熟知端口号(系统端口号)数值为0~1023 登记端口号,1024~49151 } 客户端使用的端口号:短…

米桃安全漏洞讲堂系列第2期:XSS跨站脚本攻击漏洞

一、一次钓鱼攻击引发的反制 某日,安全团队收到监控预警,有外部人员使用钓鱼邮件对公司内部人员进行信息诈骗。安全团队立即开始分析事件进程。 攻击者以劳动补贴名义群发邮件,诱导内部员工扫描二维码,进而填写个人信息、银行卡等…

WPF控件-ItemsControl

介绍 ItemsControl是用于展示一组项的控件。我们常见的列表&#xff08;ListBox&#xff09;、数据表格&#xff08;DataGrid&#xff09;等都是继承自ItemsControl。可用于自定义样式展示各种批量的数据集合。 常见使用示例&#xff1a; <ItemsControl ItemsSource"…

《MySQL》超详细笔记

目录 基本知识 主流数据库 数据库基本概念 MySQL启动 数据库基本命令 数据库 启动数据库 显示数据库 创建数据库 删除数据库 使用数据库 查询当前数据库信息 显示数据库中的表 导入数据库脚本 表 查看表的结构 查看创建某个表的SQL语句 数据库的查询命令 查询…

PHP客服系统-vue客服聊天系统

PHP-Vue客服聊天系统是一款高效、灵活的客户服务解决方案&#xff0c;基于ThinkPHP6、Vue3和Workerman(Gateworker)框架开发&#xff0c;专为单商户场景打造。 系统亮点&#xff1a; 分布式部署支持&#xff0c;轻松应对高并发场景&#xff1b;本地消息存储功能&#xff0c;确…

探索数据可视化:Matplotlib在Python中的高效应用

探索数据可视化&#xff1a;Matplotlib在Python中的高效应用 引言Matplotlib基础安装和配置Matplotlib基础概念绘制简单图表线形图散点图柱状图 图表定制和美化修改颜色、线型和标记添加标题、图例和标签使用样式表和自定义样式 高级图表类型绘制高级图表多图布局和复杂布局交互…

【MATLAB】交叉验证求光滑因子的广义神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 交叉验证求光滑因子的广义神经网络回归预测算法是一种用于选择模型超参数并提高泛化性能的方法。下面将对该算法进行详细介绍&#xff1a; 广义神经网络回归模型&#xff1a; 广义神经网络…