316 карток товару у Word за один день
Замовник мав архів із 318 папок товарів британського інтернет-магазину кавової техніки і вручну переносив у старий Word опис, характеристики й відгуки. Я зробив парсер, який заповнив 316 файлів .doc за ескізом замовника приблизно за 2 години роботи — замість понад 26 годин ручного копіювання.

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