爬虫框架Scrapy笔记-Middlewares

简介

  • 使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫

  • Scrapy中有两种中间件:下载器中间件(Downloader Middleware)和爬虫中间件(Spider Middleware

Downloader Middleware

  • 下载器中间件是介于Scrapyrequest/response处理的钩子框架,是用于全局修改Scrapy requestresponse的一个轻量、底层的系统

  • 用于更换代理IP,更换Cookies,更换User-Agent,自动重试。

  • Scrapy其实自带了UA中间件(UserAgentMiddleware)、代理中间件(HttpProxyMiddleware)和重试中间件(RetryMiddleware

  • 从原则上说,要自己开发这3个中间件,需要先禁用Scrapy里面自带的这3个中间件。要禁用Scrapy的中间件,需要在settings.py里面将这个中间件的顺序设为None

process_request(request, spider)

RequestScrapy引擎调度给Downloader之前,process_request()方法就会被调用,也就是在Request从队列里调度出来到Downloader下载执行之前,我们都可以用process_request()方法对Request进行处理。

方法的返回值必须为NoneResponse对象、Request对象之一,或者抛出IgnoreRequest异常。

process_response(request, response, spider)

Downloader执行Request下载之后,会得到对应的ResponseScrapy引擎便会将Response发送给Spider进行解析。

在发送之前,我们都可以用process_response()方法来对Response进行处理。方法的返回值必须为Request对象、Response对象之一,或者抛出IgnoreRequest异常

process_exception(request, exception, spider)

Downloaderprocess_request()方法抛出异常时,例如抛出IgnoreRequest异常,process_exception()方法就会被调用。

方法的返回值必须为NoneResponse对象、Request对象之一

随机更换代理IP示例

  • 修改middlewares.py文件,添加以下代码
# 随机更换代理IP示例 import random from scrapy.conf import settings class ProxyMiddleware(object): # 这个方法中的代码会在每次爬虫访问网页之前执行 def process_request(self, request, spider): proxy = random.choice(settings['PROXIES']) request.meta['proxy'] = proxy
  • 修改settings.py文件,添加几个代理IP,然后激活中间件
PROXIES = ['https://114.217.243.25:8118', 'https://125.37.175.233:8118', 'http://1.85.116.218:8118'] DOWNLOADER_MIDDLEWARES = { # 后面的数字表示这种中间件的顺序 # 数字越小的中间件越先执行 # 最简单的办法就是从543开始,逐渐加一,这样一般不会出现什么大问题 'demo.middlewares.ProxyMiddleware': 543, }

Spider Middleware

Downloader生成Response之后,Response会被发送给Spider,在发送给Spider之前,Response会首先经过Spider Middleware处理

Spider处理生成ItemRequest之后,ItemRequest还会经过Spider Middleware的处理

Spider Middleware有如下三个作用:

  • 我们可以在Downloader生成的Response发送给Spider之前,也就是在Response发送给Spider之前对Response进行处理。
  • 我们可以在Spider生成的Request发送给Scheduler之前,也就是在Request发送给Scheduler之前对Request进行处理。
  • 我们可以在Spider生成的Item发送给Item Pipeline之前,也就是在Item发送给Item Pipeline之前对Item进行处理

process_spider_input(response, spider)

ResponseSpider Middleware处理时,process_spider_input()方法被调用

process_spider_output(response, result, spider)

Spider处理Response返回结果时,process_spider_output()方法被调用

process_spider_exception(response, exception, spider)

SpiderSpider Middlewareprocess_spider_input()方法抛出异常时,process_spider_exception()方法被调用

process_start_requests(start_requests, spider)

process_start_requests()方法以Spider启动的Request为参数被调用,执行的过程类似于process_spider_output(),只不过它没有相关联的Response,并且必须返回Request


创作不易,若本文对你有帮助,欢迎打赏支持作者!

 分享给好友: