Асинхронный скрепер + Django

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

Например: скрепер работает с использованием while True. Он собирает, обрабатывает и отправляет обработанные данные. Пользователь посетил сайт и должен иметь возможность видеть данные, которые скрепер отдал во время своей последней итерации. Когда скрепер снова собирает, обрабатывает и возвращает данные, данные пользователя должны автоматически обновляться, и так далее по кругу.

К сожалению, я не могу показать вам код проекта из-за конфиденциальности.

Далее я опишу методы, которые я нашел и попытался применить. Все они так или иначе связаны с Django Channels, мультипроцессами и потоками.

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

  1. Мультипроцессинг, Pipe. Было предложено создать отдельный скрипт-процесс (в моем случае асинхронный скрепер) и использовать Pipe для передачи этих данных другому скрипту (в моем случае Django View).

  2. Websockets. Создайте поток WS и подключитесь к нему.

  3. SSE. Этот вариант показался мне наиболее правильным, так как мне не нужно двустороннее соединение, как в веб-сокетах. Мне нужно только обновлять информацию на клиенте при обновлении информации на сервере. В поисках способа реализации SSE я наткнулся на модуль daphne. Согласно краткому руководству на сайте, я подключил модуль и он работает, но только на примере с самого сайта. Суть в том, что создается отдельная функция, в которой в бесконечном цикле генерируются некоторые данные и передаются пользователю. Каждый новый пользователь - это отдельный поток на сервере. Мне не удалось запустить свой скрепер как сторонний модуль в этом цикле. Он выбрасывает ошибку RuntimeError: asyncio.run() cannot be called from a running event loop. Вот ссылка на сайт с руководством. Там все кратко описано. https://www.photondesigner.com/articles/server-sent-events-daphne?ref-yt-server-sent-events-daphne

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

Решить проблему оказалось проще, чем я ожидал.

Мы берем базу данных Redis, запускаем отдельно скрипт скрапера и записываем данные в базу. В другом скрипте мы получаем данные из базы данных.

Не знаю, насколько это "правильно", но пока все так.

Изначально я пытался реализовать это с помощью каналов и сельдерея по предложению пользователя Sagun Devkota.

Вернуться на верх