Доверяй, но проверяй: Как парсинг помогает выявить фейки в НСИ

«Интеллект — это способность избегать выполнения работы, но так, чтобы она при этом была сделана»
Линус Торвальдс

Меня побудило написать статью желание прежде всего поделиться файлом Excel, содержащим информацию о состоянии всех ГОСТов на текущий момент. О парсинге сайтов в открытых источниках, включая сам Хабр, достаточно информации. Кроме того, мне хотелось немного порассуждать о том, где и как можно применить эти данные и на что они могут повлиять.

Рассуждения:

В настоящее время НСИ (Нормативно-справочная информация) используется во всех бизнес-процессах. В состав НСИ входят справочники и классификаторы. Одной из проблем НСИ является недостоверная информация, что влечет за собой принятие неверных решений.

Например, некорректная информация в справочниках при закупке материалов может привести к таким последствиям, как:

  • Использование товаров, не соответствующих стандартам, может привести к штрафам и санкциям со стороны контролирующих органов;

  • Финансовые потери: закупка товаров, не соответствующих требованиям, может привести к дополнительным расходам на их замену;

  • Риск для репутации: недостоверная информация может негативно сказываться на репутации компании.

Поэтому данные в справочнике требуют постоянной проверки и их корректировки. Объём информации, который нужно проверить и, тем более, исправить вручную, может существенно замедлить процесс.

Приведу интересный кейс, выпавший на мою долю и его решение. Для проверки определенных типов данных я предлагаю парсинг сайтов, а автоматизация исправления уже на ваш вкус. Например, различные языки программирования. Я за весь свой опыт использовал C#, Python, VBA для работы с Excel, в зависимости от ситуации.

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

Предыстория:

Мне предстояла нормализация справочников, при этом по возможности, выделение таких ошибок, как:

И если с первыми двумя справиться легко, то просматривая небольшой справочник в 300 тыс. позиций, приблизительно 10–15% из низ будут содержать материалы по ГОСТам.

Просмотреть 40 тыс. позиций вручную, конечно, реально, но не стоит того.

Парсинг сайтов, это по сути автоматизированный сбор неструктурированной информации с веб-страницы и, что самое главное, преобразование её в структурированный вид. В общем и целом, безобидное и очень полезное дело.

Перейдем к технической части, т.е. к самому коду и его описанию:

  1. Импорт библиотек

    Для парсинга использовал:

    • bs4 для работы с HTML — документами;

    • request для выполнения HTTP запросов;

    • xlsxwriter для создания Excel файла;

  2. Функция get_soup (url):

def get_soup(url):
    res = requests.get(url, headers)
    return bs4.BeautifulSoup(res.text, 'html.parser')

Эта вспомогательная функция принимает URL, отправляет GET-запрос и возвращает объект BeautifulSoup, который позволяет работать с HTML-кодом страницы.

  1. Цикл для сбора данных:

Основная логика находится в цикле while, который проходится от 1-го до последнего стандарта. На каждой итерации происходит:

  • Запрашивается страница с конкретным ГОСТом;

  • Извлекаются строки и таблицы с информацией о ГОСТе, статусе и замене;

  • Результаты добавляются в список data, если данные были успешно извлечены, в противном случае может возникнуть ошибка выхода за пределы массива.

while i <= last_gost:

    gost_categories = get_soup(main_url + str(i))
    rows = gost_categories.find_all('tr')

    try:
        gost = rows[2].find_all('td')[0].text.strip()
        status = rows[3].find_all('td')[0].text.strip()

        if rows[14].find_all('th')[0].text.strip() == 'Заменяющий:':
            replace_gost = rows[14].find_all('td')[0].text.strip()
        elif rows[15].find_all('th')[0].text.strip() == 'Заменяющий:':
            replace_gost = rows[15].find_all('td')[0].text.strip()
        else:
            replace_gost = ''

        data.append([gost, status, replace_gost])

    except IndexError:
        gost = 'Ошибка: ' + str(i)
        status = ''
        replace_gost = ''

        data.append([gost, status, replace_gost])

    i += 1

Результат:

На выходе получаем Excel файл, который можно использовать.

Результат

Результат

К примеру, возьмем один из справочников, в котором 39 тыс. номенклатурных позиций по ГОСТу, из которых 36 тыс. действующих, остальные 3 тыс. были заменены на другой ГОСТ или вовсе отменены.

Теперь проверка актуальности ГОСТов вне зависимости от размера справочника, занимает минут 5, а если пойти заварить кофе — 10.

Для сравнения данных лично я использовал две формулы: одна для того, чтобы вытащить ГОСТ из позиции в справочнике, вторая обычный ВПР, который сравнивает данные с типом интервального просмотра «ИСТИНА».

b99faf57a98bdfe80722115a375a7bb8.JPG

Что скажете Вы? На самом деле, в зависимости от целей, даже эту информацию можно применить где угодно: от различных ERP систем до специализированных баз данных.

Данный файл актуален на конец 2024 года. Скачать его можно тут.

© Habrahabr.ru