SCRAPY_part5_Item Loaders

来源:互联网 发布:vb算法大全 编辑:程序博客网 时间:2024/06/05 04:46
  • Item Loaders : 通过自动解析获得的原始数据在 scrapy 的执行过程中填充 Items。换句话说,Item 提供了一种存储 scrapy 爬取的数据的容器,而 Item Loaders 则提供了一种填充这种容器的机制

  • 每一个 Item 在 Item Loader中都有一个 input processor 和一个output processor。input processor 将通过 add_xpath,add_css,add_value 获取和提取的数据进行处理,并将处理结果收集起来放到 ItemLoader 中。在数据收集完成后,调取ItemLoader.load_item()方法来填充,并得到填充后的 Item 对象。此时 output processor 将会被调用处理 input processor 之前收集的数据,并将处理结果复制给 item。在这一步中先调用输出处理器来处理之前收集到的数据,然后再存入Item中。output processor的结果是被分配到Item的最终值。

  • 需要注意的是, input processor 和output processor都是可调用对象,调用时传入需要被分析的数据, 处理后返回分析得到的值。因此你可以使用任意函数作为 input processor 、output processor。 唯一需注意的是它们必须接收一个(并且只是一个)iterator 性质的positional参数。
    input processor和 output processor 必须接受一个iterator作为它们的第一个参数。处理结果可以是任何数据。input processor 的处理结果会被放到 item loader 中的一个内部列表中,并append 到之前同字段收集的数据之后。而 output processor 的处理结果将被赋值给 item 中的字段。


  • 一、Item Loaders通过使用类定义语法类似Items。(懂语法不懂怎么用):

from scrapy.loader import ItemLoaderfrom scrapy.loader.processors import TakeFirst, MapCompose, Joinclass ProductLoader(ItemLoader):    default_output_processor = TakeFirst()    name_in = MapCompose(unicode.title)    name_out = Join()    price_in = MapCompose(unicode.strip)    # ...
  • 二、还可以在Field 元数据里定义:
import scrapyfrom scrapy.loader.processors import Join, MapCompose, TakeFirstfrom w3lib.html import remove_tagsdef filter_price(value):    if value.isdigit():        return valueclass Product(scrapy.Item):    name = scrapy.Field(        input_processor=MapCompose(remove_tags),        output_processor=Join(),    )    price = scrapy.Field(        input_processor=MapCompose(remove_tags, filter_price),        output_processor=TakeFirst(),    )#操作>>> from scrapy.loader import ItemLoader>>> il = ItemLoader(item=Product())>>> il.add_value('name', [u'Welcome to my', u'<strong>website</strong>'])>>> il.add_value('price', [u'&euro;', u'<span>1000</span>'])>>> il.load_item(){'name': u'Welcome to my website', 'price': u'1000'}


  • class scrapy.loader.ItemLoader([item, selector, response, ]**kwargs)
    参数:
    item(Item 对象):通过 add_xpath,add_css,add_value 等方法产生的 Item实例;
    selector(Selector 对象):在使用 add_xpath,add_css,add_value 等方法时,抽取数据的选择器;
    response(Response 对象):通过 default_response_class 产生的用来构建 selector 的 response,当 selector 参数给定时,response 被忽略。

  • Item Loader Context
    Item Loader Context 可由任意键值对组成,它被用来在 Item Loader 中所有的 input 和output processor 中共享数据。它可以在声明时,实例化时或者使用 Item Loader 时进行传递。它被用来改变 input/output processor 的行为。

    1. 通过修改当下激活的 Item Loader context 的值(context 属性):
      loader=ItemLoader(product)
      loader[‘unit’]=’cm’
    2. 在 Item Loader 实例化时(Item Loader 构建器里的关键字参数被存储在 Item Loader context 中):
      loader=ItemLoader(product,unit=’cm’)
    3. 在声明 Item Loader 时,有的 input/output processor 支持在实例化时设置 context,比
      如:MapCompose:
    class ProductLoader(ItemLoader):        length_out=MapCompose(parse_length,unit=’cm)

  • 重用和扩展 Item Loaders

  • 个人理解
    没有什么案例,Item 为一个爬虫定义了字段类型,而Item Loaders 则好像替代了 rules,定义将爬下来的数据怎么清洗最后再分配给Field ,两张用法,一是在ItemLoaders中像Item那样定义一个类class ProductLoader(ItemLoader):,二是在Field 元数据中定义。用add_value(),add_xpath(),add_css()等方法爬取数据。先通过input processor将爬来的数据一层一层清洗,然后再用output processor 输出到Field当值。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三只熊韩文版 三只熊谱子 三只熊国语版 三只熊中文 三只熊韩语下载 三只熊魔法屋童装 动画三只熊 三只熊韩语mp3下载 三只熊的早餐 三只熊韩语培训机构 三只熊儿童摄影团购 三只熊儿童摄影电话 三只熊儿童摄影怎么样 三只松鼠app 三只松鼠碧根果 婴儿打底衫 女大童上衣 三只小熊韩文 三只小熊儿歌 三只小熊歌曲 女童加绒加厚打底衫 宝宝长袖t恤女 儿童加厚打底衫 三只小熊童装 三只小熊中文版 韩语版三只小熊 三只小熊实体店 三只小熊韩语版 三只小熊 童装 三只小熊摄影 三只小熊照相 三只小熊韩语 三只小熊摄影怎么样 三只小熊舞蹈 三只小熊韩文歌曲 三只小熊影楼 三只小熊搞笑版 三只小熊公司 韩文版三只小熊 三只小熊音译 三只小熊 童话