V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
akmonde
V2EX  ›  Python

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

  •  
  •   akmonde · 2018-12-04 20:57:48 +08:00 · 1906 次点击
    这是一个创建于 1941 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    self.crawler.engine.close_spider
    

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

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

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

    8 条回复    2018-12-06 15:40:24 +08:00
    utoyuri
        1
    utoyuri  
       2018-12-04 21:53:31 +08:00
    试过 scrapy_redis,调用 close_spider 时程序没有结束,至于后面的 url 有没有继续这个没有尝试。 如果只想过滤掉某个 url 的话,用 download middleware。
    menyakun
        2
    menyakun  
       2018-12-04 23:47:17 +08:00
    redis 队列是指自定义了一个 scheduler,然后使用了自定义的队列?如果是这样的话,close_spider 的调用会触发队列的持久化,是不是这里 block 住了
    rocketman13
        3
    rocketman13  
       2018-12-05 10:30:49 +08:00
    在跑的肯定会跑完
    akmonde
        4
    akmonde  
    OP
       2018-12-05 14:44:34 +08:00
    @utoyuri 在 middleware 处尝试过滤 url,触发条件 raise IgnoreRequest,结果还是继续跑停不下来...
    @menyakun 没有自定义 scheduler,只是在取 url 时实现 redis 推送。准确来说,我这边需要的是,触发条件对 url [或者某域名] 的请求进行过滤清除。
    @rocketman13 我昨儿后来试了下 scrapy-redis,直接中止不再读取 redis 了,监听停止,没有继续跑呢。
    utoyuri
        5
    utoyuri  
       2018-12-05 17:34:14 +08:00
    @akmonde 遇到特定的 url 就直接终止整个程序? exit 0 ?
    akmonde
        6
    akmonde  
    OP
       2018-12-06 12:12:44 +08:00
    @utoyuri 非也,是爬某个 url 时,达到某个条件,停止爬行该 url,其他的继续。
    我试了下,如果是 scrapy-redis 推送的话,可能会同时爬多个网站,调用 close_spider 会直接终止整个程序,无法达到我的目的。
    utoyuri
        7
    utoyuri  
       2018-12-06 12:40:28 +08:00
    @akmonde download middleware 可以实现你的目的,看文档或者找 demo 吧
    akmonde
        8
    akmonde  
    OP
       2018-12-06 15:40:24 +08:00
    @utoyuri 试过在 middleware 里面的 process_request,尝试开头 raise IgnoreRequest,然后没写 return,按理说不会继续运行下去 [我不知道其他阻断方法] ?另外,后面还有其他法子判断 return 的。
    不过似乎是没起效果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1026 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:30 · PVG 06:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.