scrapy 通过 redis 读取推送的 url,是否能被 crawler.engine.close_spider 发出的信号中断所有运行? - V2EX
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 2458 次点击
    这是一个创建于 2560 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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     Solana     3164 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 11:40 PVG 19:40 LAX 03:40 JFK 06:40
    Do hae faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86