scrapy 如何为有争议项目设置celery 节拍?

idfiyjo8  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(66)

我有一个棘手的项目,我想运行我的蜘蛛每天,所以我用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子进程。我不知道该怎么修。我会很感激你的帮助。

apeeds0o

apeeds0o1#

Celery和Scrapy面临的问题似乎与Scrapy的reactor默认情况下不可重启有关,当您设置stop_after_crawl=False时,即使在抓取后也会保持reactor运行,这可能会导致在同一进程中尝试运行多个抓取时出现问题。以下是您可以解决这些问题的方法:
尝试此变体来解决此问题。

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子进程。

相关问题