scrapy架構流程

1.爬蟲spiders將請求經過引擎傳遞給調度器schedulerpython

2.scheduler有個請求隊列,在請求隊列中拿出請求給下載器,downloadermysql

3.downloader從Internet的服務器端請求數據,下載下來redis

4.下載下來的響應體交還給咱們本身寫的spiders,對響應體作相應的處理sql

5.響應體處理後有兩種狀況,1):若是是數據,交給pipeline管道,處理數據 2):若是是請求,接着交給調度器放到請求隊列中等待處理,而後交給下載器處理,如此循環,直到沒有請求產生mongodb

 

 

 

redis-scrapy是基於scrapy框架的一套組件數據庫

scrapy是一個通用的爬蟲框架,不支持分佈式操做,scrapy-redis是爲了更方便的是scrapy進行分佈式的爬取,而提供了一些以redis爲基礎的組件(僅有組件)服務器

scrapy提供了四種組件(components),四種組件也就意味這四個模塊都要作相應的修改:框架

  1. scheduler
  2. duplication filter
  3. item pipeline
  4. base spider

scrapy的去重是在內存中執行的,若是請求量很是大的時候,scrapy佔用的內存會很是高,若是咱們把這個去重的指紋隊列放到redis數據庫中的話就會很方便了scrapy

scrapy中的數據是交給pipeline來處理的,在scrapy-redis中,數據是直接存儲到redis數據庫中的,而後咱們對數據進行處理持久化到mongodb中或者mysql中,由於redis也是基於內存的存儲,不適合持久化數據分佈式

Scheduler:

scrapy改造了python原本的collection.deque(雙向隊列)造成了本身的scrapy queue,可是scrapy多個spider不能共享待爬取隊列scrapy queue,即scrapy自己不支持爬取分佈式,scrapy-redis的解決是把這個scrapy queue換成redis數據庫(也是指redis隊列),從同一個redis-server存放要爬取的request,便能讓多個spider從同一個數據庫中讀取。

scrapy中跟待爬隊列直接相關的就是調度器scheduler,它把新的request進行入列操做,放到scrapy queue中,把要爬取的request取出,從scrapy queue中取出,它把待爬隊列按照優先級創建了一種字典結構

{
優先級0:隊列0
優先級1:隊列1
優先級2:隊列2
}

 

而後根據request中的優先級,來決定該入到哪一個隊列中,出列時則是按照優先級較小的優先出列。對於這個較高級別的隊列結構,scrapy要提供一系列的方法來管理它,原有的scrapy scheduler以沒法知足,此時須要使用scrapy-redis中的scheduler組件。

duplication filter:

scrapy中用集合來實現request的去重功能。scrapy中將已經發送的request指紋信息放入到set中,而後把將要發送的request指紋信息和set中的進行比較,若是存在則返回,不然繼續進行操做。核心實現功能代碼以下:

 1 def request_seen(self,request):
 2     #self.request_figerprints就是一個指紋集合
 3     fp=self.request_fingerprint(request)
 4 
 5     #這就是判重的核心操做
 6     if fp in self.fingerprints:
 7         return True
 8     self.fingerprints.add(fp)
 9     if self.file:
10         self.file.write(fp+os.linesep)

 

 

相關文章
相關標籤/搜索