Scrapy之item与itemload
Item
item对象是种简单的容器,类似于python的字典,用于保存处理爬取到的内容,item的用法与字典基本一致,所以可以把item当做字典来操作
item的声明
item声明在scrapy项目的items.py中,通过class和field对象来声明
import scrapy
#item声明和Django Models比较类似,不过只有field一种字段,比Django简单
class ItemTest(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
通过parse下的方法解析到item
item是爬取到数据的容器,我们可以用parse下的代码将数据存入item
from firstspider.items import ItemTest #引用Item
def parse_artical_text(self,response):
pass
item = ItemTest()
name = response.css('.grid-8 .entry-header h1::text')[0].extract()
price= response.css('.grid-8 .entry-meta p::text')[0].extract().strip().replace('·','').strip()
stock = response.css('.grid-8 .entry-meta p a::text')[0].extract().strip()
item['name'] = name
item['price] = price
item['stock] = stock
yield item
就是在parse下的方法里先提取数据在安装字典的方式依次写入item
更高级的方法
只用Item在字段过多的时候会显得代码量特别庞大,而且后期不好修改
from scrapy.Loader import ItemLoader
item_loader = ItemLoader(item=ItemTest,response=response)
item_loader.add_css('title','.grid-8 .entry-header h1::text')
item_loader.add_xpath('title','//id[@href ="sd"]')
item_loader.add_value('url',response.url)
item_loader.add_value('title',response.title)
使用itemloader可以使代码更简介,提取规则更容易维护,甚至可以从数据库里取到提取规则用于itemloader,更方便与后期的修改
field中的处理方法
from scrapy.loader.processors import MapCompose,TakeFirst
def filed_extract(value): #这里处理我们的接受到的数据,以及自定义数据
return value+".html"
class test(scrapy.Item):
title = scrapy.Field(
input_process = MapCompose(file_extract),
output_process = TakeFirst()
)
Input and Output processors
Item Loader在每个(Item)字段中都包含了一个输入处理器和一个输出处理器。 输入处理器收到数据时立刻提取数据 (通过 add_xpath(), add_css() 或者 add_value() 方法) 之后输入处理器的结果被收集起来并且保存在ItemLoader内. 收集到所有的数据后, 调用 ItemLoader.load_item() 方法来填充,并得到填充后的 Item 对象. 这是当输出处理器被和之前收集到的数据(和用输入处理器处理的)被调用.输出处理器的结果是被分配到Item的最终值