当前位置: 首页 > news >正文

高级深入--day31

Item Pipeline

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

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

  • 验证爬取的数据(检查item包含某些字段,比如说name字段)
  • 查重(并丢弃)
  • 将爬取结果保存到文件或者数据库中

编写item pipeline

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

import somethingclass SomethingPipeline(object):def __init__(self):    # 可选实现,做参数初始化等# doing somethingdef process_item(self, item, spider):# item (Item 对象) – 被爬取的item# spider (Spider 对象) – 爬取该item的spider# 这个方法必须实现,每个item pipeline组件都需要调用该方法,# 这个方法必须返回一个 Item 对象,被丢弃的item将不会被之后的pipeline组件所处理。return itemdef open_spider(self, spider):# spider (Spider 对象) – 被开启的spider# 可选实现,当spider被开启时,这个方法被调用。def close_spider(self, spider):# spider (Spider 对象) – 被关闭的spider# 可选实现,当spider被关闭时,这个方法被调用

完善之前的案例:

item写入JSON文件

以下pipeline将所有(从所有'spider'中)爬取到的item,存储到一个独立地items.json 文件,每行包含一个序列化为'JSON'格式的'item'。

打开 pipelines.py 文件,写入下面代码:

# pipelines.pyimport jsonclass ItcastJsonPipeline(object):def __init__(self):self.file = open('teacher.json', 'wb')def process_item(self, item, spider):content = json.dumps(dict(item), ensure_ascii=False) + "\n"self.file.write(content)return itemdef close_spider(self, spider):self.file.close()
启用一个Item Pipeline组件

为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置,就像下面这个例子:

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {#'mySpider.pipelines.SomePipeline': 300,"mySpider.pipelines.ItcastJsonPipeline":300
}

分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)

重新启动爬虫

将parse()方法改为4.2中最后思考中的代码,然后执行下面的命令:

scrapy crawl itcast

查看当前目录是否生成teacher.json

http://www.lryc.cn/news/189542.html

相关文章:

  • 一文讲解图像梯度
  • 湖州OLED透明拼接屏技术应用引领现代化旅游观光方式
  • 点云从入门到精通技术详解100篇-点云特征学习模型及其在配准中的应用(续)
  • 铁道交通运输运营3D模拟仿真实操提供一个沉浸、高效且环保的情境
  • yum apt pip 阿里云源
  • Python+Tkinter 图形化界面基础篇:多线程和异步编程
  • 第13章 并发编程高阶(二)
  • Android AMS——栈管理详解(十一)
  • 【Redis】Set集合相关的命令
  • 力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)
  • MARKDOWN 文档图片编码嵌入方案
  • KubeVela可持续测试应用部署之Mock基础设施
  • 代理IP、Socks5代理与网络工程:解析技术世界的无限可能
  • OpenCV级联分类器识别车辆实践笔记
  • VS编译的时候不生成Release文件夹
  • 14.2 Socket 反向远程命令行
  • PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)
  • CSS 中::after的妙用(实现在margin中显示内容)
  • SentenceTransformer使用多GPU加速向量化
  • 架构师-软件工程习题选择题
  • springboot单独在指定地方输出sql
  • gpio内部结构(一)
  • 【C++14保姆级教程】变量模板,Labmda泛型
  • LLM - 旋转位置编码 RoPE 代码详解
  • Vue之VueX知识探索(一起了解关于VueX的新世界)
  • 提升吃鸡战斗力,分享顶级作战干货!
  • 【rust】cargo的概念和使用方法
  • MySQL数据库——SQL优化(2)-order by 优化、group by 优化
  • C++DAY43
  • 大模型的超级“外脑”——向量数据库解决大模型的三大挑战