【问题标题】:Scheduling my crawler with celery not working用芹菜安排我的爬虫不起作用
【发布时间】:2020-09-27 06:33:39
【问题描述】:

在这里,我想每 1 分钟用 celery 运行一次爬虫。我编写了如下任务,并在视图中使用delay 调用了该任务,但我没有得到结果。

我在不同的终端上运行celery -A mysite worker -l info celery、rabbitmq broker、scrapy 和 django 服务器。 CrawlerHomeView 通过创建任务对象成功重定向到任务列表。但是 celery 不工作

在 celery 控制台中抛出这个错误 ValueError: not enough values to unpack (expected 3, got 0) [2020-06-08 15:36:06,732: INFO/MainProcess] Received task: crawler.tasks.schedule_task[3b537143-caa8-4445-b3d6-c0bc8d301b89] [2020-06-08 15:36:06,735: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)') Traceback (most recent call last): File "....\venv\lib\site-packages\billiard\pool.py", line 362, in workloop result = (True, prepare_result(fun(*args, **kwargs))) File "....\venv\lib\site-packages\celery\app\trace.py", line 600, in _fast_trace_task tasks, accept, hostname = _loc ValueError: not enough values to unpack (expected 3, got 0)

观看次数

class CrawlerHomeView(LoginRequiredMixin, View):
    login_url = 'users:login'

    def get(self, request, *args, **kwargs):
        frequency = Task()
        categories = Category.objects.all()
        targets = TargetSite.objects.all()
        keywords = Keyword.objects.all()

        form = CreateTaskForm()
        context = {
            'targets': targets,
            'keywords': keywords,
            'frequency': frequency,
            'form':form,
            'categories': categories,
        }
        return render(request, 'index.html', context)
    
    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()       
            schedule_task.delay(obj.pk)
        return render(request, 'index.html', {'form':form, 'errors':form.errors})

tasks.py

scrapyd = ScrapydAPI('http://localhost:6800')
@periodic_task(run_every=crontab(minute=1))  # how to do  with task search_frequency value ?
def schedule_task(pk):
    task = Task.objects.get(pk=pk)
    if task.status == 0 or task.status == 1 and not datetime.date.today() >= task.scraping_end_date:
        unique_id = str(uuid4())  # create a unique ID.
        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

        settings = {
            'spider_count': len(task.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 task.targets.all():
            domain = urlparse(site_url.address).netloc  # parse the url and extract the domain
            spider_name = domain.replace('.com', '')
            scrapyd.schedule('default', spider_name, settings=settings, url=site_url.address, domain=domain,
                                    keywords=keywords)

    elif task.scraping_end_date == datetime.date.today():
        task.status = 2
        task.save()  # change the task status as completed.

设置

CELERY_BROKER_URL = 'amqp://localhost'

编辑

这个答案帮助我找到了解决方案Celery raises ValueError: not enough values to unpack

现在这个错误已经消失了。 现在在芹菜控制台中我看到了这个 [2020-06-08 16:33:23,123: INFO/MainProcess] Task crawler.tasks.schedule_task[0578558d-0dc6-4db7-b69f-e912b604ff3d] succeeded in 0.016000000000531145s: None 并且在我的前端没有得到 scraped 结果。

现在我的问题是如何检查我的任务是否每 1 分钟定期运行一次?

这是我第一次使用芹菜,所以这里可能会出现一些问题。

【问题讨论】:

  • 你运行的是什么操作系统,还有celery版本
  • @iklinac windows os 和 celery 4+

标签: django web-scraping django-views celery


【解决方案1】:

Windows 平台不再支持 Celery(第 4 版已放弃官方支持)

如果你不想走这条路,我强烈建议你将你的应用程序化(或使用 wsl2) 您可能需要使用 gevent(请注意,如果您走这条路线可能会出现一些其他问题)

pip install gevent
celery -A <module> worker -l info -P gevent

找到了类似的详细答案here

【讨论】:

  • 感谢您提供此信息 gevent 解决了此问题。现在我已经编辑了我的问题。你能看看这个吗?
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2012-04-22
  • 2018-11-04
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多