原理圖一

1,spider打開某網頁,獲取到一個或者多個request,經由scrapy engine傳送給調度器scheduler
request特別多並且速度特別快會在scheduler形成請求隊列queue,由scheduler安排執行
2,schelduler會按照一定的次序取出請求,經由引擎, 下載器中間鍵,發送給下載器dowmloader
這里的下載器中間鍵是設定在請求執行前,因此可以設定代理,請求頭,cookie等
3,下載下來的網頁數據再次經過下載器中間鍵,經過引擎,經過爬蟲中間鍵傳送給爬蟲spiders
這里的下載器中間鍵是設定在請求執行后,因此可以修改請求的結果
這里的爬蟲中間鍵是設定在數據或者請求到達爬蟲之前,與下載器中間鍵有類似的功能
4,由爬蟲spider對下載下來的數據進行解析,按照item設定的數據結構經由爬蟲中間鍵,引擎發送給項目管道itempipeline
這里的項目管道itempipeline可以對數據進行進一步的清洗,存儲等操作
這里爬蟲極有可能從數據中解析到進一步的請求request,它會把請求經由引擎重新發送給調度器shelduler,調度器循環執行上述操作
5,項目管道itempipeline管理着最后的輸出
原理圖二

Scrapy數據流是由執行的核心引擎(engine)控制,流程是這樣的:
1、爬蟲引擎獲得初始請求開始抓取。
2、爬蟲引擎開始請求調度程序,並准備對下一次的請求進行抓取。
3、爬蟲調度器返回下一個請求給爬蟲引擎。
4、引擎請求發送到下載器,通過下載中間件下載網絡數據。
5、一旦下載器完成頁面下載,將下載結果返回給爬蟲引擎。
6、引擎將下載器的響應通過中間件返回給爬蟲進行處理。
7、爬蟲處理響應,並通過中間件返回處理后的items,以及新的請求給引擎。
8、引擎發送處理后的items到項目管道,然后把處理結果返回給調度器,調度器計划處理下一個請求抓取。
9、重復該過程(繼續步驟1),直到爬取完所有的url請求。
Scrapy各組件的功能
爬蟲引擎(ENGINE)
爬蟲引擎負責控制各個組件之間的數據流,當某些操作觸發事件后都是通過engine來處理。
調度器
調度接收來engine的請求並將請求放入隊列中,並通過事件返回給engine。
下載器
通過engine請求下載網絡數據並將結果響應給engine。
Spider
Spider發出請求,並處理engine返回給它下載器響應數據,以items和規則內的數據請求(urls)返回給engine。
管道項目(item pipeline)
負責處理engine返回spider解析后的數據,並且將數據持久化,例如將數據存入數據庫或者文件。
下載中間件
下載中間件是engine和下載器交互組件,以鈎子(插件)的形式存在,可以代替接收請求、處理數據的下載以及將結果響應給engine。
spider中間件
spider中間件是engine和spider之間的交互組件,以鈎子(插件)的形式存在,可以代替處理response以及返回給engine items及新的請求集。
