我正在尝试抓取一个页面之间不显示相同数据的网站。我希望我的蜘蛛为它无法抓取的每个属性返回默认值。我知道这可以像这样在项目声明中完成:
class MyItem(scrapy.Item):
myfield = scrapy.Field(default='NULL')
但是,这种方法似乎不再有效(我使用的是 Scrapy 1.3.0)。如果我在找不到值时尝试导出此特定字段,则得到:
KeyError: 'myfield'
有解决方法吗?
这是我为解决这个问题所做的工作。如@mizhgun所述,可以使用管道设置默认值。如果需要遍历字段,请使用 field
参数而不是内置的 item.items()
方法,因为items()
只返回填充的字段:
class DefaultValuesPipeline(object):
def process_item(self, item, spider):
for field in item.fields:
item.setdefault(field, 'NULL')
return item
大约 4 年前,Scrapy 中删除了对字段默认值的支持(我只是好奇您以前使用过哪个版本)。根据Pablo Hoffman推荐的方法是通过管道用默认值填充项目:
class DefaultValuesPipeline(object):
def process_item(self, item, spider):
item.setdefault('field1', 'value1')
item.setdefault('field2', 'value2')
# ...
return item
https://groups.google.com/d/msg/scrapy-users/-v1p5W41VDQ/0W9SIB07iDIJ
但是,您可以只扩展默认字段类来实现所需的行为。