Scrapy框架之 中间件的使用

爬虫中间件

  • 特点:主要处理蜘蛛(Spider)和下载器(Downloader)之间的请求和响应。可以对蜘蛛生成的请求进行拦截、修改或过滤,也可以对下载器返回给蜘蛛的响应进行处理。
  • 适用场景
    • 请求过滤与修改:当需要根据蜘蛛的某些条件对生成的请求进行过滤或修改时,例如根据蜘蛛的状态、爬取深度等决定是否发送某个请求,或者修改请求的参数、URL 等。
    • 响应处理:对下载器返回的响应进行统一的预处理,比如检查响应的状态码,根据不同的状态码进行不同的处理;或者对响应内容进行初步的清洗、解析,提取一些公共信息供蜘蛛后续使用。
    • 实现分布式爬虫:在分布式爬虫场景中,用于协调不同节点之间的爬取任务,例如根据节点的负载情况分配请求,或者对分布式环境下的请求和响应进行特殊处理,确保爬取任务的高效执行。

下载中间件

  • 特点:主要作用于下载器层面,用于处理 HTTP 请求和响应。可以在请求发送到服务器之前对请求进行修改,如添加请求头、代理设置等;也可以在响应返回后对响应进行处理,如解压、解码等操作。
  • 适用场景
    • 请求头设置:像前面提到的随机设置User-Agent,以及添加其他自定义的请求头信息,以伪装请求来源或满足网站的特定要求。
    • 代理设置:当需要使用代理服务器来发送请求时,下载中间件是设置代理的合适位置。可以根据不同的条件动态选择代理服务器,或者对代理的使用进行管理和监控,如处理代理的认证、检测代理的可用性等。
    • 响应处理:对响应进行一些与数据传输和格式相关的处理,例如对压缩的响应进行解压(如处理gzip压缩的响应),对编码后的响应进行解码,确保蜘蛛接收到的是正确格式的响应内容。

在实际的爬虫项目中,通常会同时使用爬虫中间件和下载中间件。下载中间件用于处理与 HTTP 请求和响应相关的底层操作,而爬虫中间件则更侧重于处理与蜘蛛逻辑相关的请求和响应,两者结合可以满足复杂的爬虫需求。例如,在一个爬取电商网站的项目中,可能会使用下载中间件来设置代理和随机User-Agent,以避免被网站封禁;同时使用爬虫中间件来根据商品的分类过滤请求,只爬取特定类别的商品信息,并对响应中的通用信息进行提取和处理。

DOWNLOADER_MIDDLEWARES = {# 其他中间件...'your_project_name.middlewares.ProxyMiddleware': 543,
}

543:这是中间件的优先级,数值越小,中间件越先被执行。

代理中间件

import random
import base64class ProxyMiddleware:def __init__(self):self.proxy_list = ['http://proxy1.example.com:8080','http://proxy2.example.com:8080',]self.username = 'your_username'self.password = 'your_password'def process_request(self, request, spider):proxy = random.choice(self.proxy_list)request.meta['proxy'] = proxy# 添加代理认证信息if self.username and self.password:auth = f'{self.username}:{self.password}'auth_encoded = base64.b64encode(auth.encode('utf-8')).decode('utf-8')request.headers['Proxy-Authorization'] = f'Basic {auth_encoded}'return Nonedef process_exception(self, request, exception, spider):# 处理代理失败的情况proxy = request.meta.get('proxy')if proxy in self.proxy_list:self.proxy_list.remove(proxy)return request

Scrapy 的下载器中间件中,process_request方法的返回值有特定的含义:

  • return None:这是最常见的返回值。当返回None时,Scrapy 会继续处理这个请求,也就是会将请求发送给下一个中间件(如果有的话),最终由下载器去执行请求操作。
  • return Response:若返回一个Response对象,Scrapy 会停止处理这个请求的后续中间件,并且直接将这个Response对象作为请求的响应返回给蜘蛛(Spider)进行处理。
  • return Request:要是返回一个新的Request对象,Scrapy 会停止处理当前请求,然后将新的Request对象重新加入到请求队列中,等待后续处理。

UserAgent中间件

class UserAgentMiddleware:def process_request(self, request, spider):user_agant = random.choice(USER_AGENT_LIST)# 添加请求头request.headers['User-Agent'] = user_agantreturn None

Selenium中间件

from DrissionPage import Chromiumclass SeleniumMiddleware:def __init__(self, crawler):self.crawler = crawler# 连接 spider_closed 信号和 spider_closed 方法self.crawler.signals.connect(self.spider_closed, signal=signals.spider_closed)self.browser = Chromium()self.tab = self.browser.latest_tab@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):self.tab.get(request.url)body = self.tab.htmlreturn HtmlResponse(url=request.url, body=body, request=request, encoding='utf-8')def spider_closed(self, spider):self.tab.close()self.browser.quit()

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

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

相关文章

供应链算法整理(一)--- 销量预估

在供应链管理领域有较多的预估场景,例如送达时长预估、销量预估、用电量预估。特别的在智能供应链领域,销量和库存的管理的智能化也依赖销量预估,因此在本文我们整理了 销量预估的算法详细的技术方案。 时间序列预测在最近两年内发生了巨大的…

第4篇:服务层抽象与复用逻辑

在业务系统复杂度指数级增长的今天,服务层(Service Layer)的合理设计直接影响着系统的可维护性和扩展性。本文将深入剖析 Egg.js 框架中的服务层架构设计,从基础实现到高级封装,全方位讲解企业级应用的开发实践。 一、…

Java学习手册:Spring 数据访问

一、Spring JDBC JdbcTemplate :Spring JDBC 提供了 JdbcTemplate 类,它简化了数据库操作,提供了丰富的 API 来执行数据库访问任务。JdbcTemplate 可以自动处理数据库连接的获取、释放,SQL 语句的执行,结果集的处理等…

递归、搜索和回溯算法《递归》

在之前的优选算法当中我们已经学习了一些基本的算法,那么接下来我们就要来学习算法当中的一大重要章节——递归、搜索和回溯算法,其实也就是大家常常听到的dfs、bfs;其实本质就是递归,在学习搜索、回溯等算法的过程当中我们会先来…

Java进阶--设计模式

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样&#xff0…

如何禁止AutoCAD这类软件联网

推荐二、三方法,对其他软件影响最小 一、修改Hosts文件 Hosts文件是一个存储域名与IP地址映射关系的文本文件,通过修改Hosts文件可以将AutoCAD的域名指向本地回环地址(127.0.0.1),从而实现禁止联网的目的。具体步骤如…

深度学习框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目录 ​​​​​​一 Vscode安装 二、Anaconda安装 三、更新显卡驱动 四、安装CUDA 五、安装Pytorch 六、Vscode配置 七、出现的问题汇总 ​​​​​​一 Vscode安装 在 Windows 上安装 访问 VS Code 官网 https://code.visualstudio.com/,点击 "Downl…

结构模式识别理论与方法

我们在前文《模式识别的基本概念与理论体系》中就已经提及“模式分类”。 具体内容看我的CSDN文章:模式识别的基本概念与理论体系-CSDN博客 模式的识别方法主要有统计模式识别方法和结构模式识别方法两大类。统计模式识别方法提出得较早,理论也较成熟…

12.多边形的三角剖分 (Triangulation) : Fisk‘s proof

目录 1.Fisks proof Trangulation Coloring Domination Pigeon-Hold Principle Generation 2.Orthogonal Polygons (正交多边形) Necessity of floor(n4) Sufficiency by convex Quadrilateralization Generalization 1.Fisks proof Trangulation 引入内对角线&…

面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解

OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析:分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程,每一层都会对上层的数据加上自己的头部信息(Header): 应用层: 应用…

React Native本地存储方案总结

1. AsyncStorage(键值对存储) 适用场景:简单键值对存储(如用户配置、Token、缓存数据)。特点:异步、轻量、API 简单,但性能一般,不推荐存储大量数据。安装:npm install …

Arduino程序函数详解与实际案例

一、Arduino程序的核心架构与函数解析 Arduino程序的核心由两个函数构成:setup() 和 loop()。这两个函数是所有Arduino代码的骨架,它们的合理使用决定了程序的结构和功能。 1.1 setup() 函数:初始化阶段 setup() 函数在程序启动时仅执行一次,用于完成初始化配置,例如设置…

【Unity】使用Socket建立客户端和服务端并进行通信的例子

Socket服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; public class SocketServer { public static Socket listenSocket;//监听Socket public static List<Socket>…

Qt connect第五个参数

在 Qt 中&#xff0c;QObject::connect 函数的第五个参数用于指定 连接类型&#xff08;Qt::ConnectionType&#xff09;&#xff0c;它决定了信号与槽之间的通信方式。以下是各枚举值的详解及使用场景&#xff1a; 1. Qt::AutoConnection&#xff08;默认值&#xff09; 行为…

【2025域适应科研日报】

本笔记主要为了记录自己的科研日报&#xff0c;前段时间刚开始想写的初衷也是为了自己的思考不跑偏&#xff0c;但是有几天又没有坚持下来&#xff0c;看到一位学长的文章&#xff0c;发现这种形式还是很有必要的&#xff0c;所以自己也打算坚持记录下来&#xff0c;由于还正在…

XrayR启动失败

公司要用服务器之间进行数据加密&#xff0c;这里用的XrayR 我使用的Centos 7。 我这里使用一键脚本安装后&#xff0c;/etc/XrayR目录下没有配置文件。 解决方案 XrayR安装时&#xff0c;系统没有unzip工具&#xff0c;也是会安装失败的&#xff0c;因为Centos7已经停止维…

鸿蒙文件上传-从前端到后端详解,对比jq请求和鸿蒙arkts请求区别,对比new FormData()和鸿蒙arktsrequest.uploadFile

需要权限&#xff1a;ohos.permission.INTERNET 1.nodejs自定义书写上传后端接口 传输过来的数据放在files?.image下 router.post(/upload,(req, res) > {var form new multiparty.Form();form.uploadDirpublic/images/uploads; //上传图片保存的地址(目录必须存在)fo…

编写教育网站后端页面笔记

callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…

日常开发小Tips:后端返回带颜色的字段给前端

一般来说&#xff0c;展示给用户的字体格式&#xff0c;都是由前端控制&#xff0c;展现给用户&#xff1b; 但是当要表示某些字段的数据为异常数据&#xff0c;或者将一些关键信息以不同颜色的形式呈现给用户时&#xff0c;而前端又不好判断&#xff0c;那么就可以由后端来控…

用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案

Spring Boot 的 Fat JAR&#xff08;通过 spring-boot-maven-plugin 打包&#xff09;虽然简化了部署&#xff0c;但也存在一些潜在缺点&#xff0c;需根据场景权衡&#xff1a; 1. 启动速度较慢 原因&#xff1a; Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…