下面是我在这只蜘蛛身上发现的东西:
phone_model = SmartphoneItem()
phone_model['sku_number'] = sku_number
# code omitted
cellular_network = CellularNetworkItem()
cellular_network['phone_model'] = phone_model
cellular_network['speed'] = speed
...在models.py中:
class CellularNetwork(models.Model):
phone_model = models.ForeignKey('Smartphone', unique=True)
...
class Smartphone(models.Model):
sku_number = models.IntegerField(max_length=40, primary_key=True)
....在items.py中:
class CellularNetworkItem(DjangoItem):
django_model = CellularNetwork
class SmartphoneItem(DjangoItem):
django_model = Smartphone但是,分配phone_model = SmartphoneItem()显然不会产生智能手机模型。
我正在刮一堆规范,并希望在源验证数据。由于数据必须标准化以进行验证,所以我更愿意用一块石头杀死太多的鸟,然后立即更新数据库。
从表面上看,ORMs相对于简单的Scrapy项目的关系能力才是销售DjangoItem的原因。但是我似乎找不到在蜘蛛中直接利用这个特性的任何例子。我似乎使用了管道,用isinstance模式匹配逐个处理对象.我开始怀疑直接将Django模型导入到蜘蛛中是否会更好。
更新:已解决。
基于How to update DjangoItem in Scrapy,我将其放入蜘蛛中以直接返回Django模型实例:
def item_to_model(self, item):
model_class = getattr(item, 'django_model')
if not model_class:
raise TypeError("Item is not a `DjangoItem` or is misconfigured")
return item.instance更新2:仍然损坏:
说得太早了。虽然这提供了一个有效的Django实例,但它不是实例。以下是djangoitem.py的相关部分:
@property
def instance(self):
if self._instance is None:
modelargs = dict((k, self.get(k)) for k in self._values
if k in self._model_fields)
self._instance = self.django_model(**modelargs)
return self._instance我不完全明白这是怎么回事,但我想它给了我们一个新的例子。
发布于 2017-08-17 21:37:56
问题看起来很老,但无论如何。首先,您缺少了一个将“传递”项“传递”给Django的管道。Second,对于FK,您需要Django对象(适当的模型)的实例,而不是Scrapy item的实例。因此,您的代码应该看起来有点像这样:
class SmartphonePipeline(object):
def process_item(self, item, spider):
sku_number = item['sku_number']
smartphone, created = Smartphone.objects.get_or_create(sku_number=item['sku_number'])
if created:
smartphone.save()
class CellularNetworkPipeline(object):
def process_item(self, item, spider):
smartphone_item = item['phone_model']
smartphone = Smartphone.objects.get(sku_number=smartphone_item["sku_number"])
cellular_network, created = CellularNetwork.objects.get_or_create(phone_model=smartphone)
cellular_network.speed = item['speed']
cellular_network.save()
return itemhttps://stackoverflow.com/questions/28650955
复制相似问题