【Scrapy Item和Item Loaders】基本使用和以及Item Loaders(项目加载器)的基本使用

                                        Item的基本使用

        Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便。  Item提供了类字典的API,并且可以很方便的声明字段,很多Scrapy组件可以利用Item的其他信息。基本的使用方法如下:

import scrapy
class MovieItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()

        Field对象可用来对每个字段指定元数据。例如上面last_updated的序列化函数指定为str,可任意指定元数据,不过每种元数据对于不同的组件意义不一样。

        访问item中的值,就如访问字典值一样,如下:

#设置值的方法
product['last_updated'] = 'today'

#访问值得方法

>>> product['last_updated']
today

>>> product.keys()
['price', 'name']

>>> product.items()
[('price', 1000), ('name', 'Desktop PC')]

>>> product.get('name')
Desktop PC

                                      Item Loader的基本使用

        Item Loader为我们提供了生成Item的相当便利的方法。Item为抓取的数据提供了容器,而Item Loader可以让我们非常方便的将输入填充到容器中。

       Item Loaders(项目加载器),意义,当项目很大的时候,提取的字段数以百计,做维护是很困难的。
       所以scrapy就提供了ItemLoader这样一个容器,在这个容器里面可以配置item中各个字段的提取规则。可以通过函数分析原始数据,并对Item字段进行赋值,非常的便捷。参考网站:https://blog.csdn.net/zwq912318834/article/details/79530828
       可以这么来看 Item 和 Itemloader:Item提供保存抓取到数据的容器,而 Itemloader提供的是填充容器的机制。
       Itemloader提供的是一种灵活,高效的机制,可以更方便的被spider或source format (HTML, XML, etc)扩展并重写,更易于维护,尤其是分析规则特别复杂繁多的时候。

一般地使用方法,在爬虫.py文件中使用:

from scrapy.loader import ItemLoader
#从items中调用Product的类
from myproject.items import Product
def parse(self, response):
    #ItemLoader中的参数包含两个参数,第一个是引入的类,第二个是浏览器响应的结果
    l = ItemLoader(item=Product(), response=response)
    #这个是三种字段的添加方法
    l.add_xpath('name', '//div[@class="product_name"]')
    l.add_css('stock', 'p#stock]')
    l.add_value('last_updated', 'today') # you can also use literal values
    #添加load_item()来提交字段
    return l.load_item()填充到容器中

在item.py中可以自定义字段:

有两种方法,第一种是在item自定义Itemloader类中添加

from scrapy.loader import ItemLoader
#Identity、TakeFirst、Join、Compose、MapCompose、SelectJmes都是内置的处理器
from scrapy.loader.processors import TakeFirst, MapCompose, Join

class ProductLoader(ItemLoader):
    #定义默认的ItemLoader.default_input_processor和ItemLoader.default_input_processor
    default_output_processor = TakeFirst()
    #通过_in和_out后缀来定义输入和输出处理器
    name_in = MapCompose(unicode.title)
    name_out = Join()
    price_in = MapCompose(unicode.strip)

第二种方式是在item文件Field方法定义中添加

import scrapy
#Identity、TakeFirst、Join、Compose、MapCompose、SelectJmes都是内置的处理器
from scrapy.loader.processors import Join, MapCompose, TakeFirst
from w3lib.html import remove_tags

def filter_price(value):
    if value.isdigit():
        return value

class 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(),
    )
发布了56 篇原创文章 · 获赞 2 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/fan13938409755/article/details/104838136