Scrapy中使用ItemLoder(二):简易化的提高与理解
查看了许多关于ItemLoder的使用教学贴,整理出一些简单,易懂的使用方法,方便小白如我的童鞋们,能够更好更快的使用到ItemLoder。
第一步ItemLoder的使用步骤。
# ItemLoder在spider.py中使用
# 导入ItemLoder模块
from scrapy.loder import ItemLoder
# 实例化一个loder对象
loder = ItemLoder(item={},response=response)
ItemLoder中的两个属性item,response。item是一个容器对象,可以是字典,也可以是items.py中的item容器对象DemoItem();response属性是包含数据的源代码。
def demo_item(self, response):
# print("字段筛选")
self.response = response
# 实例化一个Itemloader对象
demo_loader = ItemLoader(item=Demo2Item(), response=response)
for key, value in xpath_set.items():
demo_loader.add_xpath(key, value.get("xpath"), **{"re": value.get("re")})
yield demo_loader.load_item()
ItemLoder有三种填充数据的方式:add_xpath根据xpath填充;add_css根据css选择器填充;add_value自定义填充。
使用方法:
loder.add_xpath(字段名,对应的xpath规则)
loder.add_css(字段名,对应的css选择器)
loder.add_value(字段名,自定义数据)
同时 也可以添加正则的处理方式**{“re”:正则匹配规则}
填充好数据后需要将数据采集到loder中,对应的方法是: loder.load_item()
注意,load_item() 采集到的数据都是list列表类型的。
根据需求,需要对采集到的数据进行处理。
第二步,采集数据的预处理
在items.py指定需要爬取的字段,也可以对load_item采集到的item字段进行预处理。
title = scrapy.Field()
字段中有两个处理器:输入处理器input_processor=;输出处理器output_processor=。
使用处理器可以对字段进行一些预处理,根据业务需求,可以调用自己写的函数方法,也可以用scrapy自带的处理器方法。
主要理解scrapy自带的处理器方法即可.
常用的自带处理器方法有:
Compose对每个字段列表进行处理,处理完返回给pipelines;
MapCompose对每个字段列表中的每个元素进行处理,类似于map高阶函数的作用,处理完返回给pipelines;
Join() 用于将指定的元素进行拼接,默认是以空格来拼接,可以指定拼接符号,Join(",");
TakeFirst() 作用是返回可迭代对象的第一个非空元素,常用于output_processor=TakeFirst()输出处理器;
Identity()作用是对字段不做任何处理,原样返回,一般没卵用;
Stop_on_none=True 表示遇到空元素是继续还是中断,一般没什么用O(∩_∩)O哈哈~。
自带处理器的方法需要调用:
from scrapy.loader.processors import TakeFirst, MapCompose, Join, Identity
使用方法如下:
# 在items.py文件中
def cleanout_text(value):
"""清洗文本信息"""
value = "".join(value.split())
value = re.findall("(.*\S)", value)
return value
def cleanout_source(value):
"""清洗来源信息"""
if value != "":
return value
else:
return "无来源"
class Demo2Item(scrapy.Item):
# define the fields for your item here like:
# 新闻标题
title = scrapy.Field(
input_processor=MapCompose(cleanout_text),
output_processor=TakeFirst())
# 新闻内容
content = scrapy.Field(
input_processor=MapCompose(cleanout_text, stop_on_none=True))
ItemLoder在特定的条件下比普通的response.xpath好用,由于ItemLoder需要的是固定的参数,返回的也是固定的数据类型,相对于response.xpath的extract_first()和extract()来说更灵活,方便代码的后期维护和检查。
也算是一个性能优化的方式吧。
最后,再多多一句,对于数据的处理还是放在pipelines管道中处理比较好,毕竟items中的预处理局限性太大了。