1.因為使用的yield,而不是return。
parse函數將會被當做一個生成器使用。scrapy會逐一獲取parse方法中生成的結果
,並判斷該結果是一個什么樣的類型;
2.如果是request則加入爬取隊列,如果是item類型則使用pipeline處理,其他類型則返回錯誤信息。
3.scrapy取到第一部分的request不會立馬就去發送這個request,只是把這個request放到隊列里,然后接着從生成器里獲取;
4.取盡第一部分的request,然后再獲取第二部分的item,取到item了,就會放到對應的pipeline里處理;
5.parse()方法作為回調函數(callback)賦值給了Request,指定parse()方法來處理這些請求 scrapy.Request(url, callback=self.parse)
6.Request對象經過調度,執行生成 scrapy.http.response()的響應對象,並送回給parse()方法,直到調度器中沒有Request(遞歸的思路)
7.取盡之后,parse()工作結束,引擎再根據隊列和pipelines中的內容去執行相應的操作;
8.程序在取得各個頁面的items前,會先處理完之前所有的request隊列里的請求,然后再提取items。
9.這一切的一切,Scrapy引擎和調度器將負責到底。
轉自:https://www.cnblogs.com/huwei934/p/6970951.html