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

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

时间:2024-03-25 09:29:59浏览次数:25  
标签:层级 限制 DepthMiddleware URL 中间件 爬虫 --- 降维 UrlLengthMiddleware

前言:

继续上一章:https://hsnd-91.blog.csdn.net/article/details/136977606

本章主要介绍: UrlLengthMiddleware和DepthMiddleware是Scrapy框架中的关键Spider中间件,自此,爬虫中间件部分,一共5个算是全部介绍完毕!

  1. UrlLengthMiddleware的功能主要是设置和限制请求的URL长度。过长的URL可能导致一些问题,如服务器拒绝请求或请求超时。通过使用UrlLengthMiddleware,开发者可以在发送请求之前检查URL长度并进行限制,从而避免由于超长URL而引发的问题。该中间件通常会拦截并检查每个请求的URL长度,如果URL长度超过预设限制,将不会发送请求并给出相应的提示或处理。
  2. DepthMiddleware的作用是限制爬虫的层级深度,即最大允许跟踪链接的深度。在爬虫过程中,如果不加限制地一直追踪链接,可能会导致无限递归或无限抓取,浪费资源并陷入循环中。DepthMiddleware通过设置深度限制,控制爬虫的范围,帮助开发者避免这种问题的发生。当爬虫达到预设的深度限制时,该中间件将停止追踪新链接。

综上所述,UrlLengthMiddleware用于设置和限制请求的URL长度,避免发送过长的请求,以确保爬虫的正常运行和响应的稳定性。而DepthMiddleware用于限制爬虫的层级深度,控制爬虫的范围,避免无限递归和资源浪费,提高爬虫的效率和可靠性。这两个中间件在爬虫的开发过程中起到了关键的作用,帮助开发者有效地管理URL长度和控制爬虫深度。

正文:

1. UrlLengthMiddleware

1.1. 什么是UrlLengthMiddleware

        UrlLengthMiddleware是Scrapy框架中的Spider中间件,用于设置和限制请求的URL长度。它在发送请求之前拦截并检查请求的URL长度,如果超过预设的限制,将不会发送请求并进行相应的处理。

1.2 设置和限制请求的URL长度

使用UrlLengthMiddleware在请求中设置和限制URL长度的步骤如下:

1.2.1 在项目的settings.py文件中,启用UrlLengthMiddleware中间件:
SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,
    # other middleware entries...
}
1.2.2 在settings.py文件中添加URL长度的限制值:
URLLENGTH_LIMIT = 2048  # 设置URL长度限制为2048个字符

1.3 处理过长的URL

过长的URL可能导致一些问题,如服务器拒绝请求或请求超时。UrlLengthMiddleware帮助开发者处理过长的URL并避免这些问题的发生。以下是处理过程的步骤:

1.3.1 在UrlLengthMiddleware的process_spider_input方法中,根据URL长度限制值判断URL是否过长。
from scrapy.exceptions import IgnoreRequest

class UrlLengthMiddleware(object):
    
    def process_spider_input(self, response, request, spider):
        url = request.url
        url_length_limit = spider.settings.getint('URLLENGTH_LIMIT')
        if len(url) > url_length_limit:
            raise IgnoreRequest("URL length exceeds limit")
        return None

1.4 示例演示

在一个Web爬虫中,我们设置URL长度限制为100个字符。当一个请求的URL超过限制时,我们希望该请求被忽略并不发送到服务器。

1.4.1. 在settings.py文件中配置URL长度限制:
URLLENGTH_LIMIT = 100
1.4.2 创建一个名为my_spider.py的Spider类,并在其中实现UrlLengthMiddleware中间件的处理逻辑:
import scrapy
from scrapy.exceptions import IgnoreRequest

class MySpider(scrapy.Spider):
    name = 'my_spider'
    
    def start_requests(self):
        urls = [
            'http://www.example.com/very_long_url_to_exceed_the_limit',
            'http://www.example.com/short_url'
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # Parse the response
        pass

    def process_spider_input(self, response, request, spider):
        url = request.url
        url_length_limit = self.settings.getint('URLLENGTH_LIMIT')
        if len(url) > url_length_limit:
            raise IgnoreRequest("URL length exceeds limit")
        return None
1.4.3 运行爬虫并观察输出结果:
scrapy crawl my_spider

结果将会显示“URL length exceeds limit”,并且超过限制的URL请求将被忽略,只有满足长度限制的URL请求才会被发送和处理。

通过以上示例,我们演示了使用UrlLengthMiddleware来处理URL长度限制。通过配置和使用该中间件,我们能够有效地限制请求URL的长度,避免因超长URL导致的问题,并提高爬虫的稳定性和性能。

2. DepthMiddleware

2.1  什么是DepthMiddleware

DepthMiddleware是Scrapy框架中的Spider中间件,用于设置和限制爬虫的层级深度。它可以在爬虫运行过程中拦截和控制请求的深度,以避免无限递归和控制爬取的范围。

2.2 限制爬虫的层级深度

要使用DepthMiddleware来设置和限制爬虫的层级深度,可以按照以下步骤进行操作:

2.2.1在项目的settings.py文件中启用DepthMiddleware:
SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,
    # other middleware entries...
}
2.2.2 在settings.py文件中设置层级深度的限制值:
DEPTH_LIMIT = 3  # 将层级深度限制为3

2.3 控制爬虫范围和避免无限递归

  1. 深度限制在爬虫中扮演重要角色,它的作用是控制爬取的范围并避免无限递归。设置适当的深度限制可确保爬虫在有效范围内工作,并防止陷入无限循环的情况。

  2. 使用DepthMiddleware可以控制爬虫的范围和避免无限递归。当爬虫达到指定的层级深度限制时,它将停止爬取更深层级的链接,从而限制了爬虫的范围。这对于避免爬虫陷入无限递归的情况至关重要,同时也提高了爬虫的性能和效率。

2.4. 示例演示

下面是一个具体示例,展示如何配置和使用DepthMiddleware以限制爬虫的层级深度为2:

  1. 在settings.py文件中配置层级深度限制值:

    DEPTH_LIMIT = 2
    
  2. 创建一个名为my_spider.py的Spider类,并在其中实现DepthMiddleware中间件的处理逻辑:

    import scrapy
    
    class MySpider(scrapy.Spider):
        name = 'my_spider'
        start_urls = ['http://www.example.com/']
    
        def parse(self, response):
            # 获取页面中的链接并分析
            links = response.css('a::attr(href)').getall()
            for link in links:
                yield response.follow(link, callback=self.parse)
    
  3. 运行爬虫并观察输出结果:

    scrapy crawl my_spider
    

    在实际的爬取过程中,爬虫会在初始URL的基础上继续爬取层级深度为1的链接。当爬虫达到指定的层级深度限制2时,它将停止继续爬取更深层级的链接,并完成爬取过程。

通过以上示例,我们演示了如何使用DepthMiddleware来限制爬虫的层级深度。通过设置适当的深度限制,我们可以控制爬虫的范围,避免无限递归,并提高爬虫的效率和性能。

3. 总结

UrlLengthMiddleware和DepthMiddleware是Scrapy框架中常用的Spider中间件,它们在爬虫开发中扮演着重要的角色,用于控制和优化爬虫的行为。

  • UrlLengthMiddleware是用于限制URL长度的中间件。它可以拦截并检查请求的URL长度,以防止爬虫请求过长的URL,从而避免一些潜在的问题,如超出服务器支持的最大URL长度或造成不必要的性能开销。通过设置适当的URL长度限制,我们可以保护爬虫免受这些问题的影响,并提高爬虫的健壮性和效率。
  • DepthMiddleware是用于限制爬虫层级深度的中间件。它可以拦截并控制请求的深度,以避免爬虫陷入无限递归的情况,并控制爬取的范围。通过设置适当的层级深度限制,我们可以确保爬虫在我们定义的范围内工作,并防止不必要的爬取和性能浪费。

这两个中间件在实际爬虫开发中具有重要的应用场景。

  • 对于UrlLengthMiddleware,它可以应用于包含动态URL参数的网站。当网站URL参数过长时,可以使用UrlLengthMiddleware来限制URL长度,避免超出服务器支持的最大长度限制,并确保请求的顺利进行。它还适用于那些参数敏感的网站,通过限制URL长度,可以避免将敏感信息以明文形式暴露在URL中,提高安全性。
  • 对于DepthMiddleware,它适用于需要控制爬虫范围和避免无限递归的情况。当爬取网站时,一些页面可能存在无限层级的链接,如果不限制层级深度,爬虫可能会陷入无限循环。通过设置合适的层级深度限制,我们可以确保爬取的范围在可控范围内,并避免无限递归问题。

综上所述,UrlLengthMiddleware和DepthMiddleware它们分别用于限制URL长度和爬虫层级深度,可以提高爬虫的健壮性、性能和安全性。根据具体需求,在爬虫开发中灵活应用它们,可以优化爬虫的工作方式,并确保爬取的可靠性和效率。

标签:层级,限制,DepthMiddleware,URL,中间件,爬虫,---,降维,UrlLengthMiddleware
From: https://blog.csdn.net/m0_56758840/article/details/136978069

相关文章

  • 爬虫工作量由小到大的思维转变---<第五十五章 Scrapy 降维挖掘---中间件系列(4)>
    前言:爬虫中间件的文章:https://hsnd-91.blog.csdn.net/article/details/136977606https://hsnd-91.blog.csdn.net/article/details/136978069讲完了爬虫中间件(5个),现在就应该归类到下载中间件(11个)!下载器中间件的作用和重要性        下载器中间件是Scrapy......
  • 等保-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......
  • 图解二维完全背包问题——降维打击
    例题例题:518.零钱兑换II概述:给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合32位带符号整数。......
  • 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)增益是衡量放大电路放大效果的重要指标,表示输出信号幅度与输入信号幅度之间的比例关系。增益可以分为电压增益、电流增益和功率增益等不......