【爬虫】Scrapy中间件基础|全面图文讲解|小白也能懂!

Scrapy中间件

目录

Scrapy中间件

1. 概述

1.1什么是中间件?

1.2 中间件的作用是什么?

2.中间件的使用

2.1 创建文件

2.2 修改爬虫文件

2.3 修改setting.py文件

2.4 修改middlewares.py文件


1. 概述

1.1什么是中间件?

Scrapy的中间件有两个:爬虫中间件和下载中间件

1.2 中间件的作用是什么?

观测中间件在五大核心组件的什么位置,根据位置了解中间件的作用。

功能:下载中间件位于引擎和下载器之间,引擎会给下载器传递请求对象,下载器会给引擎返回响应对象

作用:可以拦截到scrapy框架中所有的请求和响应

  • 拦截请求干什么?

    • 修改请求的ip,修改请求的头信息,设置请求的cookie

  • 拦截响应干什么?

    • 可以修改响应数据

2.中间件的使用

2.1 创建文件

scrapy startproject middlePro
cd middlePro
scrapy genspider middle

2.2 修改爬虫文件

import scrapy
​
​
class MiddleSpider(scrapy.Spider):
    name = "middle"
    # 1.注释掉allowed_domains
    # allowed_domains = ["www.xxx.com"]
    
    # 2.修改start_urls
    start_urls = ["https://www.baidu.com","https://www.sougou.com"]
​
    def parse(self, response):
        pass

2.3 修改setting.py文件

#1.机器人协议
ROBOTSTXT_OBEY = False
#2.日志等级
LOG_LEVEL = "ERROR"
#3.下载中间件
DOWNLOADER_MIDDLEWARES = {
   "middlePro.middlewares.MiddleproDownloaderMiddleware": 543,
}

2.4 修改middlewares.py文件

首先,先看下载中间件类,重点看中间的三个函数:

class MiddleproDownloaderMiddleware:
​
​
    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s
​
    def process_request(self, request, spider):
​
        return None
​
    def process_response(self, request, response, spider):
​
        return response
​
    def process_exception(self, request, exception, spider):
​
        pass
​
    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)

其次,我们看看这个三个函数分别有什么作用:

  • def process_request(self, request, spider)

作用

拦截/处理所有的请求对象

参数

request是拦截到的请求对象

spider是爬虫文件中爬虫类的实例化对象,可以实现爬虫类和中间类的数据交互

  • def process_response(self,request,response,spider)

作用

拦截/处理所有的响应对象

参数

response是拦截到的响应对象

response是被拦截到响应对象对应的唯一的一个请求对象

  • def process_exception(self,request,exception,spider)

作用

拦截/处理发生异常的请求对象

参数

request是拦截到的发生异常的请求对象

最后,分别在各个函数中打印,执行爬虫文件看效果

class MiddleproDownloaderMiddleware:
​
    def process_request(self, request, spider):
        print('我是process_request')
        return None
​
    def process_response(self, request, response, spider):
        print('我是process_response')
        return response
​
    def process_exception(self, request, exception, spider):
        print('我是process_exception')
        pass
​
    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)
       

结果:process_request和process_response都是被调用了两次是因为在爬虫文件中请求了两个URL(一个为百度,一个为搜狗)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值