14

我必须从另一个 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)

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

4

1 回答 1

6

我要对您说的第一件事是,当您从外部文件执行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 版本,它可能已被弃用

于 2015-05-17T17:54:57.270 回答