ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python scrapy.pipelines.images item_completed方法中[x for ok, x in results if ok]的意思

2022-04-06 15:04:36  阅读:365  来源: 互联网

标签:pipelines Python completed results item ok path self


今天在DEBUG的时候又出现了一个问题,用Scrapy下载图片,需要重写ImagesPipeline类的item_completed方法。
书上代码如下:

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem('Image Downloaded Failed')
        return item

大概的意思就是给图片的路径赋值,可我对[x['path'] for ok, x in results if ok]中的xok百思不得其解,path又是怎么来的?

Scrapy源码中,其父类的item_completed方法也有类似的推导式:

    def item_completed(self, results, item, info):
        if isinstance(item, dict) or self.images_result_field in item.fields:
            item[self.images_result_field] = [x for ok, x in results if ok]
        return item

xok是什么???

再往上推,在终极父类MediaPipeline中找到了一些思路,item_completed方法的代码如下所示:

    def item_completed(self, results, item, info):
        """Called per item when all media requests has been processed"""
        if self.LOG_FAILED_RESULTS:
            for ok, value in results:
                if not ok:
                    logger.error(
                        '%(class)s found errors processing %(item)s',
                        {'class': self.__class__.__name__, 'item': item},
                        exc_info=failure_to_exc_info(value),
                        extra={'spider': info.spider}
                    )
        return item

我是否也可以像上面那样,将列表推导式转换成普通的for循环?再单步调试一下不就知道x和ok的值了吗!
于是,将我的代码修改,如下所示:

    def item_completed(self, results, item, info):
        # image_paths = [x['path'] for ok, x in results if ok]
        image_paths = []
        for ok, x in results:
            if ok:
                image_paths.append(x)
        if not image_paths:
            raise DropItem('Image Downloaded Failed')
        return item

关于Scrapy项目的单步调试:
在scrapy.cfg的同级目录下新建一个py文件,其内容为

from scrapy.cmdline import execute
import os
import sys

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 执行 scrapy 内置的函数方法execute,  使用 crawl 爬取并调试,最后一个参数jobbole 是爬虫文件名
execute(['scrapy', 'crawl', 'images'])

在for循环处加上断点,调试结果如下所示:
在这里插入图片描述
可以很清晰的看出,results为一个列表,其元素是一个元组,元组的第一个元素为bool值即ok,用来判断下载成功或失败。第二个元素为一个字典即x,是该Item对应的下载结果,字典中分别有url、path、checksum三个键值对。

标签:pipelines,Python,completed,results,item,ok,path,self
来源: https://www.cnblogs.com/james-wangx/p/16106368.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有