python中scrapy的middleware是干嘛的_Python爬虫:Scrapy中间件Middleware和Pipeline

python中scrapy的middleware是干嘛的_Python爬虫:Scrapy中间件Middleware和Pipeline

Scrapy提供了可自定义2种中间件,1个数据处理器

名称

作用

用户设置

数据收集器(Item-Pipeline)

处理item

覆盖

下载中间件(Downloader-Middleware)

处理request/response

合并

爬虫中间件(Spider-Middleware)

处理item/response/request

合并

解释:

用户设置:是指custom_settings

可是它们继承的父类竟然是Object…,每次都要查文档。

正常来说应该提供一个抽象函数作为接口,给使用者实现自己的具体功能,不知道为啥这么设计

通过几段代码及注释,简要说明三个中间件的功能

1、Spider

baidu_spider.py

from scrapy import Spider, cmdline

class BaiduSpider(Spider):

name = “baidu_spider”

start_urls = [

“https://www.baidu.com/”

]

custom_settings = {

“SPIDER_DATA”: “this is spider data”,

“DOWNLOADER_MIDDLEWARES”: {

“scrapys.mymiddleware.MyMiddleware”: 100,

},

“ITEM_PIPELINES”: {

“scrapys.mypipeline.MyPipeline”: 100,

},

“SPIDER_MIDDLEWARES”:{

“scrapys.myspidermiddleware.MySpiderMiddleware”: 100,

}

}

def parse(self, response):

pass

if name == ‘main‘:

cmdline.execute(“scrapy crawl baidu_spider”.split())

2、Pipeline

mypipeline.py

class MyPipeline(object):

def init(self, spider_data):

self.spider_data = spider_data

@classmethod

def from_crawler(cls, crawler):

“””

获取spider的settings参数,返回Pipeline实例对象

“””

spider_data = crawler.settings.get(“SPIDER_DATA”)

print(“### pipeline get spider_data: {}”.format(spider_data))

return cls(spider_data)

def process_item(self, item, spider):

“””

return Item 继续处理

raise DropItem 丢弃

“””

print(“### call process_item”)

return item

def open_spider(self, spider):

“””

spider开启时调用

“””

print(“### spdier open {}”.format(spider.name))

def close_spider(self, spider):

“””

spider关闭时调用

“””

print(“### spdier close {}”.format(spider.name))

3、Downloader-Middleware

mymiddleware.py

class MyMiddleware(object):

def init(self, spider_data):

self.spider_data = spider_data

@classmethod

def from_crawler(cls, crawler):

“””

获取spider的settings参数,返回中间件实例对象

“””

spider_data = crawler.settings.get(“SPIDER_DATA”)

print(“### middleware get spider_data: {}”.format(spider_data))

return cls(spider_data)

def process_request(self, request, spider):

“””

return

None: 继续处理Request

Response: 返回Response

Request: 重新调度

raise IgnoreRequest: process_exception -> Request.errback

“””

print(“### call process_request”)

def process_response(self, request, response, spider):

“””

return

Response: 继续处理Response

Request: 重新调度

raise IgnoreRequest: Request.errback

“””

print(“### call process_response”)

return response

def process_exception(self, request, exception, spider):

“””

return

None: 继续处理异常

Response: 返回Response

Request: 重新调用

“””

pass

4、Spider-Middleware

myspidermiddleware.py

class MySpiderMiddleware(object):

def init(self, spider_data):

self.spider_data = spider_data

@classmethod

def from_crawler(cls, crawler):

“””

获取spider的settings参数,返回中间件实例对象

“””

spider_data = crawler.settings.get(“SPIDER_DATA”)

print(“### spider middleware get spider_data: {}”.format(spider_data))

return cls(spider_data)

def process_spider_input(self, response, spider):

“””

url下载完成后执行,交给parse处理response (parse之前执行)

return None 继续处理response

raise Exception

“””

print(“### call process_spider_input”)

def process_spider_output(self, response, result, spider):

“””

response返回result时调用(result必须返回包含item 或者是 Request的可迭代对象)—–》yield item、yield Request(url)

return

iterable of Request、dict or Item

“””

print(“### call process_spider_output”)

for i in result:

yield i

def process_spider_exception(self, response, exception, spider):

“””

return

None

iterable of Response, dict, or Item

“””

passdef process_start_requests(self,start_requests,spider):”””#爬虫刚开始调用的时候执行 (start_request 之前执行)return: 包含Request对象的可迭代对象”””return start_requests

运行爬虫后,查看日志

middleware get spider_data: this is spider data

spider middleware get spider_data: this is spider data

pipeline get spider_data: this is spider data

spdier open baidu_spider

call process_request

call process_response

call process_spider_input

call process_spider_output

spdier close baidu_spider中间件启动顺序

download middleware

spider middleware

pipeline

处理函数调用顺序

spdier open

process_request

process_response

process_spider_input

process_spider_output

spdier close

Original: https://blog.csdn.net/weixin_36383052/article/details/114410255
Author: Kalimnos
Title: python中scrapy的middleware是干嘛的_Python爬虫:Scrapy中间件Middleware和Pipeline

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/792035/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python爬虫—Scrapy框架—Win10下载安装

    Python爬虫—Scrapy框架—Win10下载安装 1. 下载wheel 2.下载twisted 3. 下载pywin32 4. 下载安装Scrapy 5. 创建一个scrap…

    Python 2023年10月2日
    038
  • Mysql 实现 向上递归查找父节点并返回树结构

    需求:通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构。 如果只有叶子,剔除…

    Python 2023年10月22日
    034
  • Linux系统安装并配置nginx实现多服务同一端口

    基本诉求是项目要实现并发,因为用了深度学习框架,tornado服务无法通过以下方式多进程开启服务, python;gutter:true; http_server.bind(por…

    Python 2023年10月26日
    076
  • Python操作文件,os模块和shutil模块的使用

    1,文件的迁移 2,清空文件夹 3,遍历文件夹里面的文件和目录 4,常用命令 简介:os库是Python的标准库,包含几百个函数,主要是和操作系统相关的,包含对目录和文件的常用操作…

    Python 2023年8月24日
    057
  • Flask博客实战 – 实现登录注册功能

    上一章节我们已经创建了一个用户应用,并创建了用户模型,那么我们这节就开始实现一个简单的用户登录注册功能! 登录注册功能Flask有一个非常优秀的扩展Flask-login,我们可以…

    Python 2023年8月15日
    055
  • DHorse的链路追踪

    目前,DHorse的链路追踪功能是通过SkyWalking来实现。实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息。下面就来具体…

    Python 2023年10月13日
    036
  • Flask-SQLAlchemy多对多关系超详解

    这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一…

    Python 2023年8月10日
    047
  • concat, join, 和merge的区别在Python中

    concat: Pandas函数 可以垂直和水平地连接两个或多个pandas对象 只用索引对齐 索引出现重复值时会报错 默认是外连接(也可以设为内连接) join: DataFra…

    Python 2023年8月21日
    059
  • 5个节约生命的python小技巧

    Python是一种强大且易上手的语言,语法简洁优雅,不像Java那么繁琐废话,并且有一些特殊的函数或语法可以让代码变得更加简短精悍。 本文给大家介绍常用的5个python小技巧: …

    Python 2023年11月2日
    044
  • 如何高效Debug(又名如何高效解决问题)

    如何高效Debug(又名如何高效解决问题) 如何高效Debug(又名如何高效解决问题) 简介 阅读本文章须知 导读 接手别人的代码如何修改错误 快速反应⏩ 1. 确定目标⛳ 2. …

    Python 2023年6月12日
    099
  • NumPy字符串处理函数

    NumPy 提供了许多字符串处理函数,它们被定义在用于处理字符串数组的 numpy.char 这个类中,这些函数的操作对象是 string_ 或者 unicode_ 字符串数组。如…

    Python 2023年8月28日
    034
  • 手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码

    今天和大家一起分享如何使用LabVIEW调用pb模型实现物体识别,本博客中使用的智能工具包可到主页置顶博客 1、物体识别的概念 物体识别也称 目标检测,目标检测所要解决的问题是目标…

    Python 2023年10月19日
    073
  • 解决 nvcc: command not found

    1.nvcc nvcc 是The main wrapper for the NVIDIA CUDA Compiler suite. Used to compile and link…

    Python 2023年8月2日
    044
  • python3 中pylab里的Matelotlib绘图从安装到运用(1)

    python中除了turtle绘图工具还有提供了工具绘制三维和三维数据。其中最有用的工具之一是pylab模块,其中包括绘图软件包matelotlib. matepolotlib是一…

    Python 2023年9月4日
    063
  • 12月编程语言排行榜公布啦~

    2022年迎来了最后一个月,我们可以看到,在这一年中编程语言起起伏伏,有的语言始终炙手可热,而有的语言却逐渐”没落”…… 日前, 全…

    Python 2023年8月12日
    033
  • YOLO系列(YOLOv1-YOLOv5)算法详细介绍和总结

    YOLO系列(YOLOv1-YOLOv5)算法详细介绍和总结 文章目录 YOLO系列(YOLOv1-YOLOv5)算法详细介绍和总结 前言 YOLOv1 * YOLOv1思想 YO…

    Python 2023年10月27日
    035
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球