【问题标题】:Celery not returning any results after success?成功后芹菜不返回任何结果?
【发布时间】:2020-06-10 14:12:18
【问题描述】:

在这里,我正在抓取一些具有不同关键字的网站。之前它只是刮擦并且有效,但我为此实施了芹菜。使用 celery 后,我无法获得抓取结果,但没有显示错误。我在这里使用rabbitmq 作为消息代理。

tasks.py

@shared_task()
def schedule_task(pk):
    task = Task.objects.get(pk=pk)
    keywords = ''
    # for keys in ast.literal_eval(obj.keywords.all()): #keywords change to csv
    for keys in task.keywords.all():
        if keywords:
            keywords += ', ' + keys.title
        else:
            keywords += keys.title

    task_ids = []  # one Task/Project contains one or multiple scrapy task

    settings = {
        'spider_count': len(task.targets.all()),
        'keywords': keywords,
        'unique_id': str(uuid4()),  # unique ID for each record for DB
        'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
    }

    # res = ast.literal_eval(ini_list)

    for site_url in task.targets.all():
        domain = urlparse(site_url.address).netloc  # parse the url and extract the domain
        spider_name = domain.replace('.com', '')
        task = scrapyd.schedule('default', spider_name, settings=settings, url=site_url.address, domain=domain,
                                keywords=keywords)

观看次数

  def post(self, request, *args, **kwargs):

        form = CreateTaskForm(request.POST)
        if form.is_valid():

            unique_id = str(uuid4())  # create a unique ID.
            obj = form.save(commit=False)

            obj.created_by = request.user
            obj.unique_id = unique_id
            obj.status = 0
            obj.save()
            form.save_m2m()
            print(obj.pk)
            schedule_task.delay(pk=obj.pk)
            return redirect('crawler:task-list')

使用 celery 之前的视图(返回 scraped 结果工作正常)我只是将抓取部分拆分为 tasks.py 并使用 .delay 从视图中调用它,但没有返回结果(在它返回之前)。

form = CreateTaskForm(request.POST)
        if form.is_valid():
            
            unique_id = str(uuid4()) # create a unique ID. 
            obj = form.save(commit=False)
            
            obj.created_by = request.user
            obj.unique_id = unique_id
            obj.status = 0
            obj.save()
            form.save_m2m()

            keywords = ''
            # for keys in ast.literal_eval(obj.keywords.all()): #keywords change to csv
            for keys in obj.keywords.all():
                if keywords:
                    keywords += ', ' + keys.title
                else:
                    keywords += keys.title
            
            task_ids = [] #one Task/Project contains one or multiple scrapy task

            settings = {
                'spider_count' : len(obj.targets.all()),
                'keywords' : keywords,
                'unique_id': unique_id, # unique ID for each record for DB
                'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
            }

            # res = ast.literal_eval(ini_list) 

            for site_url in obj.targets.all():
                domain = urlparse(site_url.address).netloc # parse the url and extract the domain
                spider_name = domain.replace('.com', '')
                task = scrapyd.schedule('default', spider_name, settings=settings, url=site_url.address, domain=domain, keywords=keywords)

            return redirect('crawler:task-list')

芹菜控制台

[2020-06-10 20:42:55,885: INFO/MainProcess] celery@DESKTOP-ENPLHOS ready.
[2020-06-10 20:42:55,900: INFO/MainProcess] pidbox: Connected to amqp://guest:**@127.0.0.1:5672//.
[2020-06-10 20:43:13,730: INFO/MainProcess] Received task: crawler.tasks.schedule_task[10e7bf06-5e4e-413c-85a3-79d61b9835cf]
[2020-06-10 20:43:17,077: INFO/MainProcess] Task crawler.tasks.schedule_task[10e7bf06-5e4e-413c-85a3-79d61b9835cf] succeeded in 3.3590000000040163s: None

http://localhost:6800/jobs 在这里我可以看到蜘蛛正在运行,但结果没有出现在我的视图中。

【问题讨论】:

  • 你试试 celery 文档中的 Keeping Results 部分吗?
  • 我相信您调用 celery 的命令可能缺少某些内容。根据这个post,您可能需要将-P solo 添加到您的命令中,例如:celery -A proj worker --loglevel=INFO --concurrency 1 -P solo

标签: django django-views scrapy celery


【解决方案1】:

使用 celery 之前的视图(返回 scraped 结果工作正常)

这是因为您的代码同步....一个接一个地运行。

另一方面,Celery 运行 异步,你总是会得到一个 None 作为它的返回值。

如果您链接 2 个或更多 Celery 任务(其中所有任务都运行异步),那么您可以使用它们的返回值,但不能将 synchronous viewasync celery task 链接。

Celery 任务旨在被调度并在后台运行...而您的视图应该返回其他内容...(无需等待您的蜘蛛完成)

为了能够使用Celery results

收集的数据需要存储在某处(csvjson 等文件,或在 database 内)并分两步处理 Django View

  • 首先触发 Celery 任务
  • 第二次收集存储的结果并显示出来

【讨论】:

  • 那么有什么办法可以解决这个问题呢?有什么建议我可以用芹菜报废吗?
  • Celery 结果需要存储在某个地方(像 csv、json 等文件,.. 或在数据库中)并分两步处理 Django 视图:首先触发 Celery 任务,然后收集存储的结果并显示出来。
  • 感谢您的回答,我会尝试这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2013-05-20
  • 2016-06-03
相关资源
最近更新 更多