Запустите несколько пауков Scrapy одновременно, используя scrapyd

Я использую scrapy для проекта, в котором я хочу очистить несколько сайтов (возможно, сотни), и мне нужно написать конкретного паука для каждого сайта. Я могу запланировать одного паука в проекте, развернутом в scrapyd, используя:

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

Но как запланировать одновременно всех пауков в проекте?

Вся помощь очень ценится!


person user1009453    schedule 29.05.2012    source источник


Ответы (2)


Мое решение для одновременного запуска более 200 пауков состояло в том, чтобы создать пользовательскую команду для проекта. См. http://doc.scrapy.org/en/latest/topics/commands.html#custom-project-commands для получения дополнительной информации о реализации пользовательских команд.

ИМЯ_ПРОЕКТА/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
person dru    schedule 29.05.2012
comment
Отлично, я попробую это первым делом утром. В данный момент у меня нет компьютера. Спасибо за помощь! - person user1009453; 29.05.2012
comment
Привет. Я пробовал ваше решение, но получаю следующую ошибку импорта: ошибка импорта: нет модулей с именами команд. Я помещаю строку COMMANDS_MODULE = 'YOURPROJECTNAME.commands' в файл настроек в каталоге проекта. Это правильно? - person user1009453; 30.05.2012
comment
@user1009453 user1009453 Убедитесь, что в вашей папке команд есть __init__.py - person dru; 30.05.2012
comment
Спасибо, что остаетесь со мной в этом, я действительно помогаю. Хорошо, я включил файл ini.py в каталог команд и снова загрузил проект в scrapyd. Но теперь я получаю следующую ошибку: NotImplementedError Должен ли я реализовать/создать экземпляр команды? - person user1009453; 31.05.2012
comment
Какая структура внутри schedule.json? - person user1787687; 10.08.2013
comment
Может ли кто-нибудь объяснить мне, как несколько пауков сканируют эту пользовательскую команду? - person Nabin; 12.02.2014
comment
Как передать аргумент? Например: -a query=myquery с этим? - person Yuda Prawira; 11.05.2017

Извините, я знаю, что это старая тема, но я недавно начал изучать скрап и наткнулся здесь, и у меня еще недостаточно представителей, чтобы опубликовать комментарий, поэтому публикую ответ.

Из общепринятых практик скрапинга вы увидите, что если вам нужно запустить несколько пауков одновременно, вам придется запустить несколько экземпляров службы scrapyd, а затем распределить между ними свои запуски паука.

person Cajetan Rodrigues    schedule 29.11.2014
comment
Если это было правдой, когда это было опубликовано, это уже не так. scrapyd выполняет задания параллельно. Если кажется, что это не так, проверьте это: stackoverflow.com/questions/9161724/ - person brunobg; 23.12.2020