scrapy管道返回'NoneType'对象没有属性'__getitem__'

时间:2018-03-27 11:19:36

标签: python scrapy

在我的蜘蛛中,我有两个管道,一个用于图像,一个用于文件,

蜘蛛中的

我检查了这样的图像结果

if len(self.img_) >= 0:
    item['image_urls'] = self.img_

并对文件也这样做。

if len(self.result) >= 0:
    item['file_urls'] = self.result

我的设置就像管道

一样
'ScrawlerScraper.images.ImgPipeline': 1,
'ScrawlerScraper.fld_pipeline.FilesPipeline': 2

首先出现在图像管道中的我的过程项是这样的

def process_item(self, item, spider):
        try:
            request = [x for x in item['image_urls']]
            for x in request:
                dfd = spider.crawler.engine.download(x, spider)
                dfd.addBoth(self.return_item, item)
                return dfd
        except logging.info('No images'): 
            return item

对于文件管道

,这是相同的
def process_item(self, item, spider):
        try:
            request = [x for x in item['file_urls']]
            for x in request:
                dfd = spider.crawler.engine.download(x, spider)
                dfd.addBoth(self.return_item, item)
                return dfd
        except logging.error('No Files Problem'):
            return item

我这样做是因为我得到了多张图片而且只能在蜘蛛中产生一次。

我不明白为什么我在第二个管道中出现错误

fld_pipeline.py", line 23, in process_item
request = [x for x in item['file_urls']]
TypeError: 'NoneType' object has no attribute '__getitem__'

如果没有item['file_urls'],管道甚至不应该执行。

我完全不知道发生了什么。

感谢您提供任何帮助,我希望我的问题不会错误地形成..

这是我检查退出文件的地方,如果没有,则返回项目。也许我错了,我在循环中并试图返回该项目。 但它回到下一个管道,因为没有

 for x in item['image_urls']:
        try:
            a = urlparse.urlparse(x)
        except TypeError:
            logging.info('No images')
            return item
        file_name = os.path.basename(a.path)
        try:
            u = sock.Worker().get_url(x)
        except TypeError:
            logging.info('No images')
            return item
        if u:
            try:
                os.path.exists(settings.get('IMAGES_STORE') + file_name)
                logging.info("Image Already Downloaded: %s " % a.path)
                item['image_urls'].append(settings.get('IMAGES_STORE') + file_name)
                return item
            except TypeError:
                data = u.read()
                with open(settings.get('IMAGES_STORE') + file_name, 'wb') as code:
                    code.write(data)
                    logging.info("Downloading (%s)" % a.path,)
                item['image_urls'].append(settings.get('IMAGES_STORE') + file_name)
                return item

1 个答案:

答案 0 :(得分:2)

你的try / except子句不正确。您必须列出错误类型,而不是说它要记录的内容。试试这个:

    try:
        request = [x for x in item['image_urls']]
        for x in request:
            dfd = spider.crawler.engine.download(x, spider)
            dfd.addBoth(self.return_item, item)
            return dfd
    except TypeError:
        logging.info('No images') 
        return item