一:scrapy 工作原理介紹:
千言萬語,不如一張圖來的清晰:
解釋說明:
1、從優先級隊列中獲取request對象,交給engine
2、engine將request對象交給下載器下載,期間會通過downloadmiddleware的process_request方法
3、下載器完成下載,獲得response對象,將該對象交給engine,期間會經過downloadmiddleware的process_response( )方法
4、engine將獲得的response對象交給spider進行解析,期間會經過spidermiddleware的process_spider_input()的方法
5、spider解析下載器下下來的response,返回item或是links(url)
6、item或者link經過spidermiddleware的process_spider_out( )方法,交給engine
7、engine將item交給item pipeline ,將links交給調度器
8、在調度器中,先將requests對象利用scrapy內置的指紋函數生成一個指紋4
9、如果requests對象中的don't filter參數設置為False,並且該requests對象的指紋不在信息指紋的隊列中,那么就把該request對象放到優先級隊列中
循環以上操作
中間件:
中間件主要存在兩個地方,從圖片當中我們可以看到:
spider 與 engine 之間:
主要功能是在爬蟲運行過程中進行一些處理.
download 與 engine 之間 :
主要功能在請求到網頁后,頁面被下載時進行一些處理.
作用:
1.Spider Middleware有以下幾個函數被管理:
- process_spider_input 接收一個response對象並處理,
位置是Downloader-->process_spider_input-->Spiders(Downloader和Spiders是scrapy官方結構圖中的組件)
- process_spider_exception spider出現的異常時被調用
- process_spider_output 當Spider處理response返回result時,該方法被調用
- process_start_requests 當spider發出請求時,被調用
2.Downloader Middleware有以下幾個函數被管理
- process_request request通過下載中間件時,該方法被調用
- process_response 下載結果經過中間件時被此方法處理
- process_exception 下載過程中出現異常時被調用