架构学习(五):scrapy实现自定义代理中间件

scrapy实现自定义代理中间件

  • 前言
  • 关卡:实现自定义代理中间件
    • 代理中间件源码解析
    • 代理池
    • 自定义代理中间件
  • 结束

前言

ip检测是比较常规的反爬手段,一般站点会限制ip的访问频率,或者根据ip的访问规律和频率来识别异常访问,从而点对点封ip。相信大家对代理ip并不陌生,这是ip反爬的绕过方式,且进一步衍生出代理池。
按笔者过往经验来看:

  1. 站点限制ip但不会绑定其他信息,这种情况下我们只要每次请求都切换ip即可(短效ip)
  2. 站点限制ip且绑定cookie等信息,可以每次切换ip时生成一次cookie;或者一个ip直接采集完(长效ip)

各站点的风控机制不同,大家以后遇到的话需要研究它的风控机制并设计突破方案,这个过程需要不断试错,控制变量并找出规律,而这种攻坚过程对逆向思维的训练是很有帮助的。

关卡:实现自定义代理中间件

代理中间件源码解析

进入scrapy->downloadermiddlewares->httpproxy.pyHttpProxyMiddleware便是原生的代理中间件,主要功能逻辑是process_request方法,我们研究它干了什么
在这里插入图片描述
从源码中我们可以知道配置代理的方式

  1. 通过配置request.meta["proxy"]来实现代理切换,它的样式是{protocol}://{username}:{password}@{host}:{port}
  2. 利用requests库的getproxies()函数,它返回当前环境变量中配置的代理设置,也就是self.proxies,在HttpProxyMiddleware初始化时实现
    在这里插入图片描述在这里插入图片描述

代理池

市面上有很多代理ip厂商,他们的产品有很多种,如隧道代理、短效代理等,有兴趣或者有需求的可以去咨询了解。但是这些代理商是服务众多用户的,他提供的代理池质量不一定能满足我们的需求,最好的选择就是维护一套属于自己的高质量代理池。
有兴趣可以看看这篇博客 高效代理池的维护

自定义代理中间件

笔者这里使用的是自己的代理池,通过接口拿到代理字典,需要使用时随机取值即可

{"status":1,"data":[{"host":host,"port":port,"create_time":create_time,"expired_time":expired_time,"priority":priority,"protocol":protocol,"source":"source"}]
}

主要功能逻辑

def process_request(self, request, spider):""" 默认代理会一直使用,可以使用下面的参数实现动态使用meta auto_change_proxy change_proxy _proxy1. auto_change_proxy:程序自动指定代理2. change_proxy:更新代理(单次)3. _proxy:存储上一次代理"""meta = request.metaadd_proxy_meta = Falseif spider.proxy:  # 使用代理if meta.get('auto_change_proxy', None) or meta.get('change_proxy', None):add_proxy_meta = Trueelif not meta.get('proxy'):add_proxy_meta = True# 白名单处理if add_proxy_meta:for pattern in spider.custom_settings.get('whitelist_pattern', []) + \meta.get('proxy_whitelist_pattern', []):if re.search(pattern, request.url):add_proxy_meta = Falseif meta.get('proxy'):request.meta['_proxy'] = meta['proxy']del meta['proxy']breakif add_proxy_meta:get_suc, get_proxy = self.get_random_proxy(spider.crawler.settings.attributes['PROXY_POOL_URL'].value)if not get_suc:spider.print_log(get_proxy, log_type='error')# todo: 代理异常处理else:spider.print_log(f'随机代理: {get_proxy}')request.meta['proxy'] = get_proxy

设计逻辑如下:

  1. 脚本全局增加proxy参数,集中控制代理使用与否
  2. request.meta增加auto_change_proxychange_proxy_proxy参数来实现动态切换和固定使用
  3. 增加白名单机制,对指定站点采集不使用代理
  4. 日志记录与异常提醒

结束

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

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

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

相关文章

【数据结构】二叉树的顺序结构及实现(堆)

1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两…

腾讯云游戏联机服务器配置价格表,4核16G/8核32G/4核32G/16核64G

2024年更新腾讯云游戏联机服务器配置价格表,可用于搭建幻兽帕鲁、雾锁王国等游戏服务器,游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置,可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

C++_多态

目录 1、什么是虚函数 1.1 什么是虚函数重写 1.2 虚函数的继承 1.3 协变 1.4 析构函数的重写 2、override和final 2.1 final 2.2 override 3、纯虚函数/抽象类 3.1 接口继承和实现继承 4、多态的原理 前言: 在C中,多态指的是调用同一个类的…

Windows系统安装Flink及实现MySQL之间数据同步

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink的设计目标是在所有常见的集群环境中运行,并以内存执行速度和任意规模来执行计算。它支持高吞吐、低延迟、高性能的流处理,并且是一个面向流处理和批处理…

re:从0开始的CSS学习之路 3. CSS三大特性

0. 写在前面 很多的学习其实并不知道在学什么,学一个新东西学着学着就变成了抄代码,背概念。把看视频学习变成了一个赶进度的任务,到头来只学到了一些皮毛。 文章目录 0. 写在前面1. CSS三大特性——层叠性2. CSS三大特性——优先级3. CSS三…

学习Spring的第十六天

AOP底层两种生成Proxy的方式 我来解释这两种方式 1 目标类有接口 , 调用JDK的动态代理实现 2 目标类没有接口 , 用Cglib实现 , 即生成目标类的子类 , 来实现动态代理 , 所以要求目标类不能时final修饰的 . (若有接口 , 也可用Cglib方式实现 , 需要手动配置<aop: config pr…

完全二叉树的结点个数

给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最…

java SpringBoot2.7整合Elasticsearch(ES)7 带条件分页查询与不带条件分页查询演示讲解

上文 java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改 我们带着大家 整合了 Elasticsearch 对索引中的文档做了 各方面操作 然后 我们来说说 分页查询 这里 为了方便大家看 我加了五条数据进去 这里 我们仍然需要带个条件 这里 我们用name Mapper 接口 加一个这…

双非本科准备秋招(18.2)—— 图解Monitor

对象头 普通对象&#xff1a; 数组对象&#xff1a; java中对象存储结构分为对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Date&#xff09;和对齐填充&#xff08;Padding&#xff09;。 对象头存储着Mark Word和Klass Word&#xff0c;通过Klass Wo…

复选框和单选按钮——WindowsForm系列教程

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 很多程序的GUI中都有两个常见小部件&#xff1a;单选按钮和复选框。 这些是直观地向用户提供多种选择的方法。我敢肯定&#xff0c;你们都熟悉这些形式的输入&#xff0c;但复选框允许用户打开和关闭个别选项&#xff…

Verilog刷题笔记18

题目&#xff1a;An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false. 解题&#xff1a; module top_module(input a,input b,input sel_b1,input sel_b2,output wire ou…

聚焦网络安全公司,看F5如何应对企业数字化挑战

应用无处不在的当下&#xff0c;从传统应用到现代应用再到边缘、多云、多中心的安全防护&#xff0c;安全已成为企业数字化转型中的首要挑战。有专家指出&#xff0c;目前网络安全市场已经是仅次于计算、存储、网络的第四大IT基础设施市场。那什么网络安全公司应该具有哪些能力…

vue3 使用defineAsyncComponent 动态加载组件

问题场景 在项目中使用静态加载组件基本能覆盖80%的场景了&#xff0c;如下图 但是我们在需要 循环生成一些的component 的时候或者在 开发ssr服务端渲染的页面 就会遇到有些组件以静态方式导入就会报错&#xff0c;导致进程失败&#xff0c;那么这时候就需要用到动态组件。那…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍了bresenham直线插值运动&#xff0c;本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线&#xff0c;10个顶点。设定左下角为原点…

入侵报警系统行业研究:智能化潮流助力市场维持正增长

侵报警系统intruder alarm system(IAS)利用传感器技术和电子信息技术探测并指示非法进入或试图非法进入设防区域(包括主观判断面临被劫持或遭抢劫或其他危急情况时&#xff0c;故意触发紧急报警装置)的行为&#xff0c;处理报警信息、发出报警信息的电子系统或网络。 当入侵行为…

解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)

今天也是去学习了一波字符串函数&#xff0c;想着也为了加深记忆&#xff0c;所以写一下这篇博客。既帮助了我也帮助了想学习字符串函数的各位。下面就开始今天的字符串函数的学习吧。 目录 strcpy与strncpy strcat与strncat strcmpy strstr strcpy与strncpy 在 C 语言中&…

哪些洗地机比较好?家用洗地机选购攻略

洗地机集合了拖把跟吸尘器的功能&#xff0c;面对地面上的水渍、油污脏东西可以快速的清洁干净。从去年开始洗地机领域的竞争就变得异常激烈。各大厂家纷纷推出各自的主打型号&#xff0c;有的注重续航&#xff0c;有的突出清洁效能&#xff0c;还有的专注于性价比。相较于前几…

谷歌seo搜索引擎优化教程有吗?

教程&#xff0c;教学&#xff0c;指南&#xff0c;这些东西哪里都有&#xff0c;尤其是关于seo相关方面的&#xff0c;这些可以说到处都是&#xff0c;能把谷歌seo这个关键词做上去的&#xff0c;可以说就是实力的证明了&#xff0c;在这里我们说一个无论是老手还是新手都应该…

【知识图谱+大模型的紧耦合新范式】Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉

Think-on-Graph&#xff1a;解决大模型在医疗、法律、金融等垂直领域的幻觉 Think-on-Graph 原理ToG 算法步骤&#xff1a;想想再查&#xff0c;查查再想实验结果 论文&#xff1a;https://arxiv.org/abs/2307.07697 代码&#xff1a;https://github.com/IDEA-FinAI/ToG Think…

PYthon进阶--网页采集器(基于百度搜索的Python3爬虫程序)

简介&#xff1a;基于百度搜索引擎的PYthon3爬虫程序的网页采集器&#xff0c;小白和爬虫学习者都可以学会。运行爬虫程序&#xff0c;输入关键词&#xff0c;即可将所搜出来的网页内容保存在本地。 知识点&#xff1a;requests模块的get方法 一、此处需要安装第三方库reques…