Scrapy Get returned Value from pipeline

721 Views Asked by At

I'm trying to get returned value from pipeline. I'm using yield generator to generate item.

And this is my code.

def get_or_create(model):
    model_class = type(model)
    created = False

    try:
        obj = model_class.objects.get(product_company=model.product_company, barcode=model.barcode)
    except model_class.DoesNotExist:
        created = True
        obj = model  # DjangoItem created a model for us.
        obj.save()
    return (obj, created)


def update_model(destination, source, commit=True):
    pk = destination.pk
    source_dict = model_to_dict(source)
    for (key, value) in source_dict.items():
        setattr(destination, key, value)
    setattr(destination, 'pk', pk)
    if commit:
        destination.save()
    return destination
class ProductItemPipeline(object):
    def process_item(self, item, spider):

        if isinstance(item, ProductItem):
            item_model = item.instance
            model, created = get_or_create(item_model)
            item['cover_photo'] = item['files'][0]['path']
            if created:
                item.save()
                for image in item['files']:
                    imageItem = ProductImageItem(image=image['path'], product=model)
                    imageItem.save()
                for comment in item['comments']:
                    commentItem = CommentItem(comment=comment.comment, product=model)
                    commentItem.save()
            return model

Also this is my spider.

 item = ProductItem(name=name, price=price, barcode=barcode, file_urls=objectImages, product_url=response.url,product_company=company, comments = comments)
        product = yield item
        print type(product)
        print "yield product"

And product type is returning nonetype

1

There are 1 best solutions below

0
On

You don't understand python yield. You should use yield like return for return some function result. You can find more information about generators in this article

So your code will look like

item = ProductItem(name=name, price=price, barcode=barcode, file_urls=objectImages, product_url=response.url,product_company=company, comments = comments)
self.logger.debug(type(product))
self.logger.debug('yield product')
yield item