• 爬虫 ItemLoader


    # 使用Item Loaders对Item数据进行提取和解析(整理)。作用:
    # 之前的方式,是将数据的提取和解析混合在一起,但是Item Loaders是将这两个部分分开处理了;
    # 爬虫文件bole.py中只负责数据的提取;
    # Items.py文件负责数据的整理;(可以实现数据解析代码的重用。相当于将功能相同的解析函数封装成为一个公用的函数,任何爬虫需要这个函数,都可以来调用。)

    # 1. 使关于数据的提取代码更加简洁,结构更加清晰;
    # 2. 可以实现数据解析(整理)部分的代码的重用;
    # 3. 提高代码的可维护性;

    流程

    """
            1. 当创建item对象(item=JobboleItem())的时候,会去Items.py文件中初始化对应的input/output_processor处理器; 
            2. 当item中的处理器初始化完成,回到bole.py爬虫文件中,创建item_loader对象;
            3. item_loader对象创建完成,开始通过add_xpath/add_css/add_value收集数据;
            4. 每收集到一个数据,就会将该数据传递给对应字段对应的input_processor绑定的函数进行数据的处理;数据处理完成,会暂时保存在ItemLoader中;
            5. 循环第4步,将每一个字段的数据提取并交给input_processor,直到所有数据提取完毕,所有数据都会被保存在ItemLoader中;
            6. 调用load_item()函数,给item对象进行赋值;
            """

    在爬虫py中,

    from scrapy.loader import ItemLoader
    from ..items import JobboleItem
    item_loader = ItemLoader(item=JobboleItem(), response=response)
            item_loader.add_xpath('title', '//div[@class="entry-header"]/h1/text()')
            item_loader.add_xpath('date_time', '//p[@class="entry-meta-hide-on-mobile"]/text()')
            item_loader.add_xpath('tags', '//p[@class="entry-meta-hide-on-mobile"]/a/text()')
            item_loader.add_xpath('content', '//div[@class="entry"]//text()')
            item_loader.add_xpath('zan_num', '//div[@class="post-adds"]/span[contains(@class, "vote-post-up")]//text()')
            item_loader.add_xpath('keep_num', '//div[@class="post-adds"]/span[contains(@class, "bookmark-btn")]/text()')
            item_loader.add_xpath('comment_num', '//div[@class="post-adds"]/a/span/text()')
            item_loader.add_value('img_src', [response.meta['img_src']])
            item = item_loader.load_item()
            yield item

    在item 中

    from scrapy.contrib.loader.processor import Join, MapCompose, TakeFirst
    from scrapy.contrib.loader import ItemLoader
    class JobboleItem(scrapy.Item):
        title = scrapy.Field(
            # MapCompose映射类,可以将ItemLoader传递过来的列表中的元素,依次作用到input_test_title函数上,类似于map()函数。
            # input_processor=MapCompose(input_test_title),
            # Join(): 对列表进行合并,add_xpath/add_css/add_value传过来的列表数据。
            # output_processor=TakeFirst()
        )
        date_time = scrapy.Field(
            input_processor=MapCompose(convert_datetime),
            # TakeFirst(): 获取列表中的首个元素
            output_processor=TakeFirst()
        )
        tags = scrapy.Field(
            input_processor=MapCompose(convert_tags),
            # 覆盖默认的default_output_processor = TakeFirst()
            output_processor=Join()
        )
        content = scrapy.Field(
            output_processor=Join()
        )
    def convert_datetime(value):
        ................
    
        return date_time
  • 相关阅读:
    升级Node和Calico
    K8S在原有的集群上新增node节点(v1.19.5)
    Django的quickstart
    Jenkins配置python自动化点检项目
    Django的ORM一对多查询及联合查询
    Django的ORM查询
    mac系统安装mysqlclient的一些坑(附解决方法)
    tomcat中Context标签使用
    pipline语法
    android----AndroidViewModel访问SharedPreference,重启手机数据也存在
  • 原文地址:https://www.cnblogs.com/eunuch/p/9308576.html
Copyright © 2020-2023  润新知