2017-07-18 118 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