在芹菜任务中运行Scrapy蜘蛛

 据估计妇女嘎 发布于 2023-01-20 16:00

这不再适用了,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碰它.

我正在为一个非常类似的项目工作,所以如果我取得任何进展,我会更新这篇文章.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有