Задача:
На странице
https://sprosivracha.com/questions размещаются вопросы пациентов и ответы врачей. Пациент может принять ответ врача, после чего вопрос будет закрыт, а ответ станет принятым. Также на сайте присутствует cloudflare.
Нужно было разработать механизм для сбора вопросов и принятых ответов за последние сутки с сохранением дополнительных метаданных. При повторном сборе, возможно, будут встречаться ранее сохранённые вопросы, но уже с принятым ответом. В таком случае нужно обновить запись и сохранить принятый ответ. Все данные должны сохраняться в базу данных SQL.
Данные для сбора:
- ID вопроса
- ФИО пациента
- Сам вопрос
- Возраст пациента
- Стоимость которую выставил пациент за ответ на свой вопрос
- Тэги вопроса
- ID врача у которого приняли ответ
- ФИО врача
- Сам принятый ответ
Решение:
Скрипт обходит cloudflare при каждом переходе по url без сторонних сервисов и собирает вопросы пациентов и принятые ответы с сайта
https://sprosivracha.com/questions за последние сутки, сохраняя данные в SQL БД и JSON файл для восстановления в случае сбоев. Также применил надежный метод поиска элементов на странице, с гарантией.
- Получение количества вопросов за сутки:
Скрипт заходит на https://sprosivracha.com/ и извлекает количество новых вопросов за последние сутки. Эти данные сохраняются в JSON-файл. - Сбор ссылок на вопросы:
Переходя по страницам, скрипт собирает ссылки на вопросы, проверяя наличие принятых ответов. Сбор продолжается до тех пор, пока не будет собрано количество вопросов, равное числу новых за сутки. Промежуточные данные (ссылки и текущая страница) сохраняются в JSON для продолжения работы при сбоях. - Сбор данных о вопросах и ответах:
Скрипт переходит по сохраненным ссылкам и собирает детали вопросов и принятых ответов в базу данных. Если ответ на ранее собранный вопрос появился позже, данные обновляются в базе.
Этот подход обеспечивает надежную работу скрипта и предотвращает дублирование данных.
Используемые технологии: Python, selenium.
Скрипт опубликовать не могу, тк заказчик не дал разрешение.