(六)Scrapy的抓取流程——Downloader

当通过Scheduler取出一条request之后,engine就会调用_download方法进行对这条request的下载。
(六)Scrapy的抓取流程——Downloader
图中downloader的fetch方法就是下载器对request的操作方法。
(六)Scrapy的抓取流程——Downloader
通过DownloaderMiddlewareManager在download方法中定义了process_request, process_response, process_exception方法。DownloaderMiddlewareManager会将各中间件的各种process方法存入一个列表里。
(六)Scrapy的抓取流程——Downloader
然后在download中依次对method中各流程的对应方法进行调用。
(六)Scrapy的抓取流程——Downloader
在process_request部分的最后会将下载器中间件下载前方法返回的request重新扔回给downloader进行下载,_enqueue_request方法中将request加入属于downloader的slot对象的队列中,然后对这个队列进行消费。如果配置文件中设置了DOWNLOAD_DELAY,则会在延迟时间之后再重新调用_process_queue。
_process_queue方法中,从slot的queue中取出request,调用_download方法对该请求进行下载。
使用DownloadHandlers的实例对request进行下载。下载结束后,从slot的transferring集合中取出。(这里是为了配合配置文件中的同时下载数使用)
(六)Scrapy的抓取流程——Downloader
最后结束了再回到engine的_downloaded方法,返回的response如果是Request类型,则继续下载,否则返回response。
(六)Scrapy的抓取流程——Downloader
下载结束后,就是engine中对输出的response进行处理。