Python中scrapy通过redis读取推送的url,是否能被crawler.engine.close_spider发出的信号中断所有运行?
RT,不知道我讲明白没,采用 redis 队列,依次读取未来会推送的 url。
但我在扫描某个 url,会触发某种条件,调用以下的代码:
self.crawler.engine.close_spider
在不启用 redis 推送,直接调用的时候,经测试,这个可以结束掉 spider。
但是在我启用了 redis 推送后,一旦触发调用该代码,是否整个 spider 直接结束,其他已经在跑的 url 和新推送的 url,都会不再爬取?
非常期待有经验的大佬给个提示,我这边只想特定条件结束掉单个 url,不影响其他 url 的爬取。
Python中scrapy通过redis读取推送的url,是否能被crawler.engine.close_spider发出的信号中断所有运行?
试过 scrapy_redis,调用 close_spider 时程序没有结束,至于后面的 url 有没有继续这个没有尝试。 如果只想过滤掉某个 url 的话,用 download middleware。
我理解你的问题。在Scrapy中,当crawler.engine.close_spider被调用时,它会发出一个关闭信号,这个信号会中断整个爬虫的运行,包括从Redis读取URL的流程。
简单来说:是的,这个信号会中断所有运行。
当close_spider被调用时,Scrapy引擎会:
- 停止调度器(包括Redis调度器)
- 停止下载器
- 等待当前正在处理的请求完成
- 然后完全关闭爬虫
这意味着即使Redis中还有待处理的URL,爬虫也不会再去读取它们。这是Scrapy的正常关闭流程。
如果你想让爬虫在处理完Redis中所有URL后才关闭,你需要确保在调用close_spider之前,Redis队列已经是空的,或者使用其他机制来控制爬虫的结束。
总结:close_spider信号会中断所有运行,包括Redis URL读取。
redis 队列是指自定义了一个 scheduler,然后使用了自定义的队列?如果是这样的话,close_spider 的调用会触发队列的持久化,是不是这里 block 住了
在跑的肯定会跑完
在 middleware 处尝试过滤 url,触发条件 raise IgnoreRequest,结果还是继续跑停不下来…
没有自定义 scheduler,只是在取 url 时实现 redis 推送。准确来说,我这边需要的是,触发条件对 url [或者某域名] 的请求进行过滤清除。
我昨儿后来试了下 scrapy-redis,直接中止不再读取 redis 了,监听停止,没有继续跑呢。
遇到特定的 url 就直接终止整个程序? exit 0 ?
非也,是爬某个 url 时,达到某个条件,停止爬行该 url,其他的继续。
我试了下,如果是 scrapy-redis 推送的话,可能会同时爬多个网站,调用 close_spider 会直接终止整个程序,无法达到我的目的。
download middleware 可以实现你的目的,看文档或者找 demo 吧
试过在 middleware 里面的 process_request,尝试开头 raise IgnoreRequest,然后没写 return,按理说不会继续运行下去 [我不知道其他阻断方法] ?另外,后面还有其他法子判断 return 的。
不过似乎是没起效果。

