Scrapy中的數據流由執行引擎控制,其過程以下:框架
引擎從Spiders中獲取到最初的要爬取的請求(Requests).
引擎安排請求(Requests)到調度器中,並向調度器請求下一個要爬取的請求(Requests).
調度器返回下一個要爬取的請求(Requests)給引擎.
引擎將上步中獲得的請求(Requests)經過下載器中間件(Downloader Middlewares)發送給下載器(Downloader ),這個過程當中下載器中間件(Downloader Middlewares)中的process_request()函數會被調用到.
一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其經過下載中間件(Downloader Middlewares)發送給引擎,這個過程當中下載器中間件(Downloader Middlewares)中的process_response()函數會被調用到.
引擎從下載器中獲得上步中的Response並經過Spider中間件(Spider Middlewares)發送給Spider處理,這個過程當中Spider中間件(Spider Middlewares)中的process_spider_input()函數會被調用到.
Spider處理Response並經過Spider中間件(Spider Middlewares)返回爬取到的Item及(跟進的)新的Request給引擎,這個過程當中Spider中間件(Spider Middlewares)的process_spider_output()函數會被調用到.
引擎將上步中Spider處理的其爬取到的Item給Item 管道(Pipeline),將Spider處理的Request發送給調度器,並向調度器請求可能存在的下一個要爬取的請求(Requests).
(從第二步)重複直到調度器中沒有更多的請求(Requests).異步
在以前代碼中,咱們歷來沒有過手動的對start_urls 列表中存儲的起始url進行對請求的發送, 可是起始url的確進行了請求的發送, 這是怎麼實現的呢?scrapy
解答: 其實爬蟲文件中的爬蟲類繼承了Spider父類中的start_urls(self)這個方法,該方法就能夠對start_urls列表中的url發起請求 : ide
def start_requests(self): for u in self.start_urls: yield scrapy.Request(url=u,callback=self.parse)
注意 : 該方法默認的是進行get請求的發送,若是想要進行post請求,就要重寫該方法 : 函數
def start_requests(self): #請求的url post_url = 'http://fanyi.baidu.com/sug' #post請求的參數,是個字典的形式 data = { 'kw':'dog' } #發送post請求 yield scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse)