返回介绍

12.7 定义 Item

发布于 2024-01-26 22:39:51 字数 2204 浏览 0 评论 0 收藏 0

爬取的主要目标就是从非结构性的数据源提取结构性数据。CnblogsSpider类的parse()方法中解析出了url、title、time、content等数据,但是如何将这些数据包装为结构化数据呢?scrapy提供Item类来满足这样的需求。Item对象是一种简单的容器,用来保存爬取到的数据,提供了类似于词典的API以及用于声明可用字段的简单语法。Item使用简单的class定义语法以及Field对象来声明。在新建的cnblogSpider项目中,有一个items.py文件,用来定义存储数据的Item类,这个类需要继承scrapy.Item。代码如下:

  class CnblogspiderItem(scrapy.Item):
     # define the fields for your item here like:
     url = scrapy.Field()
     time = scrapy.Field()
     title = scrapy.Field()
     content = scrapy.Field()

我们对已经声明好的CnblogspiderItem进行操作,发现Item的操作方式和字典的操作方式非常相似。

·创建CnblogspiderItem对象

  item = CnblogspiderItem(title="Python爬虫",content='爬虫开发')

·获取字段的值

  print item['title']
  print item.get('title')

·设置字段的值

  item['title']="爬虫"

·获取所有的键和值

  print item.keys()
  print item.items()

·Item的复制

  item2 = CnblogspiderItem (item)
  item3 = item.copy()

·dict与item的转化

  dict_item = dict(item)
  item = CnblogspiderItem({'title':'爬虫','content':'开发'})

除了以上的操作,还可以对Item进行扩展。通过继承原始的Item来扩展Item,用来添加更多的字段。例如拓展一下CnblogspiderItem,添加一个body字段:

  class newCnblogItem(CnblogspiderItem):
     body = scrapy.Field()

也可以通过使用原字段的元数据,添加新的值或修改原来的值来扩展字段的元数据:

  class newCnblogItem(CnblogspiderItem):
  title = scrapy.Field(CnblogspiderItem.fields['title'], serializer=my_serializer)

这段代码在保留所有原来的元数据值的情况下添加了title字段的serializer。

讲解完Item的用法,需要将parse()中提取出的url、title、time、content封装成Item对象,parse()方法的代码如下:

  def parse(self, response):
     # 实现网页的解析
     # 首先抽取所有的文章
     papers = response.xpath(".// *[@class='day']")
     # 从每篇文章中抽取数据
     for paper in papers:
       url = paper.xpath(".// *[@class='postTitle']/a/@href").extract()[0]
       title = paper.xpath(".// *[@class='postTitle']/a/text()").extract()[0]
       time = paper.xpath(".// *[@class='dayTitle']/a/text()").extract()[0]
       content = paper.xpath(".// *[@class='postTitle']/a/text()").extract()[0]
       item = CnblogspiderItem(url=url,title=title,time=time,content=content)
       yield item

代码最后使用yield关键字提交item,将parse方法打造成一个生成器,这是parse方法中最精彩的地方。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文