刮擦和芹菜"update_state"



我有以下设置(Docker):

  • 芹菜链接到运行Scrapy蜘蛛的烧瓶设置
  • 烧瓶设置(显然)
  • 烧瓶设置收到对 Scrapy 的请求 ->启动工人做一些工作

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

顺便说一句:我是否错过了关于刮擦结构的一些东西?我可以在__init__内部分配参数以便能够进一步使用似乎是合理的,但 scrapy 似乎将该方法用作 lambda 函数。


要回答一些问题:

  • How are you using celery with scrapy?Scrapy 在芹菜任务中运行,而不是从命令行运行。我也从未听说过scrapyd,这是刮擦的子项目吗?我使用远程工作者从芹菜/烧瓶实例内部发射刮板,因此它与原始请求引入的线程不同,它们是单独的 docker 实例。

task.update_state效果很好!在芹菜任务中,但是一旦我们"进入"蜘蛛,我们就无法再获得芹菜了。有什么想法吗?

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

这有点像访问当前芹菜任务的静态方式吗?正如我所喜欢的那样...

我不确定你是如何发射蜘蛛的,但我遇到了你描述的同样的问题。

我的设置是烧瓶作为休息 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()

很抱歉无法确认它是否有效,但一旦我开始测试它,我就会在这里报告!我目前不能为这个项目投入那么多时间:(

如果您认为我可以进一步帮助您,请随时与我联系!

干杯,拉米罗

来源:

  • 虫运行器爬行器方法:https://doc.scrapy.org/en/latest/topics/api.html#scrapy.crawler.CrawlerRunner.crawlers
  • 芹菜任务文档:
    • 绑定任务:http://docs.celeryproject.org/en/latest/userguide/tasks.html#bound-tasks
    • 自定义状态: http://docs.celeryproject.org/en/latest/userguide/tasks.html#custom-states
  • 刮擦信号:https://doc.scrapy.org/en/latest/topics/signals.html#signals
  • 像脚本一样运行:https://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script

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

你如何使用芹菜和Scrapy? 在芹菜任务中跑得很痒吗? 我强烈建议在它自己的服务器下运行 scrapy 如果这对您的项目scrapyd有意义。

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

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

相关内容

  • 没有找到相关文章

最新更新