返回介绍

5.1 Item Pipeline

发布于 2024-02-05 21:13:20 字数 2880 浏览 0 评论 0 收藏 0

通过一个例子讲解Item Pipeline的使用,在第1章的example项目中,我们爬取到的书籍价格是以英镑为单位的:

$ scrapy crawl books -o books.csv
...
$ head -5 books.csv  # 查看文件开头的5 行
name,price
A Light in the Attic,£51.77
Tipping the Velvet,£53.74
Soumission,£50.10
Sharp Objects,£47.82

如果我们期望爬取到的书价是人民币价格,就需要用英镑价格乘以汇率计算出人民币价格(处理数据),此时可以实现一个价格转换的Item Pipeline来完成这个工作。接下来在example项目中实现它。

5.1.1 实现Item Pipeline

在创建一个Scrapy项目时,会自动生成一个pipelines.py文件,它用来放置用户自定义的Item Pipeline,在example项目的pipelines.py中实现PriceConverterPipeline,代码如下:

class PriceConverterPipeline(object):

 # 英镑兑换人民币汇率
 exchange_rate = 8.5309

 def process_item(self, item, spider):
  # 提取item的price 字段(如£53.74)
  # 去掉前面英镑符号£,转换为float 类型,乘以汇率
  price = float(item['price'][1:]) * self.exchange_rate

  # 保留2 位小数,赋值回item的price 字段
  item['price'] = '¥%.2f' % price

  return item

对上述代码解释如下:

一个Item Pipeline不需要继承特定基类,只需要实现某些特定方法,例如process_item、open_spider、close_spider。

一个Item Pipeline必须实现一个process_item(item, spider)方法,该方法用来处理每一项由Spider爬取到的数据,其中的两个参数:

 Item 爬取到的一项数据(Item或字典)。

 Spider 爬取此项数据的Spider对象。

上述代码中的process_item方法实现非常简单,将书籍的英镑价格转换为浮点数,乘以汇率并保留2位小数,然后赋值回item的price字段,最后返回被处理过的item。

可以看出,process_item方法是Item Pipeline的核心,对该方法还需再做两点补充说明:

如果process_item在处理某项item时返回了一项数据(Item或字典),返回的数据会递送给下一级Item Pipeline(如果有)继续处理。

如果process_item在处理某项item时抛出(raise)一个DropItem异常(scrapy.exceptions.DropItem),该项item便会被抛弃,不再递送给后面的Item Pipeline继续处理,也不会导出到文件。通常,我们在检测到无效数据或想要过滤数据时,抛出DropItem异常。

除了必须实现的process_item方法外,还有3个比较常用的方法,可根据需求选择实现:

open_spider(self, spider)

Spider打开时(处理数据前)回调该方法,通常该方法用于在开始处理数据之前完成某些初始化工作,如连接数据库。

close_spider(self, spider)

Spider关闭时(处理数据后)回调该方法,通常该方法用于在处理完所有数据之后完成某些清理工作,如关闭数据库。

from_crawler(cls, crawler)

创建Item Pipeline对象时回调该类方法。通常,在该方法中通过crawler.settings读取配置,根据配置创建Item Pipeline对象。

在后面的例子中,我们展示了以上方法的应用场景。

5.1.2 启用Item Pipeline

在Scrapy中,Item Pipeline是可选的组件,想要启用某个(或某些)Item Pipeline,需要在配置文件settings.py中进行配置:

ITEM_PIPELINES = {
  'example.pipelines.PriceConverterPipeline': 300,
}

ITEM_PIPELINES是一个字典,我们把想要启用的Item Pipeline添加到这个字典中,其中每一项的键是每一个Item Pipeline类的导入路径,值是一个0~1000的数字,同时启用多个Item Pipeline时,Scrapy根据这些数值决定各Item Pipeline处理数据的先后次序,数值小的在前。

启用PriceConverterPipeline后,重新运行爬虫,并观察结果:

$ scrapy crawl books -o books.csv
...
$ head -5 books.csv # 查看文件开头的5 行
name,price
A Light in the Attic,¥441.64
Tipping the Velvet,¥458.45
Soumission,¥427.40
Sharp Objects,¥407.95

使用PriceConverterPipeline对数据进行处理后,books.csv中的书价转换成了人民币价格。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文