В ТЗ було вказане стартове посилання: https://auto.ria.com/car/used/ (за замовчуванням відображає 10-20 елементів на сторінці, задати кількість не можливо).
Переглянувши, як працює AutoRia, мною було вирішено використати посилання: https://auto.ria.com/uk/search/, оскільки воно дає можливість використовувати query фільтри для пошуку авто та вказувати кількість елементів на сторінці, що значно пришвидшує роботу програми. Оскільки вказавши максимальну кількість (100) елементів на сторінці, кількість сторінок суттєво(!) зменшується.
Опис query фільтрів, використаних для пошуку авто:
filters = {
"indexName": "auto", # Б/У автомобілі
"sort[0].order": "dates.created.desc", # Спочатку нові оголошення
"dates.sold.not": "0000-00-00%2000:00:00", # Приховати продані авто
"size": 100, # Відображати 100 елементів на сторінці
"page": 0, # Сторінка
}
В ТЗ не було вказано, чи повинні оголошення бути унікальними в БД, але це наче є логічним.
В ідеалі я би додав ще одне поле auto_id
, оскільки кожне оголошення на сайті має свій унікальний ID,
але щоб не додавати додаткове поле, я зробив унікальним посилання
(кожне посилання на авто є унікальним, оскільки на кінці посилання є вказаний той самий auto_id).
Тобто при кожному новому скрапінгу, в БД додаютсья лише нові оголошення, старі остаються незмінними. Видалені оголошення також пропускаються
Конфліктні поля:
odometer
:int
, абоNull
, якщо пробіг не вказаний (так, чомусь навіть Б/У авто є без пробігу).username
:str
, абоNull
, якщо імʼя продавця/назва компанія не вказана.phone_number
:int
- структура була заявлена+38063……
, але оскільки це число, то в БД номер зберігається без+
.image_url
:str
, абоNone
, якщо в оголошенні немає жодного фото.car_number
:str
, абоNone
, якщо номерний знак не вказаний в оголошенні.car_vin
:str
, але він є не у всіх оголошеннях. При скрапінгу такі оголошення пропускаються (не записуютсья в БД), оскільки за моїми спостереженнями без VIN-номеру в основному лише йдуть причіпи, катери тощо.
Що стосується номеру телефону продавця, то він отримується за допомогою АПІ запиту із певними параметрами
(їх можна знайти в HTML оголошення),
цей запит я відслідкував у браузері, коли натискається кнопка Показати
(показати повністю номер телефону).
В БД записується лише основний номер телефону, але їх буває декілька.
Тестове завдання виконане згідно усіх умов:
- Програма запускається щодня о 12:00, заходить у карточку кожного Б/У авто та записує його в БД -
PostgreSQL
. - Програма щодня о 00:00 виконує дамп БД та зберігає його до каталогу
/dumps
. - Програма та база даних розгортаються за допомогою
docker-compose
.
Звичайно, можна було використати Selenium
, та отримувати номер телефону звичайним "кліком" по кнопці,
але тоді довелось би пожертвувати швидкістю роботи програми:)