1、中间件的作用:预处理request和response对象
① 对header以及cookie进行更换和处理
②使用代理ip等
③对请求进行定制化操作
注:在scrapy默认的情况下
两种中间件都在middlewares.py一个文件;爬虫中间件使用方法和下载中间件相同,且功能重复,通常使用下载中间件
2、中间件的使用方法
(1)在middlewares.py文件中定义中间件类
(2)在中间件中重写处理请求或者响应的方法
1)process_request(self, request, spider)
:当每个request通过下载中间件时,该方法被调用;
①返回None:没有return也是返回None,该request对象传递给下载器,或通过引擎传递给其他权重低的process_request方法
②返回Response对象:不再请求,把response返回给引擎
③返回Request对象:把request对象通过引擎交给调度器,此时将不通过其他权重低的process_request方法
2)process_response(self, request, response, spider)
:当下载器完成http请求,传递响应给引擎的时候调用
①返回Resposne:通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法
②返回Request对象:通过引擎交给调取器继续请求,此时将不通过其他权重低的process_request方法
(3)在settings.py中配置开启中间件,权重值越小越优先执行
3、定义实现随机User-Agent的下载中间件
通过爬取豆瓣作为案例分析
- 创建一个项目:
scrapy startproject Douban
- 数据建模:items
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field() # 电影名字
info = scrapy.Field() # 主演
score = scrapy.Field() # 评分
desc = scrapy.Field() # 评价
- 设置settings
USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
# ROBOTSTXT_OBEY = True
- 创建一个爬虫:
scrapy genspider movie douban.com
import scrapy
from Douban.items import DoubanItem
class MovieSpider(scrapy.Spider):
name