如何为scrapy项目设置celerybeat?

问题描述 投票:0回答:1

我有一个 scrapy 项目,我想每天运行我的蜘蛛,所以我使用 celery 来做到这一点。这是我的tasks.py 文件:

from celery import Celery, shared_task
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy_project.scrapy_project.spiders import myspider

app = Celery('tasks', broker='redis://localhost:6379/0')

@shared_task
def scrape_news_website():
    print('SCRAPING RIHGT NOW!')
    setting = get_project_settings()
    process = CrawlerProcess(get_project_settings())
    process.crawl(myspider)
    process.start(stop_after_crawl=False)

我设置了

stop_after_crawl=False
,因为当它为True时,在第一次刮擦后我收到此错误:

raise error.ReactorNotRestartable() 
twisted.internet.error.ReactorNotRestartable

现在将

stop_after_crawl
设置为 False 时会出现另一个问题,问题是在四次(因为并发性是四,所以是四次)之后,芹菜工作线程不再工作,并且不执行任务,因为之前的爬网进程是仍在运行,因此没有空闲的工作子进程。我不知道如何解决它。我将感谢您的帮助。

scrapy celery django-celery celerybeat django-celery-beat
1个回答
0
投票

您在 Celery 和 Scrapy 中遇到的问题似乎与以下事实有关:Scrapy 的反应器默认情况下不可重新启动,并且当您设置

stop_after_crawl=False
时,即使在爬行之后,它也会使反应器保持运行,这可能会导致问题尝试在同一进程中运行多个爬网。以下是解决这些问题的方法:

尝试使用此变体来解决此问题。

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy_project.scrapy_project.spiders import myspider

def run_spider():
    settings = get_project_settings()
    process = CrawlerProcess(settings)
    process.crawl(myspider)
    process.start()

@shared_task
def scrape_news_website():
    print('SCRAPING RIGHT NOW!')
    run_spider()

对于多次抓取后 Celery Worker 不再工作的问题,您应该确保正确管理 Worker 子进程。

© www.soinside.com 2019 - 2024. All rights reserved.