爬虫的步骤:发送请求获得响应→解析并提取数据→保存数据
我们沿用这个朴素的逻辑去理解scrapy
一、发送请求获得响应
1、爬虫发送请求request到引擎
2、引擎将请求request传递给调度器scheduler队列
3、调度器scheduler从请求队列中向引擎输送request
4、引擎将request 经过下载中间件Middleware传给下载器
Middleware下载器中间件是引擎和下载器之间通信的中间件。在这个中间件中我们可以设置代理、更换请求头等来达到反反爬虫的目的。要写下载器中间件,可以在下载器中实现两个方法。一个是process_request()
,这个方法在将request交给下载器之前执行,一个是process_response()是
当下载器完成http请求,返回响应给引擎的时候调用
process_request(self, request, spider) 必须返回以下之一:
- 返回None:则继续执行其他下载中间件的process_request方法送往下载器,直到合适的下载器函数被调用,该request被执行,返回response
- 返回Response:则终止当前流程,也终止继续调用其他process_request方法,将该response通过引擎返回给爬虫
- 返回Request:则终止当前流程,也终止继续调用其他process_request方法,将request返回给调度器,大多数情况是更换新的request请求
- IgnoreRequest:该异常就会交个process_exception方法进行处理; 如果没有任何一个方法处理该异常,那么该请求就直接被忽略不会记录错误日志
5、下载器完成HTTP请求,返回响应给下载中间件Middleware,将response传递给引擎
process_request(self, request, spider) 必须返回以下之一:
- 返回response:则继续执行,其他下载中间件也会处理该response,直至交给引擎再交给爬虫
- 返回request:则中间件终止,该request返回引擎再给调度器
- 抛出 IgnoreRequest 异常:该请求就被忽略了且不做记录
6、引擎将response传递给爬虫
二、解析并提取数据
7、爬虫解析Response,提取数据items或继续向解析出来的url发送请求给引擎
三、保存数据
8、引擎将items传递给Item Pipeline,将请求传递给Scheduler,继续进行之前的步骤。