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