当前位置: 首页 > 面试题库 >

在Scrapy中本地运行所有蜘蛛

尉迟龙光
2023-03-14
问题内容

有没有一种方法可以在不使用Scrapy守护程序的情况下运行Scrapy项目中的所有蜘蛛程序?曾经有一种使用来运行多个Spider的方法scrapy crawl,但是该语法已删除,Scrapy的代码也进行了很多更改。

我尝试创建自己的命令:

from scrapy.command import ScrapyCommand
from scrapy.utils.misc import load_object
from scrapy.conf import settings

class Command(ScrapyCommand):
    requires_project = True

    def syntax(self):
        return '[options]'

    def short_desc(self):
        return 'Runs all of the spiders'

    def run(self, args, opts):
        spman_cls = load_object(settings['SPIDER_MANAGER_CLASS'])
        spiders = spman_cls.from_settings(settings)

        for spider_name in spiders.list():
            spider = self.crawler.spiders.create(spider_name)
            self.crawler.crawl(spider)

        self.crawler.start()

但是,一旦在上注册了蜘蛛self.crawler.crawl(),我就会得到所有其他蜘蛛的断言错误:

Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/scrapy/cmdline.py", line 138, in _run_command
    cmd.run(args, opts)
  File "/home/blender/Projects/scrapers/store_crawler/store_crawler/commands/crawlall.py", line 22, in run
    self.crawler.crawl(spider)
  File "/usr/lib/python2.7/site-packages/scrapy/crawler.py", line 47, in crawl
    return self.engine.open_spider(spider, requests)
  File "/usr/lib/python2.7/site-packages/twisted/internet/defer.py", line 1214, in unwindGenerator
    return _inlineCallbacks(None, gen, Deferred())
--- <exception caught here> ---
  File "/usr/lib/python2.7/site-packages/twisted/internet/defer.py", line 1071, in _inlineCallbacks
    result = g.send(result)
  File "/usr/lib/python2.7/site-packages/scrapy/core/engine.py", line 215, in open_spider
    spider.name
exceptions.AssertionError: No free spider slots when opening 'spidername'

有什么办法吗?我不想开始子类化核心Scrapy组件,而只是为了运行所有我的蜘蛛。


问题答案:

这是一个不在自定义命令中运行,而是手动运行Reactor并为每个蜘蛛创建新的Crawler的示例:

from twisted.internet import reactor
from scrapy.crawler import Crawler
# scrapy.conf.settings singlton was deprecated last year
from scrapy.utils.project import get_project_settings
from scrapy import log

def setup_crawler(spider_name):
    crawler = Crawler(settings)
    crawler.configure()
    spider = crawler.spiders.create(spider_name)
    crawler.crawl(spider)
    crawler.start()

log.start()
settings = get_project_settings()
crawler = Crawler(settings)
crawler.configure()

for spider_name in crawler.spiders.list():
    setup_crawler(spider_name)

reactor.run()

您将必须设计一些信号系统,以便在所有信号灯完成后停止反应堆。

编辑:这是您可以在自定义命令中运行多个蜘蛛的方法:

from scrapy.command import ScrapyCommand
from scrapy.utils.project import get_project_settings
from scrapy.crawler import Crawler

class Command(ScrapyCommand):

    requires_project = True

    def syntax(self):
        return '[options]'

    def short_desc(self):
        return 'Runs all of the spiders'

    def run(self, args, opts):
        settings = get_project_settings()

        for spider_name in self.crawler.spiders.list():
            crawler = Crawler(settings)
            crawler.configure()
            spider = crawler.spiders.create(spider_name)
            crawler.crawl(spider)
            crawler.start()

        self.crawler.start()


 类似资料:
  • 问题内容: 我在一个要刮擦多个站点(可能是数百个站点)的项目中使用了scrapy,并且我必须为每个站点编写特定的蜘蛛。我可以使用以下命令在部署要抓取的项目中安排 一只 蜘蛛: 但是,如何一次计划一个项目中的 所有 蜘蛛呢? 所有帮助非常感谢! 问题答案: 我一次运行200个以上Spider的解决方案是为该项目创建一个自定义命令。有关实现自定义命令的更多信息,请参见http://doc.scrapy

  • 问题内容: 我不知道应该把我的Spider代码放在哪里以及如何从main函数中调用它。请帮忙。这是示例代码: 问题答案: 所有其他答案均参考Scrapyv0.x。根据更新的文档,Scrapy 1.0要求:

  • 我对这只蜘蛛的逻辑有个疑问。我想爬网的Castbox网站有无限分页类别之一。因此,我认为我可以拆分JSON文件的URL,然后切片,最后重新连接URL以便能够解析它。因此,我使用while循环来确定爬行器继续爬行所需元素的条件。 让我解释清楚。 当我检查Castbox网站的JSON URL时,我发现每次通过向下滚动页面重新加载时,只有一部分URL会发生变化。这部分被称为“跳过”,它在0到200之间变

  • 问题内容: 我有一个Django站点,当用户请求时会发生刮擦,并且我的代码在新过程中启动了Scrapy Spider独立脚本。自然,这与增加用户数量无关。 像这样: 我决定使用Celery并使用工作人员将爬网请求排队。 但是,我遇到了无法重新启动龙卷风反应堆的问题。第一个蜘蛛和第二个蜘蛛成功运行,但随后的蜘蛛将引发ReactorNotRestartable错误。 任何人都可以在Celery框架中运

  • 本地运行模式 本地运行模式主要用于测试功能是否正确。目前本地运行模式仅支持一个Worker(可以有多个Task)和一个PS。可以通过配置选项angel.deploy.mode来使用本地运行模式,具体的参数配置可参考Angel系统参数 1. 运行环境准备 Java >= 1.8 Angel发布包 angel-\-bin.zip 配置好HADOOP_HOME和JAVA_HOME环境变量,解压Angel

  • 问题内容: 我想用我的本地elasticsearch(容器)在运行使用kibana控制台ElasticSearch文档,我看到 这使我可以快速地运行社区版。 查看kibana文档,我只能看到 用run替换pull会寻找x-pack(我认为这意味着不是社区),并且找不到ES 是否有一个可以轻松在容器中设置kibana本地化的衬板?我需要做的就是使用控制台(Sense更换) 问题答案: 如果您想在do