scrapy核心組件工做流程和post請求

一 . 五大核心組件的工做流程 

    • 引擎(Scrapy)
      用來處理整個系統的數據流處理, 觸發事務(框架核心)
    • 調度器(Scheduler)
      用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 能夠想像成一個URL(抓取網頁的網址或者說是連接)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
    • 下載器(Downloader)
      用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是創建在twisted這個高效的異步模型上的)
    • 爬蟲(Spiders)
      爬蟲是主要幹活的, 用於從特定的網頁中提取本身須要的信息, 即所謂的實體(Item)。用戶也能夠從中提取出連接,讓Scrapy繼續抓取下一個頁面
    • 項目管道(Pipeline)
      負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不須要的信息。當頁面被爬蟲解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據。
五大核心組件 : 
    spider : 從這裏開始 ---> 做用 : 產生一個或者一批url / parse()對數據進行解析
    url-->封裝成請求對象-->引擎(接收spider提供的請求對象,可是尚未請求到數據)
    引擎-->(請求對象)-->調度器(調度請求): 過濾器的類->去重(有可能會出現相同的請求對象)-->隊列(數據類型,存的就是請求對象)
    而後調度器從隊列中調度出來一個請求對象給-->引擎-->給下載器-->請求對象-->互聯網進行下載
    互聯網-->響應對象-->給下載器-->引擎(響應對象)-->給spider中的回調方法,進行解析
    解析到的對象封裝到item對象中-->引擎-->管道,持久化存儲
    而後 調度器再次從隊列中調出來一個url,在.........
    
    核心問題 : 引擎是用來觸發事物的,可是引擎怎麼知道在何時什麼節點去觸發那些事物?
    解答 : 在工做過程當中,全部的數據流都會通過'引擎',也就是說 '引擎'是根據接收到的數據流來斷定應該去觸發那個事物
           好比 : 當 spider 給'引擎'提交了個item,引擎一旦接收了個數據類型是item的時候,
                  引擎立刻就會知道下一步應該實例化管道,在掉管道中process_item方法
    
    全部實例化的操做,事物的觸發都是由引擎執行的
文字整理

 

 

 

二 . post請求發送

  - 在以前的代碼中,我麼你歷來沒有過手動的對start_urls列表中存儲的起始url進行過請求的發送,可是起始url的確進行了請求的發送,這是怎麼實現的呢?
框架

  - 解答 : 實際上是爬蟲文件中的爬蟲類繼承了Spider父類中的start_urls(self)這個方法,該方法就能夠對start_urls列表中的url發起請求 : 異步

  def start_requests(self):
        for u in self.start_urls:
           yield scrapy.Request(url=u,callback=self.parse)

  注意 : 該方法默認的是進行get請求的發送,若是想要進行post請求,就要重寫該方法 : scrapy

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)
相關文章
相關標籤/搜索