先上图 :
中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件。
作用 :
(1)引擎将请求传递给下载器过程中, 下载中间件可以对请求进行一系列处理。比如设置请求的 User-Agent,设置代理等
(2)在下载器完成将Response传递给引擎中,下载中间件可以对响应进行一系列处理。比如进行gzip解压等。
spider : 从这里开始 ---> 作用 : 产生一个或者一批url / parse()对数据进行解析 url-->封装成请求对象-->引擎(接收spider提供的请求对象,但是还没有请求到数据) 引擎-->(请求对象)-->调度器(调度请求): 过滤器的类->去重(有可能会出现相同的请求对象)-->队列(数据类型,存的就是请求对象) 然后调度器从队列中调度出来一个请求对象给-->引擎-->给下载器-->请求对象-->互联网进行下载 互联网-->响应对象-->给下载器-->引擎(响应对象)-->给spider中的回调方法,进行解析 解析到的对象封装到item对象中-->引擎-->管道,持久化存储 然后 调度器再次从队列中调出来一个url,在......... 核心问题 : 引擎是用来触发事物的,但是引擎怎么知道在什么时候什么节点去触发那些事物? 解答 : 在工作过程中,所有的数据流都会经过'引擎',也就是说 '引擎'是根据接收到的数据流来判定应该去触发那个事物 比如 : 当 spider 给'引擎'提交了个item,引擎一旦接收了个数据类型是item的时候, 引擎马上就会知道下一步应该实例化管道,在掉管道中process_item方法 所有实例化的操作,事物的触发都是由引擎执行的