首页 > 其他分享 >爬虫工作量由小到大的思维转变---<第五十五章 Scrapy 降维挖掘---中间件系列(4)>

爬虫工作量由小到大的思维转变---<第五十五章 Scrapy 降维挖掘---中间件系列(4)>

时间:2024-03-25 09:29:39浏览次数:31  
标签:第五十五章 请求 DefaultHeadersMiddleware 中间件 认证 --- 超时 下载

前言:

爬虫中间件的文章:https://hsnd-91.blog.csdn.net/article/details/136977606

https://hsnd-91.blog.csdn.net/article/details/136978069

讲完了爬虫中间件(5个),现在就应该归类到下载中间件(11个)!

下载器中间件的作用和重要性

        下载器中间件是Scrapy框架中的一个关键组件,位于请求和响应的下载过程中,并提供了各种功能和处理。它允许开发者在请求发送到下载器并获取响应之间进行拦截、修改和处理操作。下载器中间件在爬虫开发中起到了关键的作用,它可以实现例如身份验证、代理设置、请求超时控制、请求头处理等功能,从而提升爬虫的灵活性和可定制性。

Scrapy框架中的下载器中间件概述

        Scrapy框架提供了一个灵活的下载器中间件系统,可以轻松地自定义和配置中间件。在Scrapy框架中,下载器中间件按照优先级有序执行,每个中间件都可以对请求进行处理,并传递给下一个中间件。下载器中间件的优先级由开发者确定,可以根据实际需求进行调整。

本章主要介绍:

HttpAuthMiddleware(HTTP认证中间件) / DownloadTimeoutMiddleware(下载超时中间件) /

DefaultHeadersMiddleware(默认请求头中间件)

正文:

1 HttpAuthMiddleware(HTTP认证中间件)

1.1 HTTP认证的概念和使用场景

        HTTP认证是一种通过验证用户身份的方式来保护Web资源的访问。它通常应用于需要限制访问权限的网站或API接口中。HTTP认证可以通过不同的方式进行,如基本认证(Basic Authentication)、摘要认证(Digest Authentication)、OAuth等。使用HTTP认证可以有效地确保敏感数据和功能只能由授权用户访问,提高系统的安全性。

1.2. HttpAuthMiddleware的功能和作用

HttpAuthMiddleware是Scrapy框架提供的下载器中间件之一,用于在爬取过程中处理HTTP认证。它的功能主要包括:

  • 添加认证信息到请求头:HttpAuthMiddleware可以将认证需要的用户名和密码信息添加到请求头中,以通过认证。
  • 处理认证响应:在收到认证响应时,HttpAuthMiddleware可以解析响应并进行相应的处理,如重新发送带有正确认证信息的请求。

1.3. 使用HttpAuthMiddleware进行HTTP认证的步骤

下面是使用HttpAuthMiddleware进行HTTP认证的一般步骤:

  1. 在Scrapy项目的settings.py文件中启用HttpAuthMiddleware,将其添加到DOWNLOADER_MIDDLEWARES配置项中,设置优先级。

    DOWNLOADER_MIDDLEWARES = {
        'scrapy_httpauth.HttpAuthMiddleware': 543,  # 设置优先级
    }
    
  2. 在HttpAuthMiddleware中配置认证信息,包括所需的用户名和密码。

    HTTP_AUTH_USERNAME = 'your_username'
    HTTP_AUTH_PASSWORD = 'your_password'
    
  3. 发送包含认证信息的请求。 在编写爬虫的start_requests方法或具体的爬取函数中,可以通过meta参数设置请求的认证信息。

    def start_requests(self):
        yield scrapy.Request(url=url, meta={'auth': True})
    
  4. 在HttpAuthMiddleware中处理认证信息。 在HttpAuthMiddleware的process_request方法中,根据请求的meta信息判断是否进行认证,并在请求头中添加认证信息。

    class HttpAuthMiddleware(object):
        def process_request(self, request, spider):
            if request.meta.get('auth'):
                username = spider.settings.get('HTTP_AUTH_USERNAME')
                password = spider.settings.get('HTTP_AUTH_PASSWORD')
                request.headers['Authorization'] = self._get_auth_header(username, password)
            return None
    

1.4. 示例代码和实际应用案例

如何使用HttpAuthMiddleware进行HTTP认证的实际应用:

import scrapy

class MySpider(scrapy.Spider):
    name = 'my_spider'

    def start_requests(self):
        yield scrapy.Request(url='https://example.com/private', meta={'auth': True})

    def parse(self, response):
        # 处理认证后的响应
        pass

        爬虫MySpider发送了一个请求到https://example.com/private,并在请求的meta中设置了authTrue,表示需要进行认证。在HttpAuthMiddleware中,根据请求的meta信息,提取出用户名和密码的配置,然后将认证头信息添加到请求头中。这样,发送的请求将包含相应的认证信息,以通过HTTP认证。

2. DownloadTimeoutMiddleware(下载超时中间件)

2.1. 下载超时的问题和影响

        在进行网络数据抓取或爬取时,下载超时是一个常见的问题。下载超时指的是当从服务器请求数据时,花费的时间超过了预设的最大时限而导致下载过程中断的情况。以下是一些下载超时可能引发的问题和影响:

  1. 资源浪费:如果下载超时且没有进行及时处理,可能导致浪费服务器资源和网络带宽。
  2. 爬取速度下降:下载超时会导致请求被中断,从而增加了重新请求的次数和整体爬取所需的时间。
  3. 系统稳定性:未处理的下载超时问题可能导致程序崩溃或无响应,影响系统的稳定性和可靠性。
  4. 数据不完整性:在下载超时发生时,数据可能只被部分下载下来,导致数据不完整或无法使用。

2.2. DownloadTimeoutMiddleware的功能和优势

DownloadTimeoutMiddleware是Scrapy框架提供的下载器中间件之一,用于处理下载超时的问题。它的功能和优势主要体现在以下几个方面:

  1. 定制化超时设置:DownloadTimeoutMiddleware允许您根据特定请求或站点的需求来设置自定义的超时时间,以适应不同的爬取任务。
  2. 异步请求处理:该中间件使用异步方式处理请求和超时设置,从而提高了爬取的效率和并发性。
  3. 超时异常处理:当请求超时时,DownloadTimeoutMiddleware会捕获并抛出超时异常,以便进行相应的处理操作,例如记录日志或重新发送请求。

2.3. 配置和使用DownloadTimeoutMiddleware的方法

要使用DownloadTimeoutMiddleware进行下载超时处理,需要按照以下步骤进行配置和使用:

  1. 在Scrapy项目的settings.py文件中启用DownloadTimeoutMiddleware,将其添加到DOWNLOADER_MIDDLEWARES配置项中,设置优先级。

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
    }
    
  2. 配置超时时间,可以在settings.py文件中设置DOWNLOAD_TIMEOUT选项,也可以在具体的爬虫中使用download_timeout属性。单位为秒。

    DOWNLOAD_TIMEOUT = 30
    
  3. 捕获超时异常和进行处理。可以通过编写自定义的爬虫中间件来捕获和处理请求超时异常,例如记录日志或重新发送请求。

2.4. 实际场景中的应用示例

使用DownloadTimeoutMiddleware处理下载超时问题的示例:

import scrapy

class MySpider(scrapy.Spider):
    name = 'my_spider'

    def start_requests(self):
        yield scrapy.Request(url='https://example.com', callback=self.parse, meta={'download_timeout': 10})

    def parse(self, response):
        # 处理响应
        pass

        爬虫MySpider发送一个请求到https://example.com网站,并设置了download_timeout属性为10秒。这意味着如果请求超过10秒没有响应,将会抛出下载超时异常。

        当DownloadTimeoutMiddleware检测到超时发生时,它会抛出一个scrapy.exceptions.TimeoutError异常。您可以通过编写自定义的爬虫中间件来捕获该异常并执行相应的处理操作,例如记录日志、重新发送请求或采取其他措施来处理下载超时的情况。

import logging

class TimeoutMiddleware(object):
    def process_exception(self, request, exception, spider):
        if isinstance(exception, scrapy.exceptions.TimeoutError):
            logging.error('Request timed out: %s' % request.url)
            # 处理超时异常,例如记录日志、重新发送请求等
            # ...

        return None

自定义的TimeoutMiddleware捕获了下载超时异常,并将其记录为错误日志。根据实际需求,可以根据自己的需求进行相应的处理。

3. DefaultHeadersMiddleware(默认请求头中间件)

3.1 请求头的重要性和作用

        在Web开发中,请求头是发送给服务器的HTTP消息的一部分,用于向服务器传递额外的信息和参数。请求头的重要性在于以下几个方面:

  • a.识别和身份验证:请求头中的用户代理(User-Agent)字段可以帮助服务器识别客户端的浏览器类型和操作系统,从而适配页面或提供定制的功能。使用请求头中的身份验证字段,如Authorization可以进行用户身份验证。
  • b.数据格式和语言:请求头中的Content-Type字段用于告知服务器请求中包含的数据格式(如JSON、XML等),方便服务器正确解析数据。Accept语言、字符集等字段可以指定用户期望的响应格式。
  • c.缓存和缓存策略:请求头中的缓存相关字段,如If-None-Match、If-Modified-Since等,可以在客户端和服务器之间指定缓存策略,从而提升性能和减少网络传输。

3.2 DefaultHeadersMiddleware的功能和用途

        Scrapy框架提供了一个名为DefaultHeadersMiddleware的默认请求头中间件,它的功能在于为发送的每个请求自动添加默认的请求头,减少了每个请求单独设置请求头的麻烦,提高了开发效率。

DefaultHeadersMiddleware的主要用途包括:

  • a. 设置共享的请求头:可以在中间件中设置共享的请求头,将它们应用于所有的请求,避免在每个请求中重复设置相同的头信息。
  • b.实现全局请求头:使用DefaultHeadersMiddleware可以很方便地实现全局的请求头设置,确保每个请求都带有相同的默认信息。
  • c. 自定义请求头逻辑:通过继承DefaultHeadersMiddleware并重写方法,开发者可以自定义请求头中间件的逻辑,根据特定需求添加特定请求头。

3.3 设置和修改默认请求头的方法

使用DefaultHeadersMiddleware可以设置和修改默认请求头的方法如下:

  • a.配置默认请求头:在Scrapy项目的settings.py文件中,通过DEFAULT_REQUEST_HEADERS设置默认请求头。例如:
DEFAULT_REQUEST_HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
}
  • b.自定义中间件:如果需要更加灵活地设置和修改默认请求头,可以自定义中间件并继承DefaultHeadersMiddleware。例如:
from scrapy.downloadermiddlewares.defaultheaders import DefaultHeadersMiddleware

class CustomHeadersMiddleware(DefaultHeadersMiddleware):
    def process_request(self, request, spider):
        headers = self.default_headers.copy()
        headers['Authorization'] = 'Bearer my_auth_token'
        request.headers = headers
        return None

        我们创建了一个自定义中间件CustomHeadersMiddleware,继承自DefaultHeadersMiddleware,并重写了process_request方法。在该方法中,我们对默认请求头进行了修改,添加了一个自定义的Authorization头信息。

3.4 实际应用场景与示例说明

DefaultHeadersMiddleware在许多实际应用场景中起到关键作用。以下是一个示例说明:

        假设我们正在开发一个Scrapy爬虫,用于从一个电子商务网站上爬取商品信息。为了免费登录并查看商品信息,该网站使用了一个基于Token的身份验证机制。在发送每个请求之前,我们需要在请求头中添加Authorization头,并将自己的Token作为值传递给服务器,以验证身份。此时,可以使用DefaultHeadersMiddleware来设置默认请求头。

  • 首先,我们需要在Scrapy项目的settings.py文件中配置默认请求头,包括Authorization头信息:
DEFAULT_REQUEST_HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Authorization': 'Bearer my_auth_token',
}
  • 然后,可以创建一个Spider类来定义爬取逻辑:
import scrapy

class ProductSpider(scrapy.Spider):
    name = 'product'
    start_urls = ['http://www.example.com/products']

    def parse(self, response):
        # Handle the response and extract product information
        pass

        通过配置DEFAULT_REQUEST_HEADERS,我们设置了Authorization头信息,并将其作为默认请求头。随后,Spider类负责发送请求并处理响应,从中提取所需的商品信息。由于DefaultHeadersMiddleware的存在,每个请求都会自动带有Authorization头,无需在每个请求中手动设置。

这个例子展示了DefaultHeadersMiddleware的用法和作用。通过设置默认请求头,我们可以更方便地在发送请求时传递额外的信息,提高了效率并且避免了重复代码。

总结:

这篇介绍了Scrapy框架中的三个下载器中间件:HttpAuthMiddleware、DownloadTimeoutMiddleware和DefaultHeadersMiddleware。

  1. 首先,HttpAuthMiddleware用于处理HTTP认证,通过验证用户身份来保护Web资源的访问。该中间件可以向请求头中添加认证信息,以通过认证,并在处理认证响应时进行相应的处理。使用HttpAuthMiddleware可以提高系统的安全性,确保敏感数据和功能只能由授权用户访问。
  2. 其次,DownloadTimeoutMiddleware用于处理下载超时的问题。下载超时指当从服务器请求数据时,花费的时间超过预设的最大时限而导致下载过程中断的情况。该中间件允许用户根据特定请求或站点的需求来设置自定义的超时时间,并使用异步方式处理请求和超时设置。处理下载超时问题可以避免资源浪费、提高爬取速度、提升系统稳定性和确保数据完整性。
  3. 最后,DefaultHeadersMiddleware用于设置默认请求头,减少发送请求时单独设置请求头的麻烦。该中间件可以设置共享的请求头,实现全局请求头设置,并允许开发者根据特定需求添加自定义请求头。使用DefaultHeadersMiddleware可以提高开发效率,确保每个请求都带有相同的默认信息。

综上所述,Scrapy框架中的这三个下载器中间件在爬取过程中起到关键作用,分别处理HTTP认证、下载超时和默认请求头的问题。它们提供了功能强大且灵活的机制,帮助开发者有效地管理和处理不同场景下的网络请求。

标签:第五十五章,请求,DefaultHeadersMiddleware,中间件,认证,---,超时,下载
From: https://blog.csdn.net/m0_56758840/article/details/136978526

相关文章

  • 等保-linux-三权分立账号设置
    1.创建三权账号#新建系统管理员useraddsysadminpasswdsysadmin#新建安全管理员useraddsecadminpasswdsecadmin#新建审计管理员useraddauditadminpasswdauditadmin2.修改visudo配置visudo#系统管理员Cmnd_AliasSOFTWARE=/bin/rpm,/usr/bin/up2date,/usr/bin/yumCmn......
  • mac ---Charles抓包---ios苹果手机
    安装Charles1.获取PC的IP地址在Charles菜单栏->Help->LocalIPAddress中可以查看PC的IP地址。2.配置iPhone代理在iPhone的设置->无线局域网->局域网信息(i)->配置代理->手动中配置代理,服务器输入框中填写PC的IP地址,端口输入框中填写Charles的代理端口(一般是8888)......
  • .NET分布式Orleans - 3 - Grain放置
    在Orleans7中,Grain放置是指确定将Grain对象放置在Orleans集群中的哪些物理节点上的过程。Grain是Orleans中的基本单位,代表应用程序中的逻辑单元或实体。Grain放置策略是一种机制,用于根据不同的因素,将Grain对象放置在合适的节点上,以实现负载均衡、最小化网络延迟和提高容错性。G......
  • 2024 Mar. Week-3 Summary
    2024Mar.Week-3Summary2024.03.18-2024.03.24感觉超级久没写总结...虽然但是题解之类的一直在写补题上周主要做数据结构,把lxl的题单补到\(Day~4\)乐主要板块:树套树,分块但是效率还是有点低,一道题要做\(INF\)分钟,可能还是不够熟练自己切题的能力比较差,很多......
  • ETL工具-nifi干货系列 第三讲 nifi web ui 使用教程
    1、nifi服务启动之后,浏览器输入https://localhost:8443/nifi ,匿名登录或者输入用户名密码进入操作页面,如下图所示:2、组件工具栏处理器,鼠标放到图标上提示Processor,里面里面有各种各样的组件,可以实现各种各样的功能。 拖拉处理器到画布中,出现处理器选择列表,可以根据处理......
  • 【兆易创新GD32H759I-EVAL开发板】USB设备 介绍1
    一、引言在当今数字化快速发展的时代,USB(通用串行总线)作为一种普遍应用的通信接口,在各种电子设备中发挥着不可或缺的作用。它不仅支持高速数据传输,而且支持热插拔,使设备连接更加方便快捷。兆易创新的GD32H7系列微控制器,凭借其卓越的计算性能和丰富的通信功能,为USB设备的开发提......
  • Python Flask框架 -- ORM模型外键与表关系
    表关系关系型数据库一个强大的功能,就是多个表之间可以建立关系。比如文章表中,通常需要保存作者数据,但是我们不需要直接把作者数据放到文章表中,而是通过外键引用用户表。这种强大的表关系,可以存储非常复杂的数据,并且可以让查询非常迅速。在Flask-SQLAlchemy中,同样也支持表关系......
  • 电路入门 ---- 基本放大电路
    1放大的概念2放大电路的性能指标放大电路的性能指标是评估其放大功能和效率的重要参数。以下是一些常见的放大电路性能指标:2.1增益(Gain)增益是衡量放大电路放大效果的重要指标,表示输出信号幅度与输入信号幅度之间的比例关系。增益可以分为电压增益、电流增益和功率增益等不......
  • 前端学习-vue视频学习013-pinia
    尚硅谷视频教程了解pinia集中式状态(数据)管理的工具,主要管理各组件之间的共享数据准备一个效果学到的几个点html下拉选择框,可以使用v-model双向绑定v-modle获取的值为字符串,可以写为v-model.number,会尽量转为数字<selectname="num"v-model.number="n"><optionval......
  • Go-Rod自用案例 #1 测试多组账号登录
    使用场景本样例用于在给定的HTML文件中(简单的登录注册),测试多组账号密码是否能够成功登录,并打印出登录结果。前端代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-......