首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在scrapy中使用中间件的self.crawler.engine.pause()

如何在scrapy中使用中间件的self.crawler.engine.pause()
EN

Stack Overflow用户
提问于 2014-01-14 20:21:26
回答 2查看 1.4K关注 0票数 1

我正在尝试从中间件中暂停运行抓取引擎(运行爬虫)。

当我试图调用self.crawler.engine.unpause()时,我会收到以下错误:

'cRetry‘对象没有属性’爬虫‘

这是我的中间件。如何访问爬虫对象?

代码语言:javascript
运行
复制
class cRetry(RetryMiddleware):

   errorCounter = 0


   def process_response(self, request, response, spider):
        if response.status in self.retry_http_codes:
            reason = response_status_message(response.status)
            return self._retry(request, reason, spider) or response
        elif "error" in response.body:
            self.errorCounter = self.errorCounter + 1
            if self.errorCounter >= 10:
                self.crawler.engine.pause()
                os.system("restart.sh")
                print "Reset"
                time.sleep(10)
                self.crawler.engine.unpause()
                self.errorCounter = 0
            reason ="Restart Required"
            return self._retry(request, reason, spider) or response
       ### end
        return response 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-14 20:31:50

根据我的理解,您可以重写__init__from_crawler方法,使其类似于以下内容:

代码语言:javascript
运行
复制
class cRetry(RetryMiddleware):

    errorCounter = 0

    def __init__(self, crawler):
        super(cRetry, self).__init__(crawler.settings)
        self.crawler = crawler

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_response(self, request, response, spider):
        # ...

__init__的签名实际上似乎并不重要,主库的入口点总是from_crawler(cls, crawler)。这是一个类方法,并将类名作为第一个参数(然后使用它来调用构造函数)。

票数 1
EN

Stack Overflow用户

发布于 2014-01-15 14:05:59

谢谢你:-)

你的建议适用于一个小的修改小说。@classmethod需要添加,然后它就像一个魅力一样工作。

代码语言:javascript
运行
复制
class cRetry(RetryMiddleware):

    errorCounter = 0

    def __init__(self, crawler):
        super(cRetry, self).__init__(crawler.settings)
        self.crawler = crawler

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_response(self, request, response, spider):
        # ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21123198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档