Веб-сайт для скраппинга в реальном времени с Django: останавливаемый процесс скраппинга и полоса загрузки

Что я хотел бы достичь

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

  1. User presses "scrape"
  2. When the scraping process begins, Django renders a view with a loading message and a "stop" button
  3. 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/

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