使用ItemPipeline处理数据

应用

  • 清洗数据
  • 验证数据有效性
  • 过滤重复数据
  • 将数据存入数据库

    案例一

    目的

    将前面爬取的以英镑为单位的数据转换为以人名币为单位

代码

在Scrapy框架中自动生成的pipelines.py就是为了帮助我们处理数据的

1
2
3
4
5
6
7
8
9
10
11
12
13
class PachongPipeline(object):
# 英镑兑换人名币
exchange_rate = 8.5593
# 处理每一项由Spider爬取到的数据
# item:爬取到的一项数据
# spider:爬取此项的Spider对象
def process_item(self, item, spider):
# 提取item的price字段
# 去掉前面的英镑符号£,转换为float类型,乘以汇率
price = float(item['price'][1:]) * self.exchange_rate
# 保留2位小数,赋值回item的price字段
item['price'] = '¥%.2f' % price
return item

常见方法

  • process_item(必须)
  • open_spider(self,spider)

    处理数据前回调该方法,通常用来完成初始化工作,比如连接数据库

  • close_spider(self,spider)

    处理数据后回调该方法,通常用来清理工作,比如关闭数据库

  • from_crawler(cls,crawler)

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

启用Item Pipeline

在Scrapy框架中自动生成的settings.py中进行配置,找到

1
2
3
4
5
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
# 'pachong.pipelines.PachongPipeline': 300,
#}

取消注释即可,如果有多个Item Pipeline对象,则在ITEM_PIPELINES字典中添加即可,后面的数值决定了各Item Pipeline的处理数据先后,值越小越先执行

结果

1
2
3
4
5
6
7
# 查看前5行
MacBook-Pro:pachong mac$ head -5 book.csv
name,price
A Light in the Attic,¥443.11
Tipping the Velvet,¥459.98
Soumission,¥428.82
Sharp Objects,¥409.31

案例二

目的

过滤重复数据

代码

1
2
3
4
5
6
7
8
9
10
11
class DuplicatesPipeline(object):
# 增加构造器,在其初始化用于对书名去重的集合
def __init__(self):
self.book_set = set()
# 先取出item的name字段,检查其是否在集合book_set中,如果存在抛出DropItem异常,否则将item的name字段存入集合
def process_item(self, item, spider):
name = item['name']
if name in self.book_set:
raise DropItem("Duplicate book found:%s" % item)
self.book_set.add(name)
return item

启用Item Pipeline

别忘了向前面一样在settings.py中进行配置

结果

1
2
# 爬出999条,其中有一条重复
2018-05-22 22:07:30 [scrapy.core.scraper] WARNING: Dropped: Duplicate book found:{'name': 'The Star-Touched Queen', 'price': '¥276.47'}
赏个🍗吧
0%