cd ~кейси/catalog-parser.md

кейс 01LIVE · ПРАЦЮЄ У КЛІЄНТА

316 карток товару у Word за один день

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

Термін
1 день за договором
Стек
Python · BeautifulSoup · pywin32 / Word COM · LibreOffice · JavaScript · PowerShell · CSV
Виконавець
Forge Logic
316заповнених карток, папки 3–318
~2 годвід архіву до готових файлів
26+ годпішло б на ручне копіювання (5 хв × 316)
11дублікатів знайшов звіт, замовник про них не знав
1 деньтермін за договором
2команди, щоб усе запустити
316 карток товару у Word за один день1:00

Що боліло

Схема в замовника була проста: відкрити товар на сайті, скопіювати, вставити у Word. Два файли він так зробив, далі зупинився. І було чому:

  • Магазин вимагав капчу навіть тоді, коли просто перемикаєш вкладки на одній картці.
  • Word вставляв скопійоване таблицями. Замовник обходив це через .txt: спочатку туди, потім у Word. Виходила подвійна робота.
  • На кожен товар окрема пронумерована папка: .txt із посиланням, .doc під текст, Excel і фото. Чіпати можна лише .doc.
  • Формат тільки Word 97-2003. Не .docx, саме старий .doc.

Що мало бути в кожному файлі

Ескіз замовник скинув сімома скриншотами. По порядку: хлібні крихти, назва, ціна, гарантія повернення, Perfect for, опис, список напоїв, характеристики (і видима частина, і повна таблиця з вкладки Specifications), інструкції, відгуки. З відгуками окрема умова: найстаріші, з трьох останніх сторінок, без відповідей на них.

На все один день.

Рішення

Перше, що я вирішив: на сайт ходить тільки браузер, як звичайний відвідувач. Розбір, оформлення і запис у Word відбуваються вже на комп’ютері, сайт про це нічого не знає.

Сайт бачить тільки звичайну сесію відвідувача. Розбір і запис у Word ідуть локально.

Схема парсера: два кроки Python на комп'ютері і збирач у браузері між ними

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, по рядку на кожну папку: назва, скільки напоїв і характеристик, скільки відгуків на сайті і скільки взято. Немає назви чи опису, отже статус «перевір вручну».

Запуск займає дві команди. Перша генерує збирач, друга обробляє те, що він зібрав.

Історія розробки

feat(demo)#01

Капча

Я пояснив замовнику, що скрипт не клікає по вкладках, тому капчі не буде. Він не зрозумів і попросив показати. Того ж вечора записав відео: три товари з трьох різних рубрик, картка на сайті й готовий .doc поруч. Після цього питань не було.

feat(format)#02

Форматування

Замовник збирався доводити оформлення руками, бо не вірив, що парсер це потягне. Потягнув: розміри шрифтів, жирні заголовки, порожні рядки між блоками, все як у його зразку. А блоки, яких немає на картці, у файл просто не потрапляють.

Що я виніс для себе

  • Коли клієнт не розуміє технічне пояснення, пояснювати вдруге немає сенсу. Краще записати відео. Три товари на екрані зробили більше, ніж мій абзац про вкладки.
  • Звіт по кожній позиції варто робити завжди. report.csv за хвилину показав картку без опису і 11 дублікатів, про які замовник навіть не підозрював.
  • Обходити захист сайту не довелося взагалі. Звичайна сесія браузера плюс паузи, і капча жодного разу не вискочила.

Результат

У тих самих папках лежать 316 заповнених .doc, поруч report.csv з підсумком по кожному товару. Від архіву до результату пройшло близько двох годин.

Парсер лишився в замовника. Він заточений під цей магазин і запускається двома командами, тож оновити відгуки чи зібрати іншу рубрику тепер справа кількох хвилин.