有没有一种方法可以在不使用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框架中运
问题内容: 我想用我的本地elasticsearch(容器)在运行使用kibana控制台ElasticSearch文档,我看到 这使我可以快速地运行社区版。 查看kibana文档,我只能看到 用run替换pull会寻找x-pack(我认为这意味着不是社区),并且找不到ES 是否有一个可以轻松在容器中设置kibana本地化的衬板?我需要做的就是使用控制台(Sense更换) 问题答案: 如果您想在do
本地运行模式 本地运行模式主要用于测试功能是否正确。目前本地运行模式仅支持一个Worker(可以有多个Task)和一个PS。可以通过配置选项angel.deploy.mode来使用本地运行模式,具体的参数配置可参考Angel系统参数 1. 运行环境准备 Java >= 1.8 Angel发布包 angel-\-bin.zip 配置好HADOOP_HOME和JAVA_HOME环境变量,解压Angel