概覽
本文描述了Scrapy的架構圖、數據流動、以及個組件的相互作用
架構圖與數據流
上圖中各個數字與箭頭代表數據的流動方向和流動順序,具體執行流程如下:
0. Scrapy將會實例化一個Crawler對象,在Crawler中:
創建spider對象----_create_spider
創建engine對象----_create_engine
通過engine對象打開spider並生成第一個request---- yield self.engine.open_spider(self.spider, start_requests)
實例化調度器對象----Scheduler
啟動引擎---- yield defer.maybeDeferred(self.engine.start)
1. 引擎從Spider獲取初始請求
----_next_request
----_next_request_from_scheduler
2. 引擎把初始請求給調度器,並向調度器詢問下一次請求
----scheduler.next_request
3. 調度器會對url進行指紋去重,如果是未爬取過的url,就把它放到隊列中等待,並把下一個request返回給引擎
把url放入到隊列中----enqueue_request
返回下一個request----next_request
4. 引擎把從調度器返回的request途徑下載中間件交給下載器
----download
5. 一旦頁面完成下載,下載器將會生成一個響應,途徑下載中間件,再把它交給引擎
----download
6. 引擎接收到響應,並把它途徑爬蟲中間件,再交給spider
----_handle_downloader_output
7. spdier接收到響應,並對它進行解析,解析出Items或者新的Request,再把它們途徑爬蟲中間件,提交給引擎
----parse
8. 引擎把接收到的items提交給Item Pipeline,把接收到的Request提交給調度器
9. 從步驟1開始重復該過程,直到不在有request
各組件介紹
ENGINE
引擎(engine)控制所有部件間的數據流,並在某些事件發生時觸發事件
Scheduler
調度器(scheduler)接收來自引擎的request,並對它去重,放入到請隊列中;並根據隊列的取出規則,把請求按順序返回給引擎
Downloader
下載器(Downloader)獲取網頁數據並返回給引擎
Spiders
爬蟲(Spiders)用來解析response,提取出Items和新的Requests
Item Pipeline
對Items進行進一步的清洗,並持久化
Downloader middlewares
下載中間件可以勾住下載器和引擎之間的數據流,並對它們做一些處理,比如:
- 在request送到下載器之前對它做一些處理,可以添加User_Agent,修改IP等
- 對response做一些處理
Spider middlewares
爬蟲中間件可以勾住爬蟲和引擎之間的數據流,並對它們做一些處理