回顾之前的BookSpider代码,我们使用Python字典存储一本书的信息,但字典可能有以下缺点:
1. 无法一目了然的了解数据中包含那些字段,影响代码可读性
2. 缺乏对字段名的检测,容易因程序猿笔误而出错
3. 不便于携带元数据(传递给其他组件的信息)
为解决上述问题,在Scrapy中可以使用自定义的Item类封装爬取到的数据
1. Item和Field
Scrapy提供了两个类,用户可以使用它们自定义数据类(如书籍信息),封装爬取到的数据:
Item基类
自定义数据类的基类
Field类
用来描述自定义数据类包含那些字段
改造之前的代码吧,打开items.py
文件
from scrapy import Item, Field
class BookItem(Item):
name = Field()
price = Field()
修改之前的BookSpider,使用BookItem代替Python字典
def parse(self, response):
# 提取数据
for book in response.css('article.product_pod'):
bk = BookItem()
bk['name'] = book.xpath('./h3/a/@title').extract_first()
bk['price'] = book.css('p.price_color::text').extract_first()
yield bk
#...代码省略
2. 拓展Item子类
可能要根据需求对已有的自定义数据类(Item子类)进行拓展,例如,example项目中又添加了一个新的Spider,它负责在另外的图书网站爬取国外书籍的信息,此书籍的信息比之前多了一个译者字段,此时可以继承BookItem定义一个ForeignBookItem类,在其中添加一个译者字段
简单的说,类的继承
class ForeignBookItem(BookItem):
translator = Field()
3. Field元数据
暂未更新