我必须从另一个 python 文件调用爬虫,为此我使用了以下代码。
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)
我不想使用它,因为我想多次调用此方法并希望在下一次调用之前停止 react 器。我该怎么做才能使这项工作(可能强制爬虫在同一个“主”线程中启动)?
最佳答案
我要对你说的第一件事是,当你从外部文件执行 Scrapy 时,日志级别设置为 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 版本,它可能会被弃用
关于python - 在没有线程的情况下从另一个文件调用 Scrapy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30210493/