这不再适用了,scrapy的API已经改变了.
现在文档的功能是" 从脚本运行Scrapy "但我得到ReactorNotRestartable
错误.
我的任务:
from celery import Task from twisted.internet import reactor from scrapy.crawler import Crawler from scrapy import log, signals from scrapy.utils.project import get_project_settings from .spiders import MySpider class MyTask(Task): def run(self, *args, **kwargs): spider = MySpider 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()
Bj Blazkowic.. 36
扭曲的反应堆无法重新启动.解决此问题的方法是让celery任务为您要执行的每个爬网创建一个新的子进程,如以下帖子中所建议的:
在Celery任务中运行Scrapy蜘蛛
通过利用多处理包,这解决了"反应堆无法重启的问题".但问题是现在使用最新的celery版本已经过时了解决方法,因为您将遇到另一个问题,即守护进程无法生成子进程.因此,为了使解决方法工作,您需要了解芹菜版本.
是的,scrapy API已经改变了.但稍作修改(导入Crawler而不是CrawlerProcess).您可以通过芹菜版本来获得解决方法.
芹菜问题可以在这里找到: 芹菜问题#1709
这是我更新的爬行脚本,它使用台球而不是多处理来处理新的芹菜版本:
from scrapy.crawler import Crawler
from scrapy.conf import settings
from myspider import MySpider
from scrapy import log, project
from twisted.internet import reactor
from billiard import Process
from scrapy.utils.project import get_project_settings
class UrlCrawlerScript(Process):
def __init__(self, spider):
Process.__init__(self)
settings = get_project_settings()
self.crawler = Crawler(settings)
self.crawler.configure()
self.crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
self.spider = spider
def run(self):
self.crawler.crawl(self.spider)
self.crawler.start()
reactor.run()
def run_spider(url):
spider = MySpider(url)
crawler = UrlCrawlerScript(spider)
crawler.start()
crawler.join()
编辑:通过阅读芹菜问题#1709,他们建议使用台球而不是多处理,以便解除子过程限制.换句话说,我们应该尝试台球,看它是否有效!
编辑2:是的,通过使用台球,我的脚本与最新的芹菜构建一起使用!查看我更新的脚本.
注意 - 我必须在初始化检查之外移动`self.crawler.signals.connect(reactor.stop,signal = signals.spider_closed)`行,否则第二次运行会挂起.移动它使它在我的项目中正常工作.此外,当'scrapy.project`被折旧时,使用billiard的`current_thread`来基于每个线程设置初始化标志.这也很有效. (2认同)
Blender.. 11
Twisted反应器无法重新启动,因此一旦一个蜘蛛完成运行并crawler
隐式停止反应堆,该工作人员就没用了.
正如在其他问题的答案中所公布的那样,您需要做的就是杀死运行蜘蛛的工人并用新的蜘蛛替换它,这样可以防止反应堆启动和停止多次.要做到这一点,只需设置:
CELERYD_MAX_TASKS_PER_CHILD = 1
缺点是你并没有真正使用 Twisted反应器充分发挥潜力并浪费资源运行多个反应堆,因为一个反应堆可以在一个过程中同时运行多个蜘蛛.更好的方法是每个工人(甚至全球一个反应堆)运行一个反应堆,不要crawler
碰它.
我正在为一个非常类似的项目工作,所以如果我取得任何进展,我会更新这篇文章.