版本号: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)
项子类使用简单的类定义语法和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)
>>> product = Product(name='Desktop PC', price=1000)
>>> print(product)
Product(name='Desktop PC', price=1000)
>>> product['name']
Desktop PC
>>> product.get('name')
Desktop PC
>>> product['price']
1000
# 一般错误提示,同字典报错
>>> product['lala'] # 获取未定义的字段值
Traceback (most recent call last):
...
KeyError: 'lala'
>>> product['last_updated'] = 'today'
>>> product['last_updated']
today
>>> product.keys()
['price', 'name']
>>> product.items()
[('price', 1000), ('name', 'Desktop PC')]
product2 = product.copy()
# 或者
product2 = Product(product)
>>> Product({
'name': 'Laptop PC', 'price': 1500})
Product(price=1500, name='Laptop PC')
# 直接定义数据类型
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)
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