1. pipeline中常用的方法:

管道能够实现数据的清洗和保存,能够定义多个管道实现不同的功能,其中有个三个方法:

  1. process_item(self,item,spider):实现对item数据的处理

    • 管道类中必须有的函数
    • 实现对item数据的处理
    • 必须return item
  2. open_spider(self, spider): 在爬虫开启的时候仅执行一次    【相当于__init__】
  3. close_spider(self, spider): 在爬虫关闭的时候仅执行一次     【相当于__del__】

2. 管道文件的修改

继续在pipelines.py代码中完善代码

思路分析:

示例代码:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass WangyiItem(scrapy.Item):# define the fields for your item here like:name = scrapy.Field()link = scrapy.Field()depart = scrapy.Field()category = scrapy.Field()type = scrapy.Field()address = scrapy.Field()num = scrapy.Field()date = scrapy.Field()duty = scrapy.Field()require = scrapy.Field()class WangyiSimpleItem(scrapy.Item):# define the fields for your item here like:name = scrapy.Field()link = scrapy.Field()depart = scrapy.Field()category = scrapy.Field()type = scrapy.Field()address = scrapy.Field()num = scrapy.Field()date = scrapy.Field()

示例代码:

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

3. 开启管道

在settings.py设置开启pipeline

......
ITEM_PIPELINES = {'myspider.pipelines.ItcastFilePipeline': 400, # 400表示权重'myspider.pipelines.ItcastMongoPipeline': 500, # 权重值越小,越优先执行!
}
......

示例代码:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import json
from pymongo import MongoClientclass WangyiPipeline:def open_spider(self, spider):if spider.name == 'job':self.file = open('wangyi.json', 'w')def process_item(self, item, spider):if spider.name == 'job':item = dict(item)str_data = json.dumps(item, ensure_ascii=False) + ',\n'self.file.write(str_data)return itemdef close_spider(self, spider):if spider.name == 'job':self.file.close()class WangyiSimplePipeline:def open_spider(self, spider):if spider.name == 'job_simple':self.file = open('wangyisimple.json', 'w')def process_item(self, item, spider):if spider.name == 'job_simple':item = dict(item)str_data = json.dumps(item, ensure_ascii=False) + ',\n'self.file.write(str_data)return itemdef close_spider(self, spider):if spider.name == 'job_simple':self.file.close()class MongoPipeline(object):def open_spider(self, spider):self.client = MongoClient('192.168.88.136', 27017)self.db = self.client['itcast']self.col = self.db['wangyi']def process_item(self, item, spider):data = dict(item)self.col.insert(data)def close_spider(self, spider):self.client.close()

别忘了开启mongodb数据库 sudo service mongodb start 并在mongodb数据库中查看 mongo

思考:在settings中能够开启多个管道,为什么需要开启多个?

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

4. pipeline使用注意点

  1. 使用之前需要在settings中开启
  2. pipeline在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. 上述俩个方法经常用于爬虫和数据库的交互,在爬虫开启的时候建立和数据库的连接,在爬虫关闭的时候断开和数据库的连接

Scrapy框架中管道的使用相关推荐

  1. scrapy框架中实现登录人人网(一)(最新登录方式)

    最近在弄scrapy框架的问题,感觉里面好玩的东西有很多,无意中在bilibili中看到关于在scrapy实现登录人人网的视频,人人网可能用户少,所以在现在的一些博客和教程里面看到最新的登录方法几乎没 ...

  2. 在scrapy框架中如何设置开放代理池达到反爬的目的

    我们在随机爬取某个网站的时候,比如对网站发出成千上万次的请求,如果每次访问的ip都是一样的,就很容易被服务器识别出你是一个爬虫.因此在发送请求多了之后我们就要设置ip代理池来随机更换我们的ip地址,使 ...

  3. Scrapy框架中的crawlspider爬虫

    1 crawlspider是什么 在spider中要寻找下一页的url地址或者内容的url地址,想想是否有简单的方法省略寻找url的过程? 思路: 从response中提取所有的满足规则的url地址 ...

  4. python pipeline框架_Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法...

    原博文 2017-07-17 16:39 − 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的pytho ...

  5. Scrapy框架中解决OSError=[Errno 2] No such file or directory: 'Xvfb': 'Xvfb'

    当在scrapy框架的Middlewares.py中导入以下语句后报错 from pyvirtualdisplay import Display display = Display(visible=0 ...

  6. Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  7. 15-爬虫之scrapy框架基于管道实现数据库备份02

    基于管道实现数据备份 将爬取到的数据分别存储到不同的载体 将数据一份存储到本地一份存储到mysql和redis 一个管道类对应一种形式的持久化存储操作,如果将数据存储到不同得载体中就需要使用多个管道类 ...

  8. python中scrapy的middleware是干嘛的_Python之爬虫(十九) Scrapy框架中Download Middleware用法...

    这篇文章中写了常用的下载中间件的用法和例子. Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所 ...

  9. yield的使用和在scrapy框架中的使用

    yield的基本使用 yield一般多用于生成器的创建,通过next()和send方法进行调用. def demo01():print('start! 第1次循环')for i in range(10 ...

最新文章

  1. python ftp文件夹文件递归上传推送
  2. 省市区三级联动 数据精确到乡镇一级
  3. 区块链共识算法Proof-of-Stake (PoS/权益证明) 常见问题解答 (1)
  4. union 和 struct 的区别与联系
  5. oracle查询并列,【问】oracle-查询各门课程的前2名和后2名
  6. .NET下实现分布式缓存系统Memcached
  7. Consumer配置
  8. C语言经典贪心算法之加油站问题(详解)
  9. AutoPager的简单实现
  10. Photoshop 2021 for mac(PS2021直装版)中英双语版
  11. kindle paperwhite3 拆机越狱
  12. vue+i18n 切换语言后无法刷新数据 的 解决方案
  13. cubic算法优化_CUBIC拥塞拥塞控制算法
  14. EJS + Express基本使用
  15. 安防4G摄像头视频流媒体服务器EasyNVR关于视频集成自我展示web端嵌入视频广场的流程
  16. Hadoop中怎么解决Starting secondary namenodes [0.0.0.0]
  17. 区块链NFT技术演变及技术开发指南
  18. Verilog训练笔记(1)——非重叠序列检测
  19. JavaWeb前后端代码一键生成
  20. 安徽科技学院 信网学院网络文化节 丁舒

热门文章

  1. 性能超越最新序列推荐模型,华为诺亚方舟提出记忆增强的图神经网络
  2. 林轩田机器学习基石课程学习笔记1 -- The Learning Problem
  3. 到「黄埔学院」去:打造AI首席架构师,第二期限量招募!
  4. 从代码设计到应用开发,入坑深度学习看这本书就够了
  5. 打破欧美垄断,国防科大斩获“航天界奥林匹克”大赛首冠
  6. Python之父重回决策层,未来如何发展?
  7. 2018最后一战:25天编程PK赛!
  8. 吴恩达最新成果 CheXNet详解:肺炎诊断准确率超专业医师
  9. 注意,免费的 CentOS 落幕,将于本月底终止维护!
  10. Spring Boot 实现万能文件在线预览