response.follow_all()方法:要从一个可迭代对象创建多个请求,可以使用response.follow_all()方法。anchors=response.css(li.nexta::attr(href))yieldfromresponse.follow_all(urls=anchors,callback=self.parse)或者,将其进一步缩短:yieldfromresponse.follow_all(css=li.nexta::attr(href),callback=self.parse)Scrapy框架中除了通过feed提供简单的数据输出管道参数“-o”功能之外,框架的ItemPipeline组件还提供了数据输出处理。ItemPipeline组件主要通过框架中的两个文件完成响应的功能,我们可以打开“d:\fspiders\fspiders”目录,可以看到其中“items.py”和“pipeline。py”两个文件,这是模板自动生成。5.5.1items编写爬虫的主要目标是从通常是web页面的非结构化源中提取结构化数据。爬行器可以将提取的数据作为Python中定义为“键-值”对的对象item数据项返回。“items.py”文件就是用来提供定义需要提取的item数据项的文件。5.5数据管道1、定义ItemItem是保存爬取到的数据的容器,其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。通过创建一个scrapy.Item子类,并且定义类型为scrapy.Field的类属性来定义一个Item。如下例:importscrapyclassFspiderItem(scrapy.Item):#创建一个继承scrapy.Item的子类name=scrapy.Field()price=scrapy.Field()stock=scrapy.Field()tags=scrapy.Field()last_updated=scrapy.Field(serializer=str)5.5数据管道这样就定义了一个类似于pyhon字典dict类型的数据容器,其中,name、price、stock、tags和last_updated为Item项的“键”名称。在spiders组件的parse()方法中,通过将需提取的数据赋值给item,如item[name]=response.css(li.nexta::attr(href)).get(),完成数据提取到items容器中。2、项目字段FieldField对象用于为每个字段指定元数据。例如,last_updated上面示例中说明的字段的序列化函数功能。Field对象接受的值没有任何限制,可以通过Item.fields属性访问它们。3、使用Item对items的数据项的操作非常类似于dict字典。对字典的适用的方法等基本都是用于item对象。例5-6示。5.5数据管道例5-6:item容器应用。importscrapyclassFspiderItem(scrapy.Item):#创建一个继承了scrapy.Item的子类name=scrapy.Field()price=scrapy.Field()stock=scrapy.Field()last_updated=scrapy.Field(serializer=str)#实例化类fsitem=FspiderItem()fsitem1=FspiderItem(name=python,price=1000)#实例化类print(fsitem=,fsitem,及fsitem1=,fsitem1)#字段填充和获取字段值fsitem[name]=DesktopPCprint(fsitem[name])print(fsitem.get(name))#访问所有填充值print(fsitem1.keys())print(fsitem1.items())5.5数据管道4、spiders中的item项的应用示例以例5-5fspider目录下的例子为基础,首先将目录下的“items.py”文件修改为:importscrapyclassFspiderItem(scrapy.Item):#创建一个继承了scrapy.Item的子类text