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

Pra*_*ain 15 python multithreading scrapy twisted.internet scrapy-spider

我必须从另一个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()
Run Code Online (Sandbox Code Playgroud)

在运行它时,我得到错误

exceptions.ValueError: signal only works in main thread
Run Code Online (Sandbox Code Playgroud)

我能找到的唯一解决方法就是使用

reactor.run(installSignalHandlers=False)
Run Code Online (Sandbox Code Playgroud)

我不想使用,因为我想多次调用此方法,并希望在下一次调用之前停止reactor.我可以做些什么来完成这项工作(可能会强制爬虫在相同的'主'线程中启动)?

Alv*_*oAV 6

我要对你说的第一件事是当你从外部文件执行Scrapy时,loglevel被设置为INFO,如果代码不起作用,你应该将它改为DEBUG以查看发生了什么

你应该改变这条线:

 log.start()
Run Code Online (Sandbox Code Playgroud)

对于:

log.start(loglevel=log.DEBUG)
Run Code Online (Sandbox Code Playgroud)

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

log.start(logfile="file.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False)
Run Code Online (Sandbox Code Playgroud)

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

如果你改变了这条线:

crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
Run Code Online (Sandbox Code Playgroud)

对于:

dispatcher.connect(reactor.stop, signals.spider_closed)
Run Code Online (Sandbox Code Playgroud)

它说什么 ?

根据您的Scrapy版本,可能会弃用它