Scrapy框架数据流向与中间件机制详解
本文深入解析Scrapy框架的数据流向及核心组件。详细阐述引擎、调度器、下载器与Spider间的数据交互过程,并重点剖析DownloaderMiddleware与SpiderMiddleware的作用位置及核心方法,包括process_request、process_response和process_exception的具体行为与返回值处理,帮助开发者掌握Scrapy内部机制。
Scrapy是一个基于Twisted构建的异步处理框架,具备极强的可扩展性。其具体优势在此不再赘述。
接下来介绍一些概念性知识,旨在帮助读者更好地理解Scrapy的工作原理。
一、数据流向
要熟练掌握该框架,必须清晰理解数据的流动过程。总结如下:
1. 引擎首先启动网站访问,发起对URL的请求。
2. 引擎通过调度器以Request形式调度URL。
3. 引擎请求下一个URL。
4. 调度器将URL通过Downloader Middlewares发送给引擎。
5. Downloader 生成response,并通过Downloader Middlewares发送给引擎。
6. 引擎接收Response,并通过spiderMiddleware发送给spider进行处理。
7. spider对response进行处理。
8. 引擎将spider处理后的item传递给ItemPipeline,同时将新的Request发送给调度器。
二、各个结构的作用
DownloderMiddleware
调度器从队列中取出Request并发送给Downloader执行下载,此过程会经过DownloaderMiddleware的处理。
其作用位置有两个:
- 在调度器调出Request发送给Downloader之前。
- 下载之后生成Response发送给spider之前。
核心方法有三个:
process_request(request,spider)
当Request到达Downloader之前,该方法就会被调用。
参数介绍:
- request :Request对象,即被处理的Request。
- spider:spider对象,即上述被处理的Request所对应的spider。
返回值:
1. 返回None 调用别的process_request()方法,直至将Request执行得到Response才会结束。
2. 返回Response对象,低优先级的process_request()和process_exception不调用。
3. 返回request对象,低优先级的process_request()停止执行,返回新的Request。
process_response(request,response,spider)
作用位置:
- Downloader 执行Request之后,会得到对应的Reponse ,scrapy 引擎会将Response发送给spider进行解析,发送之前调用这个方法对Response进行处理。
返回值的情况:
1. 返回Request低优先级的process_respons()不调用。
2. 返回response低优先级的process_respons()继续调用。
process_exception(request,exception,spider)
此函数主要是用来处理异常的。
spiderMiddleware
作用位置:
- Downloader生成Response之后会发送给spider,
- 在发送之前,会经过spiderMiddleware处理。
核心方法:
process_soider_input(response,spider)
返回值:
1. 返回None
继续处理Response,调用所有的spiderMiddleware,知道spider处理
2. 跑出异常
直接调用Request的errback()方法,使用process_spider_output()处理。
process_spider_output(response,result,spider)
当spider处理Response返回结果时,被调用。
process_spider_exception(response,exception,spider)
返回值:none
继续处理response,返回一个可迭代对象,process_spider_output()方法被调用。
process_start_request(start_requests,spider)
以spider启动的Request为参数被调用,必须返回request。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









