2017-07-18 121 views
1

我有以下Scrapy解析方法:Scrapy - 基於條件爬行

def parse(self, response): 
     item_loader = ItemLoader(item=MyItem(), response=response) 
     for url in response.xpath('//img/@src').extract(): 
      item_loader.add_value('image_urls', response.urljoin(url)) 
     yield item_loader.load_item() 
     # If item['images_matched'] == True: 
     # yield Request(links, callback=parse) 

此發送所提取的圖像的URL到ImagePipelines。我需要讓Scrapy抓取該頁面的其他鏈接,如果滿足某些條件......像......圖像內容的校驗和與哈希列表相匹配。


我的問題是,我不知道如何,一旦它在ImagesPipeline已經完工,它的填充與所有的數據訪問項目。含義item['images_matched']不會在解析方法中填充,而是在管道中填充。需要幫助的任何訪問該項目或不同的方法來此


編輯:我發現,添加以下,yield後,工作。

yield Request(link, callback=parse, meta={'item': item_loader.load_item()}) 

但是,這看起來像編碼令人難以置信的糟糕,因爲該項目字典有時可能會相當大。通過檢查一個屬性是很奇怪的。有沒有更好的辦法?

回答

1

的項目只是分配給一個變量,然後產生變量:

item = item_loader.load_item() 
yield item 
if item['images_matched']: 
    yield Request(links, callback=parse) 

的「如果」語句將管道之後運行。

+0

謝謝。我實際上嘗試過這樣的事情,但它不起作用。不知道我的錯誤在哪裏,因爲我刪除了該代碼。 – Akustik