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

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

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

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

Термін
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. Одна картка забирала близько 5 хвилин, на всьому архіві це понад 26 годин монотонної роботи. Два файли він уже зробив сам і зупинився.

  • Капча на кожному кроці. Магазин просив підтвердити, що ти людина, навіть коли перемикаєш вкладки однієї картки.
  • Word ламав текст. Скопійований зі сторінки текст вставлявся таблицями. Тому замовник спершу переносив усе в .txt, а вже потім у Word.
  • Жорстка структура архіву. Кожен товар має свою пронумеровану папку: .txt з адресою, .doc під текст, Excel і папку з фото. Txt, Excel і фото чіпати не можна.
  • Старий формат. Результат мав лягти в той самий .doc (Word 97-2003), без переходу на .docx.

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

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

Обмеження: 1 день на все.

Рішення

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

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

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

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

Увесь запуск — дві команди: згенерувати збирач і обробити його результат.

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

feat(demo)#01

Пояснення про капчу

Що сталось: моє перше пояснення («скрипт не клікає по вкладках») замовник не зрозумів і попросив показати на ділі.

Як вирішили: того ж вечора записав відео: 3 товари з трьох різних рубрик, картка на сайті і готовий .doc поруч.

feat(format)#02

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

Що сталось: замовник планував правити оформлення вручну, бо сумнівався, що парсер упорається.

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

Уроки

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

Результат

Замовник отримав 316 заповнених .doc у тих самих папках, плюс report.csv з підсумком по кожному товару. Від отримання архіву до готового результату пішло близько 2 годин — замість понад 26 годин ручного копіювання. Блоки, яких немає на картці товару, у файл не потрапили, тож порожніх заголовків немає.

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