Python 当我遇到网站阻塞时,如何暂停刮痧?

Python 当我遇到网站阻塞时,如何暂停刮痧?,python,scrapy,twisted,Python,Scrapy,Twisted,我使用scrapy在“豆瓣网”中抓取用户页面。 我的数据库中有2W用户,我需要抓取所有这些独立用户的页面 但问题是,有时网站会阻止我的爬虫,如果我立即注意到,我可以通过Ctrl+C手动关闭蜘蛛,重新启动蜘蛛并继续运行。 在模拟这种行为的过程中,我遇到了很多问题,我有两个想法,如下所示: 把蜘蛛停在刮痧里面 检测403页,因为它是被阻止的标志。 在解析函数中添加以下代码: 这不起作用,因为睡眠不会导致连接关闭,无论睡眠多长时间,都不会像手动重新启动爬行器一样 拆分开始URL并逐个启动爬行器 因为一

我使用scrapy在“豆瓣网”中抓取用户页面。 我的数据库中有2W用户,我需要抓取所有这些独立用户的页面

但问题是,有时网站会阻止我的爬虫,如果我立即注意到,我可以通过Ctrl+C手动关闭蜘蛛,重新启动蜘蛛并继续运行。 在模拟这种行为的过程中,我遇到了很多问题,我有两个想法,如下所示:

  • 把蜘蛛停在刮痧里面 检测403页,因为它是被阻止的标志。 在解析函数中添加以下代码:
  • 这不起作用,因为睡眠不会导致连接关闭,无论睡眠多长时间,都不会像手动重新启动爬行器一样

  • 拆分开始URL并逐个启动爬行器 因为一个start\u url代表一个用户,所以我将这个start\u url列表拆分并放在不同的spider中。 然后我通过脚本()启动spider 然后我发现扭曲的反应堆不能重新启动
    因此,我不知道如何完全暂停scrapy并自动重新启动它。

    您可以使用scarpy请求的errback,如下所示

        return Request(url, callback=parse, errback=error_handler)
    
        def error_handler(self, failure):
            time.sleep(time_to_sleep) //time in seconds
            //after time expires, send next request
    
    然后像这样定义错误处理程序

        return Request(url, callback=parse, errback=error_handler)
    
        def error_handler(self, failure):
            time.sleep(time_to_sleep) //time in seconds
            //after time expires, send next request
    

    它将处理除200以外的所有响应状态。

    也许这将帮助您@CristianOlaru在第2种方法中,我确实提出了CloseSpider执行选项,但spider也无法重新启动。不,这不起作用,首先,twisted不会断开与网站的连接,其次,这将导致异常。什么样的异常?反应堆的一些异常。然后我将其替换为:reactor.callLater(0,lambda:time.sleep(60)),仍然不工作,因为它只是睡眠,而不是断开连接。您是否尝试在睡眠后创建新会话?什么是新会话?