使用scrapyd同时运行多个scrapy爬虫

12

我正在使用Scrapy进行一个项目,在这个项目中,我想爬取很多网站 - 可能是数百个 - 并且我必须为每个网站编写一个特定的 "spider"。我可以使用以下代码在部署到 Scrapyd 的项目中调度 一个 "spider":

curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2

但我该如何一次性调度项目中的所有蜘蛛?

非常感谢您的帮助!

2个回答

25

我运行200多个蜘蛛的解决方案是为项目创建一个自定义命令。有关实现自定义命令的更多信息,请参见http://doc.scrapy.org/en/latest/topics/commands.html#custom-project-commands

YOURPROJECTNAME/commands/allcrawl.py

from scrapy.command import ScrapyCommand
import urllib
import urllib2
from scrapy import log

class AllCrawlCommand(ScrapyCommand):

    requires_project = True
    default_settings = {'LOG_ENABLED': False}

    def short_desc(self):
        return "Schedule a run for all available spiders"

    def run(self, args, opts):
        url = 'http://localhost:6800/schedule.json'
        for s in self.crawler.spiders.list():
            values = {'project' : 'YOUR_PROJECT_NAME', 'spider' : s}
            data = urllib.urlencode(values)
            req = urllib2.Request(url, data)
            response = urllib2.urlopen(req)
            log.msg(response)

请确保在您的settings.py文件中包含以下内容

COMMANDS_MODULE = 'YOURPROJECTNAME.commands'

然后从命令行中(在您的项目目录中)只需输入以下命令:

scrapy allcrawl

太好了,我明天一早就会尝试这个。我现在没有电脑。谢谢你的帮助! - user1009453
感谢您一直陪伴着我,这真的很有帮助。好的,我已经在commands目录中包含了一个__ini__.py文件,并再次上传到了scrapyd。但是现在我收到了以下错误: NotImplementedError我需要实现/实例化命令吗? - user1009453
schedule.json 文件内的结构是什么? - user1787687
3
谁能解释一下,如何通过这个自定义命令进行多个蜘蛛的爬行? - Nabin
我该如何传递参数?例如:如何使用“-a query="myquery"”这个参数? - Yuda Prawira
显示剩余2条评论

1

抱歉,我知道这是一个旧话题,但我最近开始学习scrapy并偶然发现了这里,由于我的声望还不够高,无法发布评论,因此发布了一个回答。

常见的scrapy实践中可以看出,如果您需要同时运行多个爬虫,您将需要启动多个scrapyd服务实例,然后在这些实例之间分配您的Spider运行。


如果这个帖子发布时是正确的,现在已经不再正确了。Scrapyd可以并行运行作业。如果看起来不是这样,请检查这个链接:https://dev59.com/0GDVa4cB1Zd3GeqPaBob - brunobg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接