2017-06-12 142 views
0

我有以下设置(码头工人):Scrapy和芹菜`update_state`

  • 芹菜挂瓶安装运行于Scrapy蜘蛛
  • 瓶设置(显然)
  • 瓶设置获取请求Scrapy - >启动工人做一些工作

现在我想更新芹菜工人的进展原始瓶设置。 但是现在没有办法在刮刀内部使用celery.update_state(),因为它无法访问原始任务(虽然它在芹菜任务中运行)。

顺便说一句:我错过了关于scrapy结构的一些事情吗?这似乎是合理的,我可以分配的__init__内部参数能够使用furtheron,但scrapy使用方法,因为它似乎lambda函数..


要回答一些问题:

  • How are you using celery with scrapy? Scrapy运行在芹菜任务的内部,而不是从命令行运行。我也从来没有听说过scrapyd,这是scrapy的一个子项目吗?我使用远程工作者从celery/flask实例内部发起scrapy,因此它与原始请求所暗示的线程不同,它们是独立的docker实例。

task.update_state很棒!在芹菜任务的内部,但只要我们在蜘蛛中,我们就不再有芹菜了。有任何想法吗?

从item_scraped信号问题Task.update_state(taskid,meta = {})。如果scrapy碰巧在Celery任务本身中运行(因为它默认为self),您也可以在没有taskid的情况下运行

这种类似于访问当前芹菜任务的静态方式吗?正如我所愿......

回答

2

我不知道你是如何发射你的蜘蛛,但我面临同样的问题描述。

我的设置是作为休息API的烧瓶,根据请求启动芹菜任务来启动蜘蛛。我还没有得到它尚未代码,但我会告诉你我在想什么做的:

from scrapy.settings import Settings 
from scrapy.utils.project import get_project_settings 
from twisted.internet import reactor 
from scrapy.crawler import CrawlerRunner 
from scrapy.utils.log import configure_logging 
from scrapy import signals 
from .your_celery import app 



@app.task(bind=True) 
def scrapping(self): 

    def my_item_scrapped_handler(item, response, spider): 
     meta = { 
      # fill your state meta as required based on scrapped item, spider, or response object passed as parameters 
     } 

     # here self refers to the task, so you can call update_state when using bind 
     self.update_state(state='PROGRESS',meta=meta) 

    settings = get_project_settings() 
    configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'}) 

    runner = CrawlerRunner(settings) 
    d = runner.crawl(MySpider) 
    d.addBoth(lambda _: reactor.stop()) 

    for crawler in runner.crawlers: 
     crawler.signals.connect(my_item_scrapped_handler, signal=signals.item_scraped) 


    reactor.run() 

我不能够确认,如果它的工作原理很抱歉,但只要我得到周围测试它我会在这里报告!我目前不能够奉献尽可能多的时间,我想这个项目:(

不要犹豫与我联系,如果你认为我可以帮你任何进一步的!

干杯,拉米罗

来源:

+0

woah哥们,我确实解决了它。但感谢您的意见!最后,我以和你一样的方式处理它,尽管参与度较低 – WiseStrawberry

1

好需要更多的信息来回答这个问题。

你如何在Scrapy中使用芹菜? scrapy是否在芹菜任务中运行? 如果对您的项目scrapyd有意义,我会强烈建议在它自己的服务器下运行scrapy。

如果不是,那么item_scraped信号会很好,但前提是您有权访问Celery taskid或Celery任务对象本身。 http://docs.celeryproject.org/en/latest/reference/celery.app.task.html

从item_scraped信号问题Task.update_state(taskid,meta={})。你也可以在没有taskid的情况下运行,如果scrapy碰巧在Celery任务中运行(因为它默认为self

+0

更新我的问题,我跳澄清了一些事情。 @RabidCicada – WiseStrawberry