繁体   English   中英

如何在 Scrapy 中暂停蜘蛛

[英]How to pause spider in Scrapy

我是 scrapy 的新手,我需要在收到响应错误(如 407、429)后暂停蜘蛛。
另外,我应该在不使用time.sleep()的情况下执行此操作,并使用中间件或扩展。

这是我的中间件:

from scrapy import signals
from pydispatch import dispatcher

class Handle429:
    def __init__(self):
        dispatcher.connect(self.item_scraped, signal=signals.item_scraped)

    def item_scraped(self, item, spider, response):
        if response.status == 429:
            print("THIS IS 429 RESPONSE")
            #
            # here stop spider for 10 minutes and then continue
            #

我读到了self.crawler.engine.pause()但如何在我的中间件中实现它,并设置自定义的暂停时间?
还是有其他方法可以做到这一点? 谢谢。

我已经解决了我的问题。 首先,中间件可以有默认的 foo 像process_responseprocess_request

settings.py

HTTPERROR_ALLOWED_CODES = [404]

然后,我更改了我的中间件 class:

from twisted.internet import reactor
from twisted.internet.defer import Deferred

#replace class Handle429
class HandleErrorResponse:

    def __init__(self):
        self.time_pause = 1800

    def process_response(self, request, response, spider):
        # this foo called by default before the spider 
        pass

然后我找到了一个代码可以帮助我在没有time.sleep()的情况下暂停蜘蛛

#in HandleErrorResponse
def process_response(self, request, response, spider):
    print(response.status)
    if response.status == 404:
        d = Deferred()
        reactor.callLater(self.time_pause, d.callback, response)

    return response

这是工作。
我无法完全解释reactor.callLater()的工作原理,但我认为它只是停止了 scrapy 中的事件循环,然后您的响应将发送给蜘蛛。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM