Python中关于scrapy运行机制的详细解析

在使用 scrapy 框架编写爬虫时, 可以同时编写多个爬虫,运行时只需要输入相对应的爬虫名即可运行该爬虫而不会影响到去他的爬虫,请问这是如何实现的,在哪里可以看相关文档呢


Python中关于scrapy运行机制的详细解析
9 回复

直接点就看源码,看不懂就用搜索引擎,有很多人写过相关文章


Scrapy的运行机制核心是它的异步事件驱动架构。简单来说,它基于Twisted框架,用非阻塞I/O来处理并发请求,效率很高。

整个流程可以概括为以下几个核心组件协同工作:

  1. 引擎 (Engine): 这是大脑,控制所有数据流,触发各种事件。
  2. 调度器 (Scheduler): 接收引擎发来的请求(Request),排队管理,决定下一个要执行的请求。
  3. 下载器 (Downloader): 执行实际的HTTP请求,获取网页数据,生成响应(Response)返回给引擎。
  4. 爬虫 (Spider): 你写的核心逻辑。它负责解析响应,提取数据(生成Item)和新的URL(生成新的Request)。
  5. 项目管道 (Item Pipeline): 处理爬虫提取到的Item,进行清洗、验证、去重、存储(如存入数据库)等操作。

一个请求的生命周期是这样的:

  • 你启动爬虫,Spider生成初始的RequestEngine
  • EngineRequest丢给Scheduler排队。
  • Scheduler把下一个要处理的Request送回Engine
  • Engine通过Downloader MiddlewaresRequest发给Downloader
  • Downloader下载页面,生成Response,通过Downloader Middlewares传回Engine
  • Engine收到Response,通过Spider Middlewares把它发给对应的Spider处理。
  • Spider解析Response,产生两种结果:Item 和/或 新的Request
    • 如果是Item,就发送给Item Pipeline处理。
    • 如果是新的Request,就跳回第二步,交给Scheduler
  • 这个过程循环,直到没有新的Request,爬虫结束。

关键特性

  • 异步: 可以同时发起和处理多个请求,不用等一个完了再下一个。
  • 中间件 (Middleware): 像插件,可以在请求和响应的流转过程中插入自定义逻辑(比如换User-Agent、处理异常)。
  • 去重: 默认根据请求指纹(URL+方法等)在调度器去重,避免重复抓取。

总结一下,Scrapy就是一个高度模块化、基于事件循环的异步爬虫流水线。

源码的话没有找到怎么去实现的,搜索的结果大多都是怎么使用 scrapy 去创建爬虫,并没有对框架的具体的解读,

twisted 实现的

您好 能具体说一下吗,或者说哪里有相关的文档或者参考资料呢,twisted 不是一个异步网络框架吗,不是为了提升爬取速度的吗,十分感谢

你为什么会觉得会影响到“去他的爬虫”?

其他的 sorry 手残打错了

读 scrapy.cfg 的 settings 可以找到 settings.py ,动态__import__给 load 起来,读里面的 SPIDER_MODULES 找到爬虫 spiders 包。

在这个包里每个.py 文件都是一个 module,可以动态__import__给 load 起来,找到 module 里继承了 scrapy.spiders.Spider 的 class,看一下这个 class 的__dict__[‘name’]叫什么,是不是你启动传的那个。

没啥东西,就是动态__import__ module 啊,目录遍历啊,__dict__动态访问对象属性啊。

十分感谢 我研究一下

回到顶部