我在将scrapy爬取来的内容存入Elasticsearch时发现这么一个问题:
Unable to serialize
研究了半天,发现其原有的serialize方法非常低效,不管是使用serializer还是重写serialize_field函数
def serialize_price(value):
return '$ %s' % str(value)
class Product(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field(serializer=serialize_price)
def serialize_field(self, field, name, value):
if field == 'price':
return '$ %s' % str(value)
return super(Product, self).serialize_field(field, name, value)
其实Item最主要的部分就是一个dict结构,有些时候它使用起来与普通的dict没有区别,但很多时候它无法代替dict的使用,因为dict是基本数据结构,而Item本质是一个class。
其实不用那么费劲去研究序列化,scrapy的这个设计个人觉得有点脱裤子放屁的感觉。一条语句搞定:
_xwDoc = {k: item[k] for k in item}
这样是不是把那个复杂的序列化解决了?