2012-06-20 47 views
5

我正在爬取一個網站(只有兩個級別),我想從兩個級別的網站上抓取信息。我遇到的問題是,我想用兩個級別的信息填寫一個項目的字段。我該怎麼做呢?Scrapy CrawlSpider:如何訪問不同級別的解析項目

我在想有一個項目列表作爲實例變量,所有線程都可以訪問(因爲它是蜘蛛的同一個實例),並且parse_1將填充一些字段,並且parse_2將不得不檢查在填寫相應的值之前更正密鑰。這種方法看起來很繁瑣,我仍然不確定如何使其工作。

我在想什麼是必須有一個更好的方法,可能以某種方式傳遞一個項目的回調。雖然我不知道如何使用Request()方法來做到這一點。想法?

回答

8

從scrapy文檔:

在某些情況下,你可能有興趣在傳遞參數給這些回調函數,所以你可以在以後收到的參數,在第二個回調。您可以使用Request.meta屬性。

這裏有一個如何使用這種機制,從不同的頁面填充不同的領域傳遞一個項目的例子:

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = 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 

所以,基本上你能湊夠第一頁的所有信息存儲在項目,然後發送全項目與該第二級網址的請求,並在一個項目中的所有信息。

+0

我曾經通過在URL中粘貼信息來做到這一點。這種方式似乎更好,特別是對於在URL中編碼不好的項目。謝謝! – Muhd

+1

如果我有兩頁 - 第2頁和第3頁 - 也有部分信息需要填寫,我怎樣才能在兩個不同的scrapy.Requests中按順序調用它們?我可以將「元」中的半滿項目傳遞給兩者,但我希望確保最終的「項」具有來自第1頁+第2頁+第3頁的所有數據 - 全部一起 – dowjones123