scrapy 通过 redis 读取推送的 url,是否能被 crawler.engine.close_spider 发出的信号中断所有运行?

2018-12-04 20:57:48 +08:00
 akmonde

RT,不知道我讲明白没,采用 redis 队列,依次读取未来会推送的 url。

但我在扫描某个 url,会触发某种条件,调用以下的代码:

self.crawler.engine.close_spider

在不启用 redis 推送,直接调用的时候,经测试,这个可以结束掉 spider。

但是在我启用了 redis 推送后,一旦触发调用该代码,是否整个 spider 直接结束,其他已经在跑的 url 和新推送的 url,都会不再爬取?

非常期待有经验的大佬给个提示,我这边只想特定条件结束掉单个 url,不影响其他 url 的爬取。

1940 次点击
所在节点    Python
8 条回复
utoyuri
2018-12-04 21:53:31 +08:00
试过 scrapy_redis,调用 close_spider 时程序没有结束,至于后面的 url 有没有继续这个没有尝试。 如果只想过滤掉某个 url 的话,用 download middleware。
menyakun
2018-12-04 23:47:17 +08:00
redis 队列是指自定义了一个 scheduler,然后使用了自定义的队列?如果是这样的话,close_spider 的调用会触发队列的持久化,是不是这里 block 住了
rocketman13
2018-12-05 10:30:49 +08:00
在跑的肯定会跑完
akmonde
2018-12-05 14:44:34 +08:00
@utoyuri 在 middleware 处尝试过滤 url,触发条件 raise IgnoreRequest,结果还是继续跑停不下来...
@menyakun 没有自定义 scheduler,只是在取 url 时实现 redis 推送。准确来说,我这边需要的是,触发条件对 url [或者某域名] 的请求进行过滤清除。
@rocketman13 我昨儿后来试了下 scrapy-redis,直接中止不再读取 redis 了,监听停止,没有继续跑呢。
utoyuri
2018-12-05 17:34:14 +08:00
@akmonde 遇到特定的 url 就直接终止整个程序? exit 0 ?
akmonde
2018-12-06 12:12:44 +08:00
@utoyuri 非也,是爬某个 url 时,达到某个条件,停止爬行该 url,其他的继续。
我试了下,如果是 scrapy-redis 推送的话,可能会同时爬多个网站,调用 close_spider 会直接终止整个程序,无法达到我的目的。
utoyuri
2018-12-06 12:40:28 +08:00
@akmonde download middleware 可以实现你的目的,看文档或者找 demo 吧
akmonde
2018-12-06 15:40:24 +08:00
@utoyuri 试过在 middleware 里面的 process_request,尝试开头 raise IgnoreRequest,然后没写 return,按理说不会继续运行下去 [我不知道其他阻断方法] ?另外,后面还有其他法子判断 return 的。
不过似乎是没起效果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/514337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX