Scrapy爬虫:完成后重新启动爬虫

6

如果我的互联网连接关闭(晚上会断开5分钟),我希望我的Scrapy爬虫能够再次启动。当互联网断开时,爬虫经过5次尝试后关闭。

我正在尝试在我的爬虫定义中使用此函数来在关闭时重新启动爬虫:

def handle_spider_closed(spider, reason):
    relaunch = False
    for key in spider.crawler.stats._stats.keys():
        if 'DNSLookupError' in key:
            relaunch = True
            break

    if relaunch:
        spider = mySpider()
        settings = get_project_settings()
        crawlerProcess = CrawlerProcess(settings)
        crawlerProcess.configure()
        crawlerProcess.crawl(spider)
        spider.crawler.queue.append_spider(another_spider)

我尝试了很多方法,例如重新实例化一个爬虫,但是出现了错误信息“ Reactor is already running ”或类似的信息。
我考虑从脚本中执行爬虫,并在爬虫完成后再次调用它,但也没有成功,因为反应器仍然在使用中。
我的意图是在爬虫关闭后重置它(因为爬虫失去了互联网连接)。
有没有人知道一个好的、简单的方法来解决这个问题?

一个值得研究的场景是使用Scrapy作业(http://doc.scrapy.org/en/latest/topics/jobs.html)来处理不同蜘蛛实例之间的持久性,并使用shell脚本每10分钟检查一次Scrapy进程是否处于活动状态。如果没有,就重新启动它。 - aberna
这只是一个猜测:如果重新实例化一个爬虫后使用spider.crawler.crawl(spider)会怎样呢?谢谢。 - alecxe
我已经阅读了文档,但我不明白如何在爬虫关闭时自动重启它。 - AlvaroAV
@alecxe 我尝试过了,但它说由于反应堆的原因无法运行。 - AlvaroAV
1个回答

7
我找到了解决我的问题的方法!我在尝试做什么?
  • 处理蜘蛛失败或关闭时的情况
  • 尝试在关闭时重新执行蜘蛛
我通过以下方式处理蜘蛛的错误来解决该问题:
import time

class mySpider(scrapy.Spider):
    name = "myspider"
    allowed_domains = ["google.com"]
    start_urls = [
        "http://www.google.com",
    ]

    def handle_error(self, failure):
        self.log("Error Handle: %s" % failure.request)
        self.log("Sleeping 60 seconds")
        time.sleep(60)
        url = 'http://www.google.com'
        yield scrapy.Request(url, self.parse, errback=self.handle_error, dont_filter=True)

    def start_requests(self):
        url = 'http://www.google.com'
        yield scrapy.Request(url, self.parse, errback=self.handle_error)
  • 我使用了dont_filter=True,允许 Spider 在经历错误时重复请求。
  • errback=self.handle_error 让 Spider 经过自定义的 handle_error 函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接