Item Pipeline

当Item在Spider中被生成之后,它将被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。

每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃还是存储。一下是Item Pipeline的一些典型应用:

  1. - 验证爬取的数据(检查Item是否包含某些字段)
  2. - 查重(并丢弃)
  3. - 将爬取的结果保存到文件或者数据库中

编写Item pipeline

编写item pipeline很简单,item pipeline组件是一个独立的Python类,其中process_item()方法必须实现:

  1. class NewsPipeline(obejct):
  2. # 可选实现,做参数初始化等(仅被调用一次)
  3. def __init__(self):
  4. pass
  5. def open_spider(self, spider):
  6. # spider(Spider对象)——开启的Spider
  7. # 可选实现,当Spider被开启时,该方法会被调用(仅被调用一次)
  8. pass
  9. def process_item(self, item, spider):
  10. # item(Item对象)——Spider生成的Item对象
  11. # spider(Spider对象)——爬取该item的Spider
  12. # 这个方法必须实现,每处理一个item就需要调用一次该方法
  13. # 该方法最后必须要返回一个Item对象,如果没有返回,被该方法处理过的item不会被后续的pipeline文件处理。
  14. # 同时,引擎也会不知道当前item是否被处理完成。
  15. return item
  16. def close_spider(self, spider):
  17. # spider(Spider对象)——被关闭的spider
  18. # 可选实现,当spider停止时,该方法会被调用(仅被调用一次)
  19. pass

实例演示—将item数据保存到JSON文件中

  1. import json
  2. class NewsPipeline:
  3. # 做一些初始化的事情
  4. def __init__(self):
  5. self.fw = open('news_pipeline.json', 'w', encoding='utf-8')
  6. # 处理Item对象的方法
  7. def process_item(self, item, spider):
  8. # 将Item对象转换为JSON
  9. # 首先将Item对象转换为一个dict
  10. item_dict = dict(item)
  11. # 在将字典转换为JSON字符串
  12. content = json.dump(item_dict, ensure_ascii=False) + ',\n'
  13. self.fw.write(content)
  14. # 注意写入完文件后要将item返回,返回给 引擎, 告诉 引擎这个item已经被处理完了
  15. # 如果此处不返回,信号就中断了,引擎无法得知item是否已经被处理完
  16. return item
  17. # 当Spider停止时,会调用该方法
  18. def close_spider(self, spider):
  19. self.fw.close()

启用一个Item Pipeline组件

当Item Pipeline管道文件编写完成后,需要进行启用。即将管道类添加到settings.py文件中的ITEM_PIPELINE进行配置。如下所示:

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

从上述实例可以看出,ITEM_PIPELINES是以字典的方式进行配置,可以配置多个管道。并且在配置的时候会分配给每个类一个整型的值,scrapy引擎就是通过这个值确定管道类的执行顺序,item按数字从低到高的顺序,通过pipeline。通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,管道类的优先级越高)

启动爬虫

执行下述命令,启动爬虫:
scrapy crawl news
注意:在那个目录下执行上述命令,爬取的数据就会存在哪个目录下。