Scrapy - 基于条件的爬行

时间:2017-07-18 15:21:53

标签: scrapy scrapy-spider scrapy-pipeline

我有以下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 个答案:

答案 0 :(得分:1)

只需将项目分配给变量,然后产生该变量:

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

' if'语句将在管道之后运行。