我有一个棘手的项目,我想运行我的蜘蛛每天,所以我用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,另一个问题出现了,问题是在四次抓取之后(这是四次,因为并发性是四次),celery worker不再工作,它不做任务,因为以前的crawlprocesses仍然在运行,所以没有空闲的worker子进程。我不知道该怎么修。我会很感激你的帮助。
1条答案
按热度按时间apeeds0o1#
Celery和Scrapy面临的问题似乎与Scrapy的reactor默认情况下不可重启有关,当您设置
stop_after_crawl=False
时,即使在抓取后也会保持reactor运行,这可能会导致在同一进程中尝试运行多个抓取时出现问题。以下是您可以解决这些问题的方法:尝试此变体来解决此问题。
关于Celery worker在多次刮擦后不再工作的问题,您应该确保正确管理worker子进程。