从另一个文件调用Scrapy而不进行线程处理

qkf9rpyu  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(138)

我必须从另一个python文件中调用crawler,为此我使用了以下代码。

def crawl_koovs():
    spider = SomeSpider()
    settings = get_project_settings()
    crawler = Crawler(settings)
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
    crawler.configure()
    crawler.crawl(spider)
    crawler.start()
    log.start()
    reactor.run()

在运行此程序时,我得到如下错误:

exceptions.ValueError: signal only works in main thread

我能找到的唯一解决办法就是

reactor.run(installSignalHandlers=False)

我不想使用这个方法,因为我想多次调用这个方法,并希望在下一次调用之前停止reactor。我可以做些什么来使它工作(也许强制爬行器在同一个“主”线程中启动)?

kzmpq1sx

kzmpq1sx1#

首先我要说的是,当您从外部文件执行Scrapy时,loglevel设置为INFO,您应该将其更改为DEBUG,以查看如果代码不工作会发生什么情况
您应该更改以下行:

log.start()

用于:

log.start(loglevel=log.DEBUG)

要将所有内容存储在日志中并生成一个文本文件(用于调试),您可以执行以下操作:

log.start(logfile="file.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False)

关于日志级别更改为DEBUG的信号问题,也许您可以看到一些输出,可以帮助您修复它,您可以尝试将脚本放入Scrapy Project文件夹,看看是否仍然崩溃。
如果更改行:

crawler.signals.connect(reactor.stop, signal=signals.spider_closed)

用于:

dispatcher.connect(reactor.stop, signals.spider_closed)

上面写了什么?
根据您的Scrapy版本,它可能会被弃用

6tr1vspr

6tr1vspr2#

对于循环和使用带计时器触发器的un azure函数,请使用此taks

from twisted.internet import task from twisted.internet import reactor

loopTimes = 3 failInTheEnd = False
_loopCounter = 0

def runEverySecond():
    """
    Called at ever loop interval.
    """
    global _loopCounter

    if _loopCounter < loopTimes:
        _loopCounter += 1
        print('A new second has passed.')
        return

    if failInTheEnd:
        raise Exception('Failure during loop execution.')

    # We looped enough times.
    loop.stop()
    return

def cbLoopDone(result):
    """
    Called when loop was stopped with success.
    """
    print("Loop done.")
    reactor.stop()

def ebLoopFailed(failure):
    """
    Called when loop execution failed.
    """
    print(failure.getBriefTraceback())
    reactor.stop()

loop = task.LoopingCall(runEverySecond)

# Start looping every 1 second. loopDeferred = loop.start(1.0)

# Add callbacks for stop and failure. loopDeferred.addCallback(cbLoopDone) loopDeferred.addErrback(ebLoopFailed)

reactor.run()

如果我们想让一个任务每X秒重复运行一次,我们可以使用twisted.internet.task.LoopingCall:从https://docs.twisted.org/en/stable/core/howto/time.html开始

相关问题