scrapy中关于ItemLoader的使用

一、ItemLoaderItem的区别

  • 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把几个方法组合起来

猜你喜欢

转载自blog.csdn.net/kuangshp128/article/details/80036750