Scrapy + Django в производстве

Я пишу веб-приложение Django, которое использует Scrapy и локально все отлично работает, но мне интересно, как настроить производственную среду, в которой мои пауки запускаются периодически и автоматически (я имею в виду, что как только пауки завершают свою работу, они запускаются повторно. через определенное время ... например, через 24 часа). В настоящее время я запускаю своих пауков, используя специальную команду Django, основная цель которой - разрешить использование ORM Django для хранения очищенных элементов, поэтому я запускаю:

python manage.py scrapy crawl myspider

и результаты хранятся в моей базе данных Postgres. Я установил scrapyd, так как кажется, что это предпочтительный способ запуска scrapy в производственной среде. но, к сожалению, я не могу использовать его, не написав патч обезьяны (чего я бы хотел избежать), поскольку он использует JSON для своего API веб-сервиса, и я получаю исключение «modelX is not json serializable». Я посмотрел на django-dynamic-scraper, но, похоже, он не предназначен для гибкости и настраиваемый, как и Scrapy, и на самом деле в документах говорится:

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

Я также думал использовать crontab для планирования моих пауков ... но с каким интервалом мне следует запускать своих пауков? и если моему экземпляру EC2 (я собираюсь использовать веб-службы Amazon для размещения своего кода) потребуется перезагрузка, мне придется повторно запустить все мои пауки вручную ... ммм ... все становится сложным ... Итак ... что может быть эффективной настройкой для производственной среды? Как ты с этим справляешься? Что ты посоветуешь?


person daveoncode    schedule 27.10.2014    source источник


Ответы (1)


У меня был тот же вопрос, который привел меня к вашему здесь. Вот что я думаю и что сделал со своим проектом.

В настоящее время я запускаю своих пауков, используя специальную команду Django, основная цель которой - разрешить использование ORM Django для хранения очищенных элементов.

Звучит очень интересно. Я также хотел использовать ORM Django внутри пауков Scrapy, поэтому я импортировал django и настроил его перед очисткой. Думаю, в этом нет необходимости, если вы вызываете scrapy из уже созданного контекста Django.

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

У меня была идея использовать subprocess.Popen с перенаправлением stdout и stderr на PIPE. Затем возьмите результаты как stdout, так и stderr и обработайте их. Мне не нужно было собирать элементы из вывода, поскольку пауки уже записывают результаты в базу данных через конвейеры. Он становится рекурсивным, если вы вызываете процесс scrapy из Django таким образом, а процесс scrapy настраивает контекст Django, чтобы он мог использовать ORM.

Затем я попробовал scrapyd, и да, вам нужно запустить HTTP-запросы к scrapyd, чтобы поставить задание в очередь, но он не сигнализирует вам, когда задание завершено или ожидает выполнения. Эту часть вы должны проверить, и я думаю, что это место для патча обезьяны.

Я также думал использовать crontab для планирования моих пауков ... но с каким интервалом мне следует запускать своих пауков? и если моему экземпляру EC2 (я собираюсь использовать веб-службы Amazon для размещения своего кода) потребуется перезагрузка, мне придется повторно запустить все мои пауки вручную ... ммм ... все становится сложным ... Итак ... что может быть эффективной настройкой для производственной среды? Как ты с этим справляешься? Что ты посоветуешь?

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

Меня беспокоит добавление ненужных звеньев в цепочку. Scrapyd будет промежуточным звеном, и кажется, что он выполняет свою работу на данный момент, но он также может быть слабым звеном, если не может удерживать производственную нагрузку.

Имея в виду, что вы опубликовали это некоторое время назад, я был бы благодарен, если бы вы услышали, каково ваше решение в отношении всей интеграции Django-Scrapy-Scrapyd.

Ваше здоровье

person Ilija    schedule 20.02.2015