Scrapy基本概念——Items

一、Items

Item对象只是一个容器,用来保存爬取到的数据, 它提供了类似于字典的API。说白了,Item对象和字段(Field)对象都是一个字典,只不过Item对象增加了一个fields属性

二、声明Item

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

三、创建Item

>>> product = Product(name='Desktop PC', price=1000)
>>> print product
Product(name='Desktop PC', price=1000)

四、获取Item的字段

>>> product['name']
Desktop PC
>>> product.get('name')
Desktop PC
>>> product['price']
1000
>>> product['last_updated']
Traceback (most recent call last):
    ...
KeyError: 'last_updated'
>>> product.get('last_updated', 'not set')
not set
>>> product['lala'] # getting unknown field
Traceback (most recent call last):
    ...
KeyError: 'lala'
>>> product.get('lala', 'unknown field')
'unknown field'
>>> 'name' in product  # is name field populated?
True
>>> 'last_updated' in product  # is last_updated populated?
False
>>> 'last_updated' in product.fields  # is last_updated a declared field?
True
>>> 'lala' in product.fields  # is lala a declared field?
False

五、设置Item的字段

>>> product['last_updated'] = 'today'
>>> product['last_updated']
today
>>> product['lala'] = 'test' # setting unknown field
Traceback (most recent call last):
    ...
KeyError: 'Product does not support field: lala'

六、获取Item的所有字段

>>> product.keys()
['price', 'name']
>>> product.items()
[('price', 1000), ('name', 'Desktop PC')]
>>> product.fields
{'name': {}, 'price': {}, 'stock': {}}

七、其他任务

1、复制Item

>>> product2 = Product(product)
>>> print product2
Product(name='Desktop PC', price=1000)
>>> product3 = product2.copy()
>>> print product3
Product(name='Desktop PC', price=1000)

2、根据Item创建字典(dict)

>>> dict(product) # create a dict from all populated values
{'price': 1000, 'name': 'Desktop PC'}

3、根据字典(dict)创建Item

>>> Product({'name': 'Laptop PC', 'price': 1500})
Product(price=1500, name='Laptop PC')
>>> Product({'name': 'Laptop PC', 'lala': 1500}) # warning: unknown field in dict
Traceback (most recent call last):
    ...
KeyError: 'Product does not support field: lala'

八、扩展Item

您可以通过继承原始的Item来扩展item(添加更多的字段或者修改某些字段的数据)

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)

这段代码在保留所有原来数据的情况下添加(或者覆盖)了name字段的serializer

更多爬虫知识以及实例源码,可关注微信公众号:angry_it_man

### Scrapy框架使用指南 Scrapy是一个功能强大且灵活的Python爬虫框架,旨在帮助开发人员高效地从网页中提取数据[^1]。以下是关于如何使用Scrapy框架的一些关键点: #### 基本概念 Scrapy的核心理念围绕着Spider类展开,该类定义了如何访问特定网站并从中提取结构化数据。通过继承`scrapy.Spider`类,可以创建自定义蜘蛛来处理不同的目标站点。 #### 安装与配置 要开始使用Scrapy,需先安装它。可以通过pip命令轻松完成这一过程: ```bash pip install scrapy ``` 之后,在项目根目录下运行以下命令初始化一个新的Scrapy项目: ```bash scrapy startproject myproject ``` 这会生成一个标准的文件夹结构,其中包括多个重要组件如items.py、middlewares.py等[^2]。 #### 创建第一个Spider 下面展示了一个简单的例子,演示如何构建一个基础版本的Spider用于抓取指定URL的内容: ```python import scrapy class ExampleSpider(scrapy.Spider): name = 'example' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] def parse(self, response): self.log('Visited %s' % response.url) ``` 此代码片段展示了最基本的Spider设置方式——设定名称(`name`)、允许域列表(`allowed_domains`)以及起始链接集合(`start_urls`);接着重写parse函数实现逻辑解析响应对象(response)[^3]。 #### 数据存储管道(Pipelines) 为了保存已收集到的数据项至数据库或其他形式持久层介质当中去,通常还需要配置好相应的pipeline机制。例如将JSON格式的结果导出成文件的形式非常常见的一种做法就是利用内置提供的JsonWriterPipeline类或者自己动手编写类似的解决方案。 #### 中间件(Middlewares) 中间件提供了拦截请求和响应的能力,从而可以在不修改原始spiders的情况下改变它们的行为模式。比如UserAgentMiddleware就经常被用来模拟不同浏览器发出HTTP请求头信息以规避反爬策略的影响等等情况下的应用实例之一而已啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值