Веб-сайт для скраппинга в реальном времени с Django: останавливаемый процесс скраппинга и полоса загрузки
Что я хотел бы достичь
Я хотел бы сделать сайт, который позволяет пользователям соскабливать информацию с других сайтов. Моя цель состоит в том, чтобы достичь чего-то следующего:
- User presses "scrape"
- When the scraping process begins, Django renders a view with a loading message and a "stop" button
- If the user presses the "stop" button, or if the scraping process terminates, a view with the scraping results is shown
Текущее состояние
На данный момент у меня есть очень простой сайт для скраппинга с ужасным пользовательским опытом. После того, как пользователь нажимает кнопку scrape, я отображаю вид, похожий на следующий:
def scraping_view(request, scraper_args):
scrape_results = scrape(scraper_args) # Very long function!
return render(request, 'scrape_view.html', scrape_results )
Это плохая идея, так как функция scrape
занимает много времени, и пользователь получает ужасные впечатления.
Моя (возможно, плохая) идея
Моя идея заключалась в следующем:
- запустите задачу celery и выведите промежуточное представление с сообщением о загрузке и кнопкой "стоп"
- позвольте задаче celery хранить результаты скрапа где-то (где?)
- найдите способ отозвать задачу, если пользователь нажмет кнопку "стоп"
- получать результаты задачи сельдерея, когда задача завершена или когда нажата кнопка "стоп"
- отменить результаты скрапа после закрытия страницы, так как я просто заинтересован в том, чтобы показать их на сайте
Поскольку я новичок в Django, я не могу оценить, осуществима ли моя идея и имеет ли она вообще смысл. Есть ли у кого-нибудь решение, которое можно предложить, альтернативное решение или примеры, которыми можно поделиться? Спасибо!
Вы на правильном пути с использованием celery, поэтому celery будет управлять очередью задач скраппинга и выполнять их с пулом рабочих, celery позволяет хранить пользовательские состояния обработки см. здесь: https://docs.celeryproject.org/en/stable/userguide/tasks.html#custom-states
У вас будет конечная точка, которая вызовет выполнение задачи celery для начала скраппинга. Когда начнется выполнение задачи selenium scraping, celery вернет идентификатор задачи, который вы можете сохранить и использовать для последующего использования.
Celery также позволяет отзывать/отменять задачи по идентификатору задачи celery, см. здесь: https://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks, это будет функциональность вашей кнопки отмены.
С точки зрения обновления пользователя через сайт о ходе скраппинга, я бы использовал celery в сочетании с django-channels и установил соединение с веб-сокетами на вашем фронт-энде, который будет поддерживать прогресс скраппинга в реальном времени и избежит необходимости опроса какой-то конечной точки rest: https://channels.readthedocs.io/en/stable/