一、ItemLoader
与Item
的区别
ItemLoader
是负责数据的收集、处理、填充,item
仅仅是承载了数据本身- 数据的收集、处理、填充归功于
item loader
中两个重要组件:
- 输入处理
input processors
- 输出处理
output processors
- 输入处理
二、关于ItemLoader
的使用
- 1、创建一个项目并创建一个爬虫
2、在
item.py
中使用import scrapy from scrapy.loader import ItemLoader from scrapy.loader.processors import TakeFirst, MapCompose # 去除html标签的 from w3lib.html import remove_tags # 定义一个默认输出的 class ArticalItemLoader(ItemLoader): # 实现之前的extract_first()方法 # 这里只是重载这个属性,设置为只选取第一个值 default_output_processor = TakeFirst() # 以下将之前的各种清洗语句整合到函数中 def add_title_jobbole(value): return value + "---jobbole" # 处理时间的 def formate_date(value): if value.strip().replace('·', '').strip(): return value.strip().replace('·', '').strip() # 定义去除空格 def str_strip(str): return str.strip().replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '') # 定义一个item的 class JobboleArticalItem(scrapy.Item): title = scrapy.Field( input_processor=MapCompose(add_title_jobbole) ) time = scrapy.Field( input_processor=MapCompose(formate_date) ) content = scrapy.Field( input_processor=MapCompose(remove_tags, str_strip) )
3、在爬虫中使用刚刚定义的
import scrapy from itemloader.items import JobboleArticalItem, ArticalItemLoader class JobbleSpider(scrapy.Spider): name = 'jobble' allowed_domains = ['jobbole.com'] start_urls = ['http://blog.jobbole.com/113691/'] def parse(self, response): item_loader = ArticalItemLoader(item=JobboleArticalItem(), response=response) item_loader.add_css('title', '#post-113691 .entry-header h1::text') item_loader.add_css('time', '#post-113691 .entry-meta .entry-meta-hide-on-mobile::text') item_loader.add_css('content', '#post-113691 .entry') article_item = item_loader.load_item() yield article_item
4、运行爬虫
scrapy crawl jobble -o jobble.json
三、常见的内置处理器
1、
Identity
不对数据进行处理,直接返回原来的数据
2、
TakeFirst
返回第一个非空值,常用于单值字段的输出处理
3、
Join
相当于把列表中的元素拼接起来
- 4、
MapCompose
把几个方法组合起来