【Scrapy 框架】「版本2.4.0源码」物品(Items)详解篇

全部源码解析文章索引目录传送门

【Scrapy 框架】版本 2.4.0 源码篇:全部配置目录索引

内容介绍

数据抓取的主要目标是从非结构化源(通常是网页)中提取结构化数据。

本章节介绍源码中的案例,个人感觉处理数据的操作比较繁琐,将数据处理的流程简化到最简的内容在专栏中的爬虫示例中,如果觉得文章中数据处理繁琐的小伙伴可以跳转过去直接看示例。

Items提供了一个可以读取、写入、修改的数据的字典供使用。

dictionaries:数据类型是字典。

Item objects:拥有与字典相同的操作。

from scrapy.item import Item, Field

class CustomItem(Item):
    one_field = Field()
    another_field = Field()

dataclass objects:支持序列化定义项目数据中的数据类型

from dataclasses import dataclass

@dataclass
class CustomItem:
    one_field: str
    another_field: int

attrs objects:支持序列化转换数属性

import attr

@attr.s
class CustomItem:
    one_field = attr.ib(str)
    another_field = attr.ib(convert=float)

使用Items

声明字段

项子类使用简单的类定义语法和Field属性,也就是要自定义好抓取内容的列表字段名,将抓取的数据按照列联表的方式填充到表格中。

import scrapy

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field()
    tags = scrapy.Field()
    last_updated = scrapy.Field(serializer=str)

字段数据

  1. 创建Items
>>> product = Product(name='Desktop PC', price=1000)
>>> print(product)
Product(name='Desktop PC', price=1000)
  1. 获取Items的值
>>> product['name']
Desktop PC
>>> product.get('name')
Desktop PC
>>> product['price']
1000
# 一般错误提示,同字典报错
>>> product['lala'] # 获取未定义的字段值
Traceback (most recent call last):
    ...
KeyError: 'lala'
  1. 设置Items的值
>>> product['last_updated'] = 'today'
>>> product['last_updated']
today
  1. 字典操作Items
>>> product.keys()
['price', 'name']

>>> product.items()
[('price', 1000), ('name', 'Desktop PC')]
  1. 复制Items
product2 = product.copy()
# 或者
product2 = Product(product)
  1. 字典创建Items
>>> Product({
    
    'name': 'Laptop PC', 'price': 1500})
Product(price=1500, name='Laptop PC')
  1. 数据类型扩展
# 直接定义数据类型
class DiscountedProduct(Product):
    discount_percent = scrapy.Field(serializer=str)
    discount_expiration_date = scrapy.Field()

# 使用序列化的方式进行定义
class SpecificProduct(Product):
    name = scrapy.Field(Product.fields['name'], serializer=my_serializer)

Spider中的使用

from myproject.items import Product
 
def parse(self, response):
	item = Product()
    item["name"]= response.xpath('//div[@class="xxx"]/text()').extract()
	item["price"]= response.xpath('//div[@class="xxx"]/text()').extract()
	item["stock"]= response.xpath('//div[@class="xxx"]/text()').extract()
	item["tags"]= response.xpath('//div[@class="xxx"]/text()').extract()
	item["last_updated"]= response.xpath('//div[@class="xxx"]/text()').extract()
    yield item 

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/113491113