首页 > 解决方案 > 在 Django 中引发 AttributeError(f"Use item[{name!r}] = {value!r} to set field value")

问题描述

我们正在学习将 Scrapy 与 Django 连接的教程。

这是我们的 model.py 文件:

class Siteinformation(models.Model):
    unique_id = models.CharField(max_length=100, null=True)
    data = models.CharField(max_length=1000, null=True) 
    timestamp = models.DateTimeField(default=timezone.now)

    @property
    def to_dict(self):
        data = {
            'data': json.loads(self.data),
            'timestamp': self.timestamp
        }
        return data

    def __str__(self):
        return self.unique_id

这是 pipelines.py 文件:

class ShopspiderappPipeline(object):
    def __init__(self, unique_id, *args, **kwargs):
        self.unique_id = unique_id
        self.items = []

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            unique_id=crawler.settings.get('unique_id'), 
        )

    def close_spider(self, spider):         
        item = Siteinformation()
        item.unique_id = self.unique_id
        item.data = json.dumps(self.items)
        item.save()

    def process_item(self, item, spider):
        self.items.append(item['url'])
        return item

这是 spider.py 文件:

class ShopSpider(CrawlSpider):
    name = 'shop'
    def __init__(self, *args, **kwargs):

        self.url = kwargs.get('url')
        self.domain = kwargs.get('domain')
        self.start_urls = [self.url]
        self.allowed_domains = [self.domain]

        ShopSpider.rules = [
            Rule(LinkExtractor(unique=True), callback='parse_item'),
        ]
        super(ShopSpider, self).__init__(*args, **kwargs)

    def parse_item(self, response):
                
        item = Siteinformation()
        item = {}
        item['url'] = response.url
        yield item

不幸的是,它产生了这个错误:

2021-06-29 17:17:45 [scrapy.core.engine] ERROR: Scraper close failure
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/twisted/internet/defer.py", line 662, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Users/.../.../..../shopspiderapp/shopspiderapp/pipelines.py", line 31, in close_spider
    item.unique_id = self.unique_id
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/scrapy/item.py", line 112, in __setattr__
    raise AttributeError(f"Use item[{name!r}] = {value!r} to set field value")
AttributeError: Use item['unique_id'] = '0a55d509-bd36-49ba-b3c8-313fbadcd3de' to set field value

这个 AttributeError 是什么意思?没有数据写入数据库。关于解决问题的任何想法?

标签: pythondjangoscrapy

解决方案


推荐阅读