2015-11-07 95 views
2

我正在與Scrapy苦苦掙扎,我不明白在回調之間傳遞項目是如何工作的。也許有人可以幫助我。scrapy:理解項目和請求之間如何工作回調

我期待到http://doc.scrapy.org/en/latest/topics/request-response.html#passing-additional-data-to-callback-functions

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = scrapy.Request("http://www.example.com/some_page.html", 
          callback=self.parse_page2) 
    request.meta['item'] = item 
    return request 

def parse_page2(self, response): 
    item = response.meta['item'] 
    item['other_url'] = response.url 
    return item 

我想了解一步的行動那裏流動,步:

[parse_page1]

  1. item = MyItem() < - 對象項目被創建
  2. item['main_url'] = response.url < - 我們正在分配value to main_url object item
  3. request = scrapy.Request("http://www.example.com/some_page.html", callback=self.parse_page2) < - 我們正在請求一個新頁面並啓動parse_page2來取消它。

[parse_page2]

  • item = response.meta['item'] < - 我不理解這裏。我們正在創建一個新的對象項目,或者這是在[parse_page1]中創建的對象項目?什麼response.meta ['item']的意思是?我們通過在3請求唯一信息,如鏈接和回調,我們沒有增加,我們可以指的是任何額外的參數...
  • item['other_url'] = response.url < - 我們要分配值other_url對象項目
  • return item <的 - 我們正在返回項對象作爲請求
  • [parse_page1]

  • request.meta['item'] = item <結果 - 我們分配對象項來請求?但是請求完成後,回調已經在6中返回項了?
  • return request < - 我們正在收到請求的結果,所以從6項開始,對嗎?
  • 我經歷了所有的文檔就有關scrapy和請求/響應/元,但我還是不明白髮生了什麼事在這裏點4和7

    +2

    請檢查:http://stackoverflow.com/questions/20663162/scrapy-passing-item-between-methods – eLRuLL

    回答

    3
    line 4: request = scrapy.Request("http://www.example.com/some_page.html", 
             callback=self.parse_page2) 
    line 5: request.meta['item'] = item 
    line 6: return request 
    

    你感到困惑以前的代碼,讓我解釋一下(我列舉的解釋在這裏):

    1. 第4行中,你是一個實例化對象scrapy.Request,這並不像其他其他請求圖書館的工作,在這裏你是不是調用烏爾l,而且還沒有進入回調函數。

    2. 您要添加的參數給scrapy.Request對象在第5行,因此,例如,你也可以聲明scrapy.Request對象,如:

      request = scrapy.Request("http://www.example.com/some_page.html", 
           callback=self.parse_page2, meta={'item': item})` 
      

      ,你就可以避免線5。

    3. 是在第6行,當你調用scrapy.Request對象,當scrapy是使它的工作,比如調用指定的網址,去下面的回調,並通過meta有了它,你不需經過也避免了線6 (第5行),如果你會叫這樣的要求:

      return scrapy.Request("http://www.example.com/some_page.html", 
           callback=self.parse_page2, meta={'item': item})` 
      

    所以這裏的想法是,你的回調方法應該return(最好yield)一個Request或與Item,scrapy將outpu t Item並繼續爬行Request

    +0

    我需要的,謝謝! – michalk

    0

    @ eLRuLL的回答非常好。我想添加項目轉換的一部分。首先,我們將明確回調函數只有在該請求的響應被重載之前才起作用。

    在scrapy.doc給出的代碼中,它不聲明page1和url的url和請求。讓我們將page1的url設置爲「http://www.example.com.html」。

    [parse_page1]是

    scrapy.Request("http://www.example.com.html",callback=parse_page1)` 
    

    [parse_page2]回調的

    scrapy.Request("http://www.example.com/some_page.html",callback=parse_page2) 
    

    當第1頁的響應被下載回調,parse_page1被調用來生成第2頁的請求:

    item['main_url'] = response.url # send "http://www.example.com.html" to item 
    request = scrapy.Request("http://www.example.com/some_page.html", 
             callback=self.parse_page2) 
    request.meta['item'] = item # store item in request.meta 
    

    在下載page2的響應後,調用parse_page2給retru N A項:

    item = response.meta['item'] #response.meta is equal to request.meta,so here item['main_url'] ="http://www.example.com.html". 
    
    item['other_url'] = response.url # response.url ="http://www.example.com/some_page.html" 
    
    return item #finally,we get the item recordind urls of page1 and page2.