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

scrapy的建模及管道的使用

一、数据建模

通常在做项目的过程中,在items.py中进行数据建模

  1. 为什么建模

定义item即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查,配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,在目标字段少的时候可以使用字典代替。使用scrapy的一些特定组件需要Item做支持,如scrapy的ImagesPipeline管道类,百度搜索了解更多

  1. 如何建模

在items.py文件中定义要提取的字段:

class MyspiderItem(scrapy.Item): name = scrapy.Field()   # 讲师的名字title = scrapy.Field()  # 讲师的职称desc = scrapy.Field()   # 讲师的介绍
  1. 如何使用模板类

模板类定义以后需要在爬虫中导入并且实例化,之后的使用方法和使用字典相同

from myspider.items import MyspiderItem   # 导入Item,注意路径
...def parse(self, response)item = MyspiderItem() # 实例化后可直接使用item['name'] = node.xpath('./h3/text()').extract_first()item['title'] = node.xpath('./h4/text()').extract_first()item['desc'] = node.xpath('./p/text()').extract_first()print(item)
  1. 注意:

from myspider.items import MyspiderItem这一行代码中 注意item的正确导入路径,忽略pycharm标记的错误
python中的导入路径要诀:从哪里开始运行,就从哪里开始导入

二、管道的使用

  1. pipeline中常用的方法:
  • process_item(self,item,spider): 管道类中必须有的函数 实现对item数据的处理 必须return item
  • open_spider(self, spider): 在爬虫开启的时候仅执行一次
  • close_spider(self, spider): 在爬虫关闭的时候仅执行一次
  1. 管道文件的修改

在pipelines.py代码中完善

import json
from pymongo import MongoClientclass BaiduFilePipeline(object):def open_spider(self, spider):  # 在爬虫开启的时候仅执行一次if spider.name == 'baidu':self.f = open('json.txt', 'a', encoding='utf-8')def close_spider(self, spider):  # 在爬虫关闭的时候仅执行一次if spider.name == 'baidu':self.f.close()def process_item(self, item, spider):if spider.name == 'baidu':self.f.write(json.dumps(dict(item), ensure_ascii=False, indent=2) + ',\n')# 不return的情况下,另一个权重较低的pipeline将不会获得itemreturn item  class WangyiMongoPipeline(object):def open_spider(self, spider):  # 在爬虫开启的时候仅执行一次if spider.name == 'baidu':# 也可以使用isinstanc函数来区分爬虫类:con = MongoClient(host='127.0.0.1', port=27017) # 实例化mongoclientself.collection = con.baidu.teachers # 创建数据库名为baidu,集合名为teachers的集合操作对象def process_item(self, item, spider):if spider.name == 'baidu':self.collection.insert(item) # 此时item对象必须是一个字典,再插入# 如果此时item是BaseItem则需要先转换为字典:dict(BaseItem)# 不return的情况下,另一个权重较低的pipeline将不会获得itemreturn item
  1. 开启管道

在settings.py设置开启pipeline

ITEM_PIPELINES = {'myspider.pipelines.ItcastFilePipeline': 400, # 400表示权重'myspider.pipelines.ItcastMongoPipeline': 500, # 权重值越小,越优先执行!
}
  1. 思考:在settings中能够开启多个管道,为什么需要开启多个?

不同的pipeline可以处理不同爬虫的数据,通过spider.name属性来区分,不同的pipeline能够对一个或多个爬虫进行不同的数据处理的操作,比如一个进行数据清洗,一个进行数据的保存同一个管道类也可以处理不同爬虫的数据,通过spider.name属性来区分

  1. pipeline使用注意点
  1. 使用之前需要在settings中开启
  2. ipeline在setting中键表示位置(即pipeline在项目中的位置可以自定义),值表示距离引擎的远近,越近数据会越先经过:权重值小的优先执行
  3. 有多个pipeline的时候,process_item的方法必须return item,否则后一个pipeline取到的数据为None值
  4. pipeline中process_item的方法必须有,否则item没有办法接受和处理
  5. process_item方法接受item和spider,其中spider表示当前传递item过来的spider
  6. open_spider(spider) :能够在爬虫开启的时候执行一次
  7. close_spider(spider):能够在爬虫关闭的时候执行一次
  8. 上述俩个方法经常用于爬虫和数据库的交互,在爬虫开启的时候建立和数据库的连接,在爬虫关闭的时候断开和数据库的连接

三、编写位置

在这里插入图片描述

相关文章:

  • docker: Error response from daemon: failed to create shim task: OCI runtime
  • 【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加
  • Java的第二十一章:网络通信
  • 解决在Linux中进行redis的主从复制时出现的从机可以获取到主机的信息,主机获取不到从机的信息~
  • Linux C++ 贪吃蛇游戏 -- 方向键控制蛇移动
  • 三、Zookeeper数据模型
  • 苍穹外卖项目笔记(7)— 微信登录、商品浏览
  • python中序列类型运算符
  • 大数据Doris(三十一):Doris简单查询
  • LeetCode103. Binary Tree Zigzag Level Order Traversal
  • 微服务--03--OpenFeign 实现远程调用 (负载均衡组件SpringCloudLoadBalancer)
  • 快速安装Axure RP Extension for Chrome插件
  • WordPress(安装比子主题文件)zibll-7.5.1
  • springboot的配置文件加载总结
  • C++作业5
  • [译]如何构建服务器端web组件,为何要构建?
  • 【译】理解JavaScript:new 关键字
  • Git学习与使用心得(1)—— 初始化
  • java概述
  • JS基础之数据类型、对象、原型、原型链、继承
  • node学习系列之简单文件上传
  • PHP 小技巧
  • Python语法速览与机器学习开发环境搭建
  • vue.js框架原理浅析
  • Webpack 4 学习01(基础配置)
  • web标准化(下)
  • Xmanager 远程桌面 CentOS 7
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 测试如何在敏捷团队中工作?
  • 对象引论
  • 服务器从安装到部署全过程(二)
  • 前端知识点整理(待续)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 小而合理的前端理论:rscss和rsjs
  • 自动记录MySQL慢查询快照脚本
  • HanLP分词命名实体提取详解
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​香农与信息论三大定律
  • # Apache SeaTunnel 究竟是什么?
  • (C++)八皇后问题
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (排序详解之 堆排序)
  • (七)理解angular中的module和injector,即依赖注入
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)h264中avc和flv数据的解析
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .cfg\.dat\.mak(持续补充)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET程序员迈向卓越的必由之路
  • .NET导入Excel数据
  • .net流程开发平台的一些难点(1)