Items
爬虫的主要目的就是从非数据结构性的数据源提取结构性的数据源,例如:在《Scrapy爬虫初步尝试》这篇博客中,我们已经爬取到了伯乐在线,所有的文章信息(从中爬取了文章的创建时间,标题,评论数,点赞数,收藏数等相关字段)。如何返回提取的数据呢?Scrapy可以以Python的dict来返回提取的数据,虽然这样很方便,用起来也很方便,但其缺少结构性,比如:我们在爬取伯乐在线的时候,收藏数用的是mark_num,但是,在爬取另外一个网站时用到的是fav_num,这样就很容易造成返回的数据不一致的问题。
为了定义常用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取得到的数据。其提供了类似于字典的API以及用于声明可用字段的简单语法。
除此之外,Scrapy组件使用了Item提供的额外信息:exporter根据Item声明的字段来导出数据、序列化可以通过Item的元数据(metadata)来定义、trackref追踪Item的实例来帮助寻找内存泄露。
- 声明Item(Item使用简单的class定义语法以及Field对象来声明)。例如:
还是以jobbole爬取来说明,保存我们在伯乐在线爬取到的相关数据。
class ArticleItem(scrapy.Item): title = scrapy.Field() #文章标题 create_date = scrapy.Field() #创建日期 url = scrapy.Field() #url url_object_id = scrapy.Field() #url的md5值 front_image_url = scrapy.Field() #封面图路径 front_image_path = scrapy.Field() #本地保存路径 parse_num = scrapy.Field() #点赞数 mark_num = scrapy.Field() #收藏数 comments_num = scrapy.Field() #评论数 tags = scrapy.Field() #标签 content = scrapy.Field() #文章内容
关于Field对象:Field对象指明了每个对象的元数据(metadata)。可以为每个字段指明任何类型的元数据。需要注意的是,用来声明item的Field对象并没有被赋值class的属性。不过可以通过Item.fields属性进行访问。
- 实例化一个item对象
#实例化一个item对象article_item = JobboleArticleItem()
- 为item对象赋值
article_item["title"] = titlearticle_item["create_date"] = create_datearticle_item["url"] = response.urlarticle_item["front_image_url"] = img_urlarticle_item["praise_num"] = praise_numarticle_item["mark_num"] = mark_numarticle_item["comments_num"] = comments_numarticle_item["tags"] = tagsarticle_item["content"] = content
- 获取字段的值
article_item["title"]article_item.get("title","")
1.获取所有取到的值
article_item.keys()article_item.items()