Scrapy中间件
目录
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(一个为百度,一个为搜狗)