Scrapy框架之下载中间件(详解)

目录

Scrapy中下载中间件

概念

方法

process_request(self, request, spider)

参数:

process_response(self, request, response, spider)

参数

基本步骤

示例代码

注意 

Scrapy 中 Downloader 设置UA 

开发UserAgent下载中间件

  代码

三方模块 

配置模块到Setting文件 

Scrapy 中 Downloader 设置代理 

爬虫代理原理

代码

 下载中间件-Scrapy与Selenium结合(示例)

Spider文件 

middlewares文件


Scrapy中下载中间件

概念

下载中间件是Scrapy请求/响应处理的钩子框架。这是一个轻、低层次的应用。

通过可下载中间件,可以处理请求之前请求之后的数据。

方法

每个中间件组件都是一个Python类,它定义了一个或多个以下方法,我们可能需要使用方法如下:

  • process_request()

  • process_response()

process_request(self, request, spider)

当每个request通过下载中间件时,该方法被调用

必须返回以下其中之一

  • 返回 None

    • Scrapy 将继续处理该 request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用,该 request 被执行(其 response 被下载)
  • 返回一个 Response 对象

    • Scrapy 将不会调用 任何 其他的 process_request()或 process_exception()方法,或相应地下载函数; 其将返回该 response。已安装的中间件的 process_response()方法则会在每个 response 返回时被调用
  • 返回一个 Request 对象

    • Scrapy 则停止调用 process_request 方法并重新调度返回的 request。当新返回的 request 被执行后, 相应地中间件链将会根据下载的 response 被调用
  • raise IgnoreRequest

    • 如果抛出 一个 IgnoreRequest 异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则 request 的 errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)

参数:

  • request (Request 对象) – 处理的request
  • spider (Spider 对象) – 该request对应的spider

process_response(self, request, response, spider)

当下载器完成http请求,传递响应给引擎的时候调用

process_response()应该是:返回一个 Response对象,则返回一个 Request 对象或引发 IgnoreRequest例外情况。

  • 如果它返回 Response(可能是相同的给定响应,也可能是全新的响应),该响应将继续使用 process_response() 链中的下一个中间件

  • 如果它返回一个 Request 对象时,中间件链将暂停,返回的请求将重新计划为将来下载。这与从返回请求的行为相同 process_request()

  • 如果它引发了 IgnoreRequest异常,请求的errback函数 (Request.errback )。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。

  • 参数

    • request (is a Request object) -- 发起响应的请求
    • response (Responseobject) -- 正在处理的响应
    • spider (Spider object) -- 此响应所针对的蜘蛛

基本步骤

  1. 创建一个自定义的下载中间件类,该类需要实现Scrapy提供的下载中间件接口。您可以根据自己的需求,选择性地实现接口中的方法。常用的方法包括process_requestprocess_responseprocess_exception等。

  2. 在Scrapy的配置文件(一般是settings.py)中,找到DOWNLOADER_MIDDLEWARES配置项。这是一个包含各个下载中间件的列表。您可以根据需要调整中间件的顺序,以及添加或移除中间件。

  3. 将您编写的自定义下载中间件类添加到DOWNLOADER_MIDDLEWARES列表中,以使Scrapy能够使用它。您可以通过指定中间件的路径或导入路径的方式添加中间件。

示例代码

创建一个自定义的下载中间件类:

# myproject/middlewares.pyclass MyCustomDownloaderMiddleware(object):def process_request(self, request, spider):# 在发送请求之前对请求进行处理# 可以修改请求的URL、Headers、添加代理等return None  # 继续处理请求def process_response(self, request, response, spider):# 在接收到响应后对响应进行处理# 可以处理响应的内容、状态码、Headers等return response  # 继续处理响应def process_exception(self, request, exception, spider):# 处理请求过程中发生的异常# 可以根据异常类型进行相应处理pass

在settings.py文件中,将自定义的下载中间件添加到DOWNLOADER_MIDDLEWARES配置项中: 

# settings.pyDOWNLOADER_MIDDLEWARES = {'myproject.middlewares.MyCustomDownloaderMiddleware': 543,  # 自定义下载中间件# 其他下载中间件...
}

注意 

543是一个中间件的优先级值,用于确定中间件的执行顺序。较小的值表示较高的优先级,中间件将按照优先级从高到低的顺序进行处理。Scrapy 中 Downloader 设置UA

Scrapy 中 Downloader 设置UA 

如果使用下载中间件需要在Scrapy中的setting.py的配置DOWNLOADER_MIDDLEWARES才可以使用

DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.CustomDownloaderMiddleware': 543,
}

开发UserAgent下载中间件

问题

每次创建项目后,需要自己复制UserAgent到settings,比较繁琐


解决方案

开发下载中间件,设置UserAgent

  代码

from fake_useragent import UserAgentclass MyUserAgentMiddleware:def process_request(self, request, spider):request.headers.setdefault(b'User-Agent', UserAgent().chrome)

三方模块 

pip install scrapy-fake-useragent==1.4.4

配置模块到Setting文件 

DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401,
}

Scrapy 中 Downloader 设置代理 

爬虫设置代理就是让别的服务器或电脑代替自己的服务器去获取数据

爬虫代理原理

代码

通过request.meta['proxy']可以设置代理,如下:

class MyProxyDownloaderMiddleware:def process_request(self, request, spider):# request.meta['proxy'] ='http://ip:port'# request.meta['proxy'] ='http://name:pwd@ip:port'request.meta['proxy'] ='http://139.224.211.212:8080'

 下载中间件-Scrapy与Selenium结合(示例)

有的页面反爬技术比较高端,一时破解不了,这时我们就是可以考虑使用selenium来降低爬取的难度。

问题来了,如何将Scrapy与Selenium结合使用呢?

思考的思路: 只是用Selenium来帮助下载数据。因此可以考虑通过下载中间件来处理这块内容。

Spider文件 

@classmethoddef from_crawler(cls, crawler, *args, **kwargs):spider = super(BaiduSpider, cls).from_crawler(crawler, *args, **kwargs)spider.chrome = webdriver.Chrome(executable_path='../tools/chromedriver.exe')crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed) # connect里的参数 # 1. 处罚事件后用哪个函数处理# 2. 捕捉哪个事件return spiderdef spider_closed(self, spider):spider.chrome.close()

middlewares文件

def process_request(self, request, spider): spider.chrome.get(request.url)html = spider.chrome.page_sourcereturn HtmlResponse(url = request.url,body = html,request = request,encoding='utf-8')

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

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

相关文章

GeneGPT:用领域工具增强大型语言模型,以改善对生物医学信息的访问

文章目录 一、论文关键信息二、主要内容1. Motivations2. 解决方案关键3. 实验和结果 三、总结与讨论 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:GeneGPT: Augmenting Large Language Models with Domain …

Python3 标准库概览 | 菜鸟教程(十八)

目录 一、Python3 标准库中的模块 (一)os 模块 (二)sys 模块 (三)time 模块 (四)datetime 模块 (五)random 模块 (六)math 模块…

PostgreSQL13.1

目录 1. PostgreSQL简介1.1 PostgreSQL是什么?1.2 PostgreSQL数据库的优缺点是什么?1.2.1 PostgreSQL的主要优点如下:1.2.2 PostgreSQL的应用劣势如下: 1.3 PostgreSQL不同大版本之间的特性比较1.4OpenGauss与PostgreSQL的对比1.4…

互联网编程之多线程/线程池TCP服务器端程序设计

目录 需求 多线程TCP服务器 线程池TCP服务器 测试 日志模块 需求 多线程TCP服务器(30分): 设计编写一个TCP服务器端程序,需使用多线程处理客户端的连接请求。客户端与服务器端之间的通信内容,以及服务器端的处理…

Linux中创建sftp用户并限制目录权限

注意两点: 一是禁止该用户通过ssh登录,二是不需要创建家目录。家目录简单来说,就是在/home下的用户命令,默认每个用户在/home中都是有与用户名一样的文件夹。 1.创建组 groupadd sftp 2. 创建用户 useradd -g sftp -s /sbin/…

API 网关 vs 负载均衡:选择适合你的网络流量管理组件

由于互联网技术的发展,网络数据的请求数节节攀升,这使得服务器承受的压力越来越大。在早期的系统架构中,通常使用负载均衡来将网络流量平摊到多个服务器中,以此减轻单台服务器的压力。但是现如今,后端服务的种类在不断…

vue进阶-elementPlus

Element Plus官网 Element Plus 基于 Vue 3,面向设计师和开发者的组件库。减少开发者关注css,重心关注业务逻辑。 1. 入门 1.1 安装 npm install element-plus --save1.2 快速开始 1、main.js 引入并 use element-plus import { createApp } from …

Java开发 - Canal的基本用法

前言 今天给大家带来的是Canal的基本用法,Canal在Java中常被我们用来做数据的同步,当然不是MySQL与MySQL,Redis与Redis之间了,如果是他们,那就好办了,我们可以直接通过配置来完成他们之间的主从、主主&…

Java官方笔记13集合

Storing Data The Collections Framework is the most widely used API of the JDK. 集合不是数据类型,它是JDK的API,可以用来存储数据等,相当于数据结构。 the Collections Framework is a set of interfaces that models different way of …

DYnamics 365如何隐藏实体列表页面home page页面上的PowerBI按钮和EXCEL template按钮

如何隐藏以上两个按钮,用ribbon工具根本找不到这2个按钮。 解决方案:添加一个没用的按钮,通过调用enable方法来隐藏。 // JavaScript source code function HiddenButton() { HiddePowerBIButton(); HiddeDocumentTemplateButton(); return…

大数据周会-本周学习内容总结018

开会时间:2023.06.18 15:00 线下会议 目录 01【调研-数据分析(质量、ETL、可视化)】 02【fhzn项目】 2.1【es多维度检索接口】 2.2【AI算法库资料整理】 03【专利】 04【学习内容】 4.1【flink】 01【调研-数据分析(质量、…

svn commit 用法

转载   原文:https://blog.csdn.net/qq_39790633/article/details/103700391 使用svn进行代码的提交有两种方法:一种是通过TortoiseSVN客户端界面进行提交,另一种是通过svn commit指令提交。 方法一:通过TortoiseSVN客户端界面提…