Я использую scrapy для проекта, в котором я хочу очистить несколько сайтов (возможно, сотни), и мне нужно написать конкретного паука для каждого сайта. Я могу запланировать одного паука в проекте, развернутом в scrapyd, используя:
curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2
Но как запланировать одновременно всех пауков в проекте?
Вся помощь очень ценится!
Ответ 1 · рейтинг 23 · dru
Мое решение для одновременного запуска более 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
Ответ 2 · рейтинг 1 · Cajetan Rodrigues
Извините, я знаю, что это старая тема, но я недавно начал изучать скрап и наткнулся здесь, и у меня еще недостаточно представителей, чтобы опубликовать комментарий, поэтому публикую ответ.
Из общепринятых практик скрапинга вы увидите, что если вам нужно запустить несколько пауков одновременно, вам придется запустить несколько экземпляров службы scrapyd, а затем распределить между ними свои запуски паука.