爬虫的主要目的就是从非数据结构性的数据源提取结构性的数据源,例如:在《Scrapy爬虫初步尝试》这篇博客中,咱们已经爬取到了伯乐在线,全部的文章信息(从中爬取了文章的建立时间,标题,评论数,点赞数,收藏数等相关字段)。如何返回提取的数据呢?Scrapy能够以Python的dict来返回提取的数据,虽然这样很方便,用起来也很方便,但其缺乏结构性,好比:咱们在爬取伯乐在线的时候,收藏数用的是mark_num,可是,在爬取另一个网站时用到的是fav_num,这样就很容易形成返回的数据不一致的问题。数据结构
为了定义经常使用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取获得的数据。其提供了相似于字典的API以及用于声明可用字段的简单语法。scrapy
除此以外,Scrapy组件使用了Item提供的额外信息:exporter根据Item声明的字段来导出数据、序列化能够经过Item的元数据(metadata)来定义、trackref追踪Item的实例来帮助寻找内存泄露。网站
仍是以jobbole爬取来讲明,保存咱们在伯乐在线爬取到的相关数据。url
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属性进行访问。code
#实例化一个item对象 article_item = JobboleArticleItem()
article_item["title"] = title article_item["create_date"] = create_date article_item["url"] = response.url article_item["front_image_url"] = img_url article_item["praise_num"] = praise_num article_item["mark_num"] = mark_num article_item["comments_num"] = comments_num article_item["tags"] = tags article_item["content"] = content
article_item["title"] article_item.get("title","")
1.获取全部取到的值对象
article_item.keys() article_item.items()