文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
12.7 定义 Item
爬取的主要目标就是从非结构性的数据源提取结构性数据。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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论