我有一个Django站点,当用户请求时,会发生一个scrape,我的代码会在一个新的进程中启动一个Scrapy spider独立脚本.当然,这并不能满足用户数量的增加.

大概是这样的:

class StandAloneSpider(Spider):
    #a regular spider

settings.overrides['LOG_ENABLED'] = True
#more settings can be changed...

crawler = CrawlerProcess( settings )
crawler.install()
crawler.configure()

spider = StandAloneSpider()

crawler.crawl( spider )
crawler.start()

我决定用Celery 和工人来排队等待爬网请求.

然而,我遇到了龙卷风react 堆无法重启的问题.第一个和第二个爬行器成功运行,但后续爬行器将抛出ReactorNotRestartable错误.

任何人都可以在Celery 框架内分享一些关于运行蜘蛛的小贴士吗?

推荐答案

好的,这就是我如何让Scrapy在我的Django项目中工作,该项目使用Celery 来排队要爬行的东西.实际的解决方法主要来自位于此处的Joehillen的代码http://snippets.scrapy.org/snippets/13/

首先是tasks.py号文件

from celery import task

@task()
def crawl_domain(domain_pk):
    from crawl import domain_crawl
    return domain_crawl(domain_pk)

那么crawl.py文件

from multiprocessing import Process
from scrapy.crawler import CrawlerProcess
from scrapy.conf import settings
from spider import DomainSpider
from models import Domain

class DomainCrawlerScript():

    def __init__(self):
        self.crawler = CrawlerProcess(settings)
        self.crawler.install()
        self.crawler.configure()

    def _crawl(self, domain_pk):
        domain = Domain.objects.get(
            pk = domain_pk,
        )
        urls = []
        for page in domain.pages.all():
            urls.append(page.url())
        self.crawler.crawl(DomainSpider(urls))
        self.crawler.start()
        self.crawler.stop()

    def crawl(self, domain_pk):
        p = Process(target=self._crawl, args=[domain_pk])
        p.start()
        p.join()

crawler = DomainCrawlerScript()

def domain_crawl(domain_pk):
    crawler.crawl(domain_pk)

这里的诀窍是"来自多处理导入过程",它绕过了Twisted框架中的"ReactorNotRestartable"问题.因此基本上Celery 任务调用"domain_crawl"函数,该函数反复重用"DomainCrawlerScript"对象,以与你的Scrapy spider接口.(我知道我的示例有点多余,但我之所以这么做,是因为我的设置中使用了多个版本的python[我的django Web服务器实际上使用的是python2.4,我的工作服务器使用的是python2.7])

在我的示例中,"DomainSpider"只是一个修改后的Scrapy Spider,它接受一个URL列表,然后将它们设置为"start_urls".

希望这能有所帮助!

Django相关问答推荐

Django中的判断约束

DRF中没有参数的视图的警告-壮观

Django-HTMX:呈现到不同目标的表单验证错误

Django:作为模型中的列表元素的字段

ModuleNotFoundError:没有名为guardian.shortcuts的模块

Django中用于外键的嵌套循环

从url参数过滤的Django日期范围返回空查询集

Django 转储数据将附加数据添加到 json 导出

Django - 是否可以为查询集预取单个字段的多个过滤器?

是否可以在没有模型的情况下创建自定义管理视图

何时在 django 中使用 pre_save、save、post_save?

Django 相当于 COUNT 和 GROUP BY

如何在 Django 中向 ModelForm 添加外键字段?

如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?

Django:如何在视图中获取格式日期?

如何将我的上下文变量传递给 Django 中的 javascript 文件?

如何使用 Requests 库执行 HTTP DELETE 请求

如何在保存之前更改 Django 表单字段值?

访问 django 管理模板中的对象

Django:必须使用对象 pk 或 slug 调用通用详细视图