Лайфхаки

Маленькие, полезные хитрости

Разработка парсера для Русклимата: от идеи до реализации

06.11.2024 в 09:13

Разработка парсера для Русклимата: от идеи до реализации

Парсер, написанный для компании "Русклимат", автоматически генерирует набор прайс-листов для клиентов компании из прейскурантов поставщиков.

Исходные данные

  • Несколько складов с товарами
  • Список поставщиков с различными ценами и ассортиментом
  • Ассортимент товаров со следующими свойствами:
    • классификатор по разделам с глубокой вложенностью (до 7 уровней)
    • классификатор по определенному признаку учета
    • наличие на складах
    • цены в разных валютах
  • Некоторые товары могут объединяться в комплекты, которые становятся новыми товарными позициями
  • Классификаторы и списки номенклатуры (прайс-листы) с различными ценами (по поставщикам), валютой, наличием по складам и дополнительными параметрами представляют собой MS Excel-файлы со сложным форматированием (объединенные ячейки, отступы в названиях, "разделах", возможность "схлопывания разделов" в таблице - по аналогии с деревом папок файловой системы)

Задача

Парсер должен иметь следующий функционал:

  • Формировать прайсы с различной номенклатурой и ценами, с учетом комплектаций и наличия по складам для разных клиентов.
  • Сохранять профиль сборки прайс-листов для каждого клиента, чтобы можно было выбрать несколько профилей одновременно и генерировать все нужные прайсы сразу и без повторной разметки таблицы.
  • Выдавать результат в 2 форматах - MS Excel и XML
  • Хранить историю выгрузок. В любой момент можно узнать момент последней выгрузки по любому профилю.
  • Хранить файлы классификаторов и автоматически их использовать. Классификаторы меняются очень редко, поэтому парсер не должен требовать повторной загрузки в каждом сеансе работы.
  • Сохранять загружаемые прайсы между сеансами работы с парсером и использовать их автоматически. Такое требование появилось исходя из того, что с парсером работают разные пользователи в разные моменты времени: новые данные загружаются в начале рабочего дня, а формирование результирующих прайс-листов происходит в течение дня другими пользователями.
  • Придерживаться единого формата загружаемых и генерируемых MS Excel-прайсов - соблюдать иерархию вложенности разделов, разметку заголовков таблиц и поддерживать функционал "сворачивания разделов".
  • Предоставлять прямые ссылки на генерируемые файлы для каждого профиля, по которым клиент может получать свои прайс-листы и настроить автоматизированное обновление информации у себя в системе.

Связанные вопросы и ответы:

Вопрос 1: Что такое парсер и зачем он нужен

Парсер - это программное обеспечение, предназначенное для извлечения данных из веб-страниц или других источников информации. Парсер используется для автоматизации процесса извлечения данных, что позволяет экономить время и усилия при работе с большими объемами информации.

Вопрос 2: Какие задачи можно решать с помощью парсера для Русклимата

Парсер для Русклимата может решать различные задачи, такие как:

1. Извлечение сведений о книгах, авторах и издательствах.

2. Создание базы данных книг и авторов для дальнейшего анализа.

3. Оценка популярности книг и авторов на сайте.

4. Поиск информации о конкретных книгах или авторах.

5. Анализ тенденций и трендов в области литературы.

Вопрос 3: Какие технологии можно использовать для разработки парсера для Русклимата

Для разработки парсера для Русклимата можно использовать различные технологии, такие как:

1. Python в сочетании с библиотекой BeautifulSoup для извлечения данных из HTML-страниц.

2. JavaScript в сочетании с библиотекой Cheerio для аналогичных целей.

3. C# в сочетании с библиотекой HtmlAgilityPack.

4. Java в сочетании с библиотекой Jsoup.

5. Ряд других языков программирования и библиотек для парсинга веб-страниц.

Вопрос 4: Как можно избежать блокировки при парсинге сайтов

Чтобы избежать блокировки при парсинге сайтов, следует соблюдать следующие правила:

1. Избегать многократного обращения к сайту в короткие сроки.

2. Использовать разные IP-адреса для обращений к сайту.

3. Использовать заголовки браузера, имитирующие поведение настоящего пользователя.

4. Избегать чрезмерного нагружения на сервер сайта.

5. Использовать прокси-серверы для скрытия своего IP-адреса.

Вопрос 5: Как можно избежать проблем с законом при парсинге сайтов

Чтобы избежать проблем с законом при парсинге сайтов, следует соблюдать следующие правила:

1. Избегать парсинга конфиденциальной информации, такой как личные данные пользователей.

2. Избегать парсинга информации, защищенной авторским правом.

3. Избегать парсинга информации, которая может нанести ущерб коммерческим интересам сайта.

4. Избегать парсинга информации, которая может нарушить законы о защите конфиденциальности.

5. Избегать парсинга информации, которая может нанести ущерб национальной безопасности.

Вопрос 6: Как можно оптимизировать работу парсера для Русклимата

Чтобы оптимизировать работу парсера для Русклимата, следует соблюдать следующие правила:

1. Использовать асинхронную обработку для увеличения скорости парсинга.

2. Использовать многопоточность для параллельного парсинга информации.

3. Использовать кэширование данных для уменьшения нагрузки на сервер сайта.

4. Использовать оптимизированные запросы к сайту для ускорения парсинга.

5. Использовать оптимизированные алгоритмы для обработки данных после парсинга.

Вопрос 7: Как можно защитить парсер для Русклимата от вредоносных программ

Чтобы защитить парсер для Русклимата от вредоносных программ, следует соблюдать следующие правила:

1. Использовать антивирусную программу для сканирования файлов, полученных при парсинге.

2. Использовать файрвол для блокировки потенциально опасных сайтов.

3. Избегать использования ненадежных источников информации.

4. Использовать защищенные протоколы для обмена данными.

5. Избегать использования непроверенных библиотек и модулей.

Вопрос 8: Как можно обеспечить безопасность данных, полученных при парсинге Русклимата

Чтобы обеспечить безопасность данных, полученных при парсинге Русклимата, следует соблюдать следующие правила:

1. Использовать шифрование данных для защиты от несанкционированного доступа.

2. Использовать защищенные протоколы для передачи данных.

3. Использовать защищенные сервера для хранения данных.

4. Избегать сохранения конфиденциальной информации.

5. Использовать меры контроля доступа для ограничения доступа к данным.

Что такое парсер и для чего он используется


В первую очередь, целью парсинга является ценовая «разведка», ассортиментный анализ, отслеживание товарных акций. “Кто, что, за сколько и в каких количествах продаёт?” – основные вопросы, на которые парсинг должен ответить. Если говорить более подробно, то парсинг ассортимента конкурентов или того же Яндекс.Маркет отвечает на первые три вопроса.С оборотом товара несколько сложней. Однако, такие компании как “Wildberries”, “Lamoda“ и Леруа Мерлен, открыто предоставляют информацию об ежедневных объемах продаж (заказах) или остатках товара, на основе которой не сложно составить общее представлении о продажах (часто слышу мнение, мол эти данные могут искажаться намеренно — возможно, а возможно и нет). Смотрим, сколько было товара на складе сегодня, завтра, послезавтра и так в течении месяца и вот уже готов график и динамика изменения количества по позиции составлена (оборачиваемость товара фактически). Чем выше динамика, тем больше оборот. Потенциально возможный способ узнать оборачиваемость товаров с помощью ежедневного анализа остатков сайта Леруа Мерлен. Можно, конечно, сослаться на перемещение товаров между точками. Но суммарно, если брать, например, Москву — то число не сильно изменится, а в существенные передвижения товара по регионам верится с трудом.С объемами продаж ситуация аналогична. Есть, конечно, компании, которые публикуют информацию в виде много/мало, но даже с этим можно работать, и самые продаваемые позиции легко отслеживаются. Особенно, если отсечь дешёвые позиции и сфокусироваться исключительно на тех, что представляют наибольшую ценность. По крайней мере, мы такой анализ делали – интересно получалось.Во-вторых, парсинг используется для получения контента. Здесь уже могут иметь место истории в стиле “правовых оттенков серого”. Многие зацикливаются на том, что парсинг – это именно воровство контента, хотя это совершенно не так. Парсинг – это всего лишь автоматизированный сбор информации, не более того. Например, парсинг фотографий, особенно с “водяными знаками” – это чистой воды воровство контента и нарушение авторских прав. Потому таким обычно не занимаются (мы в своей работе ограничиваемся сбором ссылок на изображения, не более того… ну иногда просят посчитать количество фотографий, отследить наличие видео на товар и дать ссылку и т.п.).Касательно сбора контента, интересней ситуация с описаниями товаров. Недавно нам поступил заказ на сбор данных по 50 сайтам крупных онлайн-аптек. Помимо информации об ассортименте и цене, нас попросили “спарсить” описание лекарственных аппаратов – то самое, что вложено в каждую пачку и является т.н. фактической информацией, т.е. маловероятно попадает под закон о защите авторских прав. В результате вместо набора инструкций вручную, заказчикам останется лишь внести небольшие корректировки в шаблоны инструкций, и всё – контент для сайта готов. Но да, могут быть и авторские описания лекарств, которые заверены у нотариуса и сделаны специально как своего рода ловушки для воришек контента :).Рассмотрим также сбор описания книг, например, с ОЗОН.РУ или Лабиринт.ру. Здесь уже ситуация не так однозначна с правовой точки зрения. С одной стороны, использование такого описания может нарушать авторское право, особенно если описание каждой карточки с товаром было нотариально заверено (в чём я сильно сомневаюсь — ведь может и не быть заверено, исключение — небольшие ресурсы, которые хотят затаскать по судам воров контента). В любом случае, в данной ситуации придётся сильно «попотеть», чтобы доказать уникальность этого описания. Некоторые клиенты идут еще дальше — подключают синонимайзеры, которые «на лету» меняют (хорошо или плохо) слова в описании, сохраняя общий смысл.Ещё одно из применений парсинга довольно оригинально – “самопарсинг”. Здесь преследуется несколько целей. Для начала – это отслеживание того, что происходит с наполнением сайта: где битые ссылки, где описания не хватает, дублирование товаров, отсутствие иллюстраций и т.д. Полчаса работы парсера — и вот у тебя готовая таблица со всеми категориями и данными. Удобно! “Самопарсинг” можно использовать и для того, чтобы сравнить остатки на сайте со своими складскими остатками (есть и такие заказчики, отслеживают сбои выгрузок на сайт). Ещё одно применение “самопарсинга”, с которым мы столкнулись в работе — это структурирование данных с сайта для выгрузки их на Яндекс Маркет. Ребятам так проще было сделать, чем вручную этим заниматься.Также парсятся объявления, например, на ЦИАН-е, Авито и т.д. Цели тут могут быть как перепродажи баз риелторам или туроператорам, так и откровенный телефонный спам, ретаргетинг и т.п. В случае с Авито это особенно явно, т.к. сразу составляется таблица с телефонами пользователей (несмотря на то, что Авито подменяет телефоны пользователей для защиты и публикует их в виде изображения, от поступающих звонков все равно никуда не уйти).

Какие задачи решает парсер для Русклимата

Библиотеки на Python предоставляют множество эффективных и быстрых функций для парсинга. Многие из этих инструментов можно подключить к готовому приложению в формате API для создания настраиваемых краулеров. Все перечисленные ниже проекты имеют открытый исходный код.

BeautifulSoup

Пакет для анализа документов HTML и XML, преобразующий их в синтаксические деревья. Он использует HTML и XML-парсеры, такие как html5lib и Lxml, чтобы извлекать нужные данные.

Для поиска конкретного атрибута или текста в необработанном HTML-файле в BeautifulSoup есть удобные функции find(), find_all(), get_text() и другие. Библиотека также автоматически распознаёт кодировки.

Установить последнюю версию BeautifulSoup можно через easy_install или pip:

easy_install beautifulsoup4 pip install beautifulsoup4

Selenium

Инструмент , который работает как веб-драйвер: открывает браузер, выполняет клики по элементам, заполняет формы, прокручивает страницы и многое другое. Selenium в основном используется для автоматического тестирования веб-приложений, но его вполне можно применять и для скрейпинга. Перед началом работы необходимо установить драйверы для взаимодействия с конкретным браузером, например ChromeDriver для Chrome и Safari Driver для Safari 10.

Установить Selenium можно через pip:

pip install selenium

с удобными инструментами для обработки HTML и XML файлов. Работает с XML чуть быстрее, чем Beautiful Soup, при этом используя аналогичный метод создания синтаксических деревьев. Чтобы получить больше функциональности, можно объединить Lxml и Beautiful Soup, так как они совместимы друг с другом. Beautiful Soup использует Lxml как парсер.

Ключевые преимущества библиотеки — высокая скорость анализа больших документов и страниц, удобная функциональность и простое преобразование исходной информации в типы данных Python.

Какие технологии используются для разработки парсера для Русклимата

Вот наконец мы подошли и к самому коду. Я более чем уверен, что вы без проблем можете создать все миграции и модели самостоятельно.

Для начала нам нужно создать отдельную и абстрактную бизнес логику самого парсера. Я привык создавать в App папочку Modules и хранить там отдельные классы для независимых решений.

В Laravel последних версий встроен отличнейший инструмент для парсинга — это компонент от Symfony DomCrawler . Именно благодаря этому компоненту ваша жизнь может очень сильно упроститься.

Как создать архитектуру парсера для Русклимата

Scrapy – это фреймворк для создания парсеров на языке Python. Он является мощным инструментом для извлечения структурированных данных из веб-сайтов, блогов, форумов и других источников.

С помощью Scrapy вы можете установить правила для извлечения данных, настроить рекурсивный процесс обхода сайта и сохранить результат в желаемом формате, таком как CSV, JSON или база данных.

Scrapy может быть использован для обработки больших объемов данных и работать с различными сайтами автоматически. Это делает его очень полезным инструментом для сбора данных при проведении маркетинговых исследований, анализа конкурентов и сбора данных для машинного обучения.

Кроме того, Scrapy имеет множество дополнительных возможностей и расширений, которые позволяют создавать более сложные парсеры, работать с прокси-серверами, автоматически запрашивать капчу и многое другое.

История и основные возможности

Scrapy – это фреймворк для создания веб-скраперов, написанный на языке программирования Python. Он был создан в 2008 году в компании Scrapinghub и с тех пор стал одним из наиболее популярных инструментов для автоматизированного сбора данных со страниц веб-сайтов.

Scrapy позволяет быстро и удобно создавать краулеры для получения нужных данных из веб-страниц, а также обеспечивает возможность парсинга данных на основе Xpath и CSS селекторов. С помощью middleware можно добавить дополнительную функциональность, например, обработку CAPTCHA или сохранение куки.

Scrapy имеет встроенные инструменты для обработки и хранения данных, такие как: стандартные выходные форматы (CSV, JSON, XML), API для хранения данных в базах данных (MySQL, PostgreSQL, MongoDB) и интеграцию с AWS S3 и FTP.

С помощью Scrapy можно автоматизировать мониторинг изменений веб-страниц, систему уведомлений, рекламу и многое другое. Фреймворк позволяет обходить многостраничные сайты, реализовывать логический переход по ссылкам и настраивать ограничения на скорость загрузки web-страниц.

Таким образом, применение Scrapy позволит вам значительно сократить время и усилия, необходимые для сбора данных, и получить максимально полную информацию, которую нужно вам.

Как организовать работу с большими объемами данных при разработке парсера для Русклимата

Парсер, написанный для компании "Русклимат", автоматически генерирует набор прайс-листов для клиентов компании из прейскурантов поставщиков.

Исходные данные

  • Несколько складов с товарами
  • Список поставщиков с различными ценами и ассортиментом
  • Ассортимент товаров со следующими свойствами:
    • классификатор по разделам с глубокой вложенностью (до 7 уровней)
    • классификатор по определенному признаку учета
    • наличие на складах
    • цены в разных валютах
  • Некоторые товары могут объединяться в комплекты, которые становятся новыми товарными позициями
  • Классификаторы и списки номенклатуры (прайс-листы) с различными ценами (по поставщикам), валютой, наличием по складам и дополнительными параметрами представляют собой MS Excel-файлы со сложным форматированием (объединенные ячейки, отступы в названиях, "разделах", возможность "схлопывания разделов" в таблице - по аналогии с деревом папок файловой системы)

Задача

Парсер должен иметь следующий функционал:

  • Формировать прайсы с различной номенклатурой и ценами, с учетом комплектаций и наличия по складам для разных клиентов.
  • Сохранять профиль сборки прайс-листов для каждого клиента, чтобы можно было выбрать несколько профилей одновременно и генерировать все нужные прайсы сразу и без повторной разметки таблицы.
  • Выдавать результат в 2 форматах - MS Excel и XML
  • Хранить историю выгрузок. В любой момент можно узнать момент последней выгрузки по любому профилю.
  • Хранить файлы классификаторов и автоматически их использовать. Классификаторы меняются очень редко, поэтому парсер не должен требовать повторной загрузки в каждом сеансе работы.
  • Сохранять загружаемые прайсы между сеансами работы с парсером и использовать их автоматически. Такое требование появилось исходя из того, что с парсером работают разные пользователи в разные моменты времени: новые данные загружаются в начале рабочего дня, а формирование результирующих прайс-листов происходит в течение дня другими пользователями.
  • Придерживаться единого формата загружаемых и генерируемых MS Excel-прайсов - соблюдать иерархию вложенности разделов, разметку заголовков таблиц и поддерживать функционал "сворачивания разделов".
  • Предоставлять прямые ссылки на генерируемые файлы для каждого профиля, по которым клиент может получать свои прайс-листы и настроить автоматизированное обновление информации у себя в системе.

Как оптимизировать работу парсера для Русклимата


У нас есть связи между словами и их типы. Мы можем оценивать, правильно ли нашли вершину слова — метрика UAS (Unlabeled attachment score). Или оценивать, правильно ли найдена как вершина, так и тип зависимости — метрика LAS (Labeled attachment score).Казалось бы, здесь напрашивается оценка точности (accuracy) — считаем, сколько раз мы попали из общего количества случаев. Если у нас есть 5 слов и для 4 мы правильно определили вершину, то получаем 80%.Но на самом деле оценить парсер в чистом виде проблематично. Разработчики, решающие задачи автоматического парсинга, часто берут на вход сырой текст, который в соответствии с пирамидой анализа проходит этапы токенизации и морфологического анализа. На качество работы парсера могут повлиять ошибки с этих более ранних этапов. В частности, это относится к процедуре токенизации — выделения слов. Если мы выделили неправильные слова-юниты, то уже не сможем корректно оценить синтаксические связи между ними — ведь в нашем исходном размеченном корпусе юниты были другие.Поэтому формулой оценки в данном случае является ф-мера, где точность (precision) — доля точных попаданий относительно общего числа предсказаний, а полнота — доля точных попаданий относительно числа связей в размеченных данных.Когда мы в дальнейшем будем приводить оценки, нужно помнить, что используемые метрики затрагивают не только синтаксис, но еще и качество разбиения на токены.

Как обеспечить надежность и безопасность парсера для Русклимата

Отправлено

Пока ответов нет - понятно, почему - случай весьма нестандартный. Потому продолжаю искать сам. После пролистывания книг по тестированию и чтения форумов - удалось придумать следующее:
3) Тестирование самих html страниц . Этот способ в чем-то перекликается с вышеприведенном способом (1), фактически являсь его развитием.
Дело в том, что ошибки (искажения данных) могут возникнуть, главным образом, если какие-то страницы из всех по своей структуре будут отличаться от других таких же. Но видов страниц всего пять. Поэтому, вполне можно выделить все их компоненты, которые содержат нужные данные, и проверять их наличие перед началом работы парсера.
Например, если на странице должен быть список названий, и находится он по такому адресу xpath:

//body/div/ul/li/text()

то проверять, что такой запрос срабатывает на тестируемых страницах. И все запросы при тестировании страниц должны идти именно от тега body, желательно без пропусков нижележащих слоев иерархии, до тех элементов, которые содержат нужные данные.
4) Тестирование данных, полученных из парсера , преимущественно - сырых, (в строковом виде) до их записи в базу. Здесь возможны:

а) Проверка форматов, например:
- если полученная строка должна быть дробным числом, - очевидно, эта строка должна состоять из нескольких цифр с точкой где-то между ними;
- если это - имя или фамилия - строка должна состоять из буквенных символов, и быть длиной от трех до тридцати знаков

б) Тестирование логики, например:
- если есть таблица, где в каждой строке приводятся числовые значения, а в самой последней строке - их сумма, то эта сумма, извлеченная парсером должна примерно совпадать с суммой, вычисленной программным способом из значений в остальных строках.
Ну вот пока как-то так. Кажется, что применение способов 1, 3 и 4 даст вполне достаточную гарантию надежной работы. Что касается способа 2 (создание второго парсера и сверка данных, полученных разными парсерами) - уж очень он трудоемок, пока оставлю его в запасе, реализую, если будет время.