欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Scrapy 框架翻译】物品(Items)详解篇

程序员文章站 2022-05-08 16:58:37
...

版本号:Scrapy 2.4

内容介绍

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

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

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