Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 刮痕卡盘:完成后重新启动卡盘_Python_Python 2.7_Web Scraping_Scrapy - Fatal编程技术网

Python 刮痕卡盘:完成后重新启动卡盘

Python 刮痕卡盘:完成后重新启动卡盘,python,python-2.7,web-scraping,scrapy,Python,Python 2.7,Web Scraping,Scrapy,如果关闭的原因是因为我的网络连接(在夜间,网络中断了5分钟),我正试图让我的Scrapy spider再次启动。当网络瘫痪时,蜘蛛会在5次尝试后关闭 我试图在爬行器定义中使用此函数,试图在关闭时重新启动爬行器: def handle_spider_closed(spider, reason): relaunch = False for key in spider.crawler.stats._stats.keys(): if 'DNSLookupError' in

如果关闭的原因是因为我的网络连接(在夜间,网络中断了5分钟),我正试图让我的Scrapy spider再次启动。当网络瘫痪时,蜘蛛会在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)
我尝试了很多事情,比如重新实例化一个spider,但是得到了错误反应器已经在运行或者类似的东西

我考虑过从脚本中执行spider,当spider完成后再次调用它,但两者都不起作用,因为reactor仍在使用中

  • 我的意图是在爬行器关闭后重置它(爬行器关闭是因为它失去了internet连接)

有人知道一个简单的好方法吗?

我找到了解决问题的方法!我想做什么

  • 在卡盘出现故障或关闭时处理卡盘
  • 关闭时尝试重新执行蜘蛛
我通过如下方式处理爬行器的错误进行管理:

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\u filter=True
    使爬行器仅在出错时才允许复制请求
  • errback=self.handle\u error
    使爬行器通过自定义
    handle\u error
    函数

要调查的一个场景是使用scrapy jobs()处理不同spider实例之间的持久性,并使用shell脚本检查scrapy进程是否处于活动状态,例如每10分钟检查一次。如果不重新启动它,只是在黑暗中拍摄:如果在重新启动蜘蛛后使用
spider.crawler.crawler(spider)
,该怎么办?谢谢。我已经阅读了这些文档,但我不明白当蜘蛛启动时如何自动重启closes@alecxe我已经试过了,但它说因为反应堆的原因不能运行