316 карток товару у Word за один день
Архів на 318 папок, товари британського магазину кавової техніки. У кожну папку треба було перенести з сайту опис, характеристики й відгуки, причому в старий .doc. Замовник робив це руками, по п'ять хвилин на картку. Встиг зробити два файли й зупинився: решта тягнула ще на 26+ годин копіпасту. Я написав парсер, і за дві години 316 файлів були готові.

Що боліло
Схема в замовника була проста: відкрити товар на сайті, скопіювати, вставити у Word. Два файли він так зробив, далі зупинився. І було чому:
- Магазин вимагав капчу навіть тоді, коли просто перемикаєш вкладки на одній картці.
- Word вставляв скопійоване таблицями. Замовник обходив це через .txt: спочатку туди, потім у Word. Виходила подвійна робота.
- На кожен товар окрема пронумерована папка: .txt із посиланням, .doc під текст, Excel і фото. Чіпати можна лише .doc.
- Формат тільки Word 97-2003. Не .docx, саме старий .doc.
Що мало бути в кожному файлі
Ескіз замовник скинув сімома скриншотами. По порядку: хлібні крихти, назва, ціна, гарантія повернення, Perfect for, опис, список напоїв, характеристики (і видима частина, і повна таблиця з вкладки Specifications), інструкції, відгуки. З відгуками окрема умова: найстаріші, з трьох останніх сторінок, без відповідей на них.
На все один день.
Рішення
Перше, що я вирішив: на сайт ходить тільки браузер, як звичайний відвідувач. Розбір, оформлення і запис у Word відбуваються вже на комп’ютері, сайт про це нічого не знає.
Сайт бачить тільки звичайну сесію відвідувача. Розбір і запис у Word ідуть локально.
Python проходить архів двічі. Спочатку дістає посилання, потім розкладає зібране назад по тих самих папках.
- Генератор. Іде по папках із потрібного номера, витягує з кожного .txt посилання на товар (рядок із рубрикою пропускає) і збирає з них collect.js. PowerShell одразу кидає скрипт у буфер, лишається тільки вставити.
- Збирач. Це JavaScript, який запускається в консолі браузера, тобто там, де можна виконати код прямо на відкритій сторінці. Він по черзі бере кожен товар і тягне всі відгуки з публічного API магазину: з тієї ж адреси, звідки сайт сам підвантажує їх собі на сторінки.
- Між товарами пауза 1,5–3 секунди, відгуки йдуть пачками по 100. Якщо запит падає, скрипт пробує ще тричі й щоразу чекає довше. Сайт не завалюється, тож і реагувати йому нема на що.
- Обробник. Бере найсвіжіший data.json із Завантажень, розбирає сторінки через BeautifulSoup і складає текст у порядку ескізу. Відповіді на відгуки викидає: оцінки в них немає.
- У Word пишу через COM. Простіше кажучи, програма керує встановленим Word так, ніби за ним сидить людина з мишкою. Текст іде прямо в N.doc і зберігається як 97-2003. Таблиць немає, бо вставляється чистий текст, а не шматок сторінки.
- Немає Word, тоді підхоплює LibreOffice. Файл відкритий у Word, тоді скрипт зупиняється й каже, в чому справа, замість того щоб його зіпсувати.
- Наприкінці report.csv, по рядку на кожну папку: назва, скільки напоїв і характеристик, скільки відгуків на сайті і скільки взято. Немає назви чи опису, отже статус «перевір вручну».
Запуск займає дві команди. Перша генерує збирач, друга обробляє те, що він зібрав.
Історія розробки
Капча
Я пояснив замовнику, що скрипт не клікає по вкладках, тому капчі не буде. Він не зрозумів і попросив показати. Того ж вечора записав відео: три товари з трьох різних рубрик, картка на сайті й готовий .doc поруч. Після цього питань не було.
Форматування
Замовник збирався доводити оформлення руками, бо не вірив, що парсер це потягне. Потягнув: розміри шрифтів, жирні заголовки, порожні рядки між блоками, все як у його зразку. А блоки, яких немає на картці, у файл просто не потрапляють.
Що я виніс для себе
- Коли клієнт не розуміє технічне пояснення, пояснювати вдруге немає сенсу. Краще записати відео. Три товари на екрані зробили більше, ніж мій абзац про вкладки.
- Звіт по кожній позиції варто робити завжди. report.csv за хвилину показав картку без опису і 11 дублікатів, про які замовник навіть не підозрював.
- Обходити захист сайту не довелося взагалі. Звичайна сесія браузера плюс паузи, і капча жодного разу не вискочила.
Результат
У тих самих папках лежать 316 заповнених .doc, поруч report.csv з підсумком по кожному товару. Від архіву до результату пройшло близько двох годин.
Парсер лишився в замовника. Він заточений під цей магазин і запускається двома командами, тож оновити відгуки чи зібрати іншу рубрику тепер справа кількох хвилин.