当我遇到网站拦截时,如何暂停Scrapy?

时间:2015-02-13 03:22:03

标签: python scrapy twisted

我使用scrapy抓取douban.com'中的用户页面。 我的数据库中有2W用户,我需要抓取所有这些独立用户'页面。

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

  1. 将蜘蛛暂停在scrapy中 检测403页面,因为它是被阻止的标志。 在解析函数中添加这些代码:
  2. if response.status == 403:
        reactor.callLater(0, lambda: time.sleep(60))
    

    这不起作用,因为睡眠不会导致连接关闭,无论它睡多久,它都不会像手动重启蜘蛛一样。

    1. 拆分start_urls并逐个启动蜘蛛 由于一个start_url代表一个用户,我将这个start_urls列表拆分并放入不同的蜘蛛中。 然后我通过脚本启动蜘蛛(http://doc.scrapy.org/en/0.24/topics/practices.html#run-from-script) 然后我发现扭曲的反应堆不能重启!
    2. 所以我不知道如何完全暂停scrapy并自动重启。

1 个答案:

答案 0 :(得分:0)

您可以使用 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

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