Страницы: 1 2 След.
RSS
Парсинг сайта «Минстрой России», Классификатор строительных ресурсов
 
Приветствую!

Хочу спарсить данные с сайта. Интересуют всего 3 фрагмента (на скрине): шифр, наименование и единица измерения
Как парсить знаю очень слабо — мне будет достаточно получить html-коды страниц (или один большой код со всей информацией), а я уж "вытяну"
Как можно программно "прощёлкать" все кнопки группы, чтобы добраться до страницы с информацией?
Адесная строка при этом не меняется, поэтому вообще непонятно…
Нужные данные
UPD: Можно получить список через поиск, но там тоже щёлкать надо

P.S.: это не запрещено  :D с сайта можно скачать всю эту инфу, но кто-то (как будто специально) в выгрузку не включил единицы измерения

Новые КСР:
Приказ Минстроя России от 17 ноября 2022 г. № 969/пр «О формировании классификатора строительных ресурсов»
(ссылка, тема ZVI)


Ссылки:
VBA-JSON (JSON-Converter from GitHub)
Тема с советами по парсингу
Парсинг через Chome (Selenium)
Использование HTML DOM (Document Object Model) в скриптах на базе Windows Script Host
Изменено: Jack Famous - 22.12.2022 09:29:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
тут в архивах можно скачать эксельки
ФГИС ЦС (minstroyrf.ru)
 
Тимофеев, благодарю - сейчас буду сравнивать  ;)
Про парсинг вопрос открыт - в любом случае хочется научиться хоть немного  :)

UPD:
данных на 20 тыс больше, чем на официальной странице, при этом несколько тысяч кодов из официального не найдено  :(

UPD2:
Internet Explorer не отображает содержимое страницы (оно не подгружается)  :cry:
Изменено: Jack Famous - 11.06.2021 11:30:24
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Возвращаюсь к вопросу…
Накатал вот такую функцию для получения кода страницы
…. но она не может вернуть данные, т.к они формируются динамически (как я понял)
Есть ещё вот такой способ получения, но там вообще чёрт ногу сломит
Как спарсить динамически формируемые данные и/или …
… прощёлкать кнопку «Показать ещё» при поиске?

Прошу изменить название темы на Получение (парсинг) динамически формируемых данных с сайта \ VBA. Parse dynamic HTML
Изменено: Jack Famous - 14.09.2021 16:31:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Как спарсить динамически формируемые данные и/или …
F12, вкладка Network, тыкаем по разделам и смотрим запросы.
Динамика формируется вот по таким ссылкам: https://ksr.minstroyrf.ru/ksr-rest/classifier/books?date=14.09.2021 в виде json данных.
Переходя по ссылке классификатора на нужную дату, ссылка формируется с нужным ID каждый раз, далее этот ID будет использоваться в переходе по ветке ниже.
Успехов разобраться :)
Скрытый текст
 
Цитата
Oleg Boyaroff: Успехов разобраться
большое спасибо за информацию! Уловил, ксожалению, только основную мысль - без конкретики)))
Я так понимаю, что этот вариант — один из самых непростых для парсинга? Не могли бы вы сделать небольшой пример получения чего-либо? При необходимости готов оплатить мастер-класс или типа того  :)
Изменено: Jack Famous - 16.09.2021 09:48:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Попробовал, метод "GET", для указанного адреса не работает, не в курсе временное ли это , или постоянное, но если бы работал то тут не сложно.
вот пример для URL = "https://ksr.minstroyrf.ru/ksr-rest/classifier/groups/554?date=16.09.2021&casRequestId=438844c8-2d63-4013-85db-c30ed924aa3a&casRequestId=bdb9cd57-16d6-4981-adf3-cd7ec91fb599"

Скрытый текст


Можно и из Json получить теги, но тут код будет немного иной, а так если теги известны, то результат будет на активном листе.
Забыл добавить, что нужен модуль JsonConverter, его брал  с этого сайта, не помню из какой темы, но на просторах интернета
его легко можно найти
Изменено: Nordheim - 16.09.2021 11:45:27
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim,  спасибо большое! Добавил ссылку на JSON-Converter
А как получать URL типа https://ksr.minstroyrf.ru/ksr-rest/classifier/groups/… ?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
А как получать URL
Не в курсе, через F12 открыл и посмотрел сработал ответ только от верхнеуровневой таблицы, та, о которой идет речь в стартовом сообщении,
выдает ошибку, и текст возвращается при запросе тот же, что и выводится в браузере
"Все гениальное просто, а все простое гениально!!!"
 
Вот судя по всему, то что было нужно
Скрытый текст


При запросе есть нюанс, там несколько страниц, поэтому нужно делать цикл желательно
Код
Do....Loop
в котором предусмотреть завершение процедуры при
Код
xDic.count = 0 
b счетчик страниц приркрутить, который будет формировать json запроса меняя страницу от 0 и до ..... пока не будет условие
Код
xDic.count = 0
и соответственно выход из процедуры. Так же добавите выгрузку на лист не жестко в [a2], а определением последней незаполненной ячейки. Как-то так
Изменено: Nordheim - 16.09.2021 13:49:14
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, большое спасибо - буду разбираться!  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выложил итоговый результат с циклом по страницам
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Jack Famous написал:
Не могли бы вы сделать небольшой пример получения чего-либо?
Прошу, изучайте.
Код
Sub PP()
    Dim booksId As Variant, partsId As Variant, sectionsId As Variant, groupsId As Variant
    Dim bId As Variant, pId As Variant, sId As Variant, gId As Variant
    Dim dateNow As String, result As String
    
    dateNow = Format(Date, "dd.MM.yyyy")
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", "https://ksr.minstroyrf.ru/ksr-rest/classifier/books?date=" & dateNow, "False": .Send
        booksId = Regex(.responseText, """id"":(\d+)")
        For Each bId In booksId
            .Open "GET", "https://ksr.minstroyrf.ru/ksr-rest/classifier/parts_sections/" & bId & "?date=" & dateNow, "False": .Send
            partsId = Regex(.responseText, """id"":(\d+)")
            For Each pId In partsId
                .Open "GET", "https://ksr.minstroyrf.ru/ksr-rest/classifier/sections/" & pId & "?date=" & dateNow, "False": .Send
                sectionsId = Regex(.responseText, """id"":(\d+)")
                For Each sId In sectionsId
                    .Open "GET", "https://ksr.minstroyrf.ru/ksr-rest/classifier/groups/" & sId & "?date=" & dateNow, "False": .Send
                    groupsId = Regex(.responseText, """id"":(\d+)")
                    For Each gId In groupsId
                        .Open "POST", "https://ksr.minstroyrf.ru/ksr-rest/classifier/extlist", "False"
                        .setRequestHeader "Content-Type", "application/json;charset=UTF-8"
                        .Send ("{""date"":""" & dateNow & """,""groupId"":" & gId & ",""page"":0,""length"":100,""sidx"":""title"",""sord"":""ASC""}")
                        result = .responseText
                        Debug.Print result
                        Stop
                    Next
                Next
            Next
        Next
    End With
End Sub
Private Function Regex(ByVal text As String, ByVal pattern As String) As Variant
    Dim Matches As Object
    Dim i As Integer
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Global = True
        .MultiLine = True
        .pattern = pattern
        Set Matches = .Execute(text)
        ReDim arr(Matches.Count - 1)
        For i = 0 To Matches.Count - 1
            arr(i) = Matches(i).SubMatches(0)
        Next
        Regex = arr
        Set Matches = Nothing
    End With
End Function

За кол-во выводимых данных на страницу отвечает параметр length для POST запроса, я выставил значение 100. По умолчанию там 30.
Как раз POST запрос и есть ответ на ваш первоначальный вопрос, где меняется только позиция page.
 
Цитата
Oleg Boyaroff написал:
За кол-во выводимых данных на страницу отвечает параметр length для POST запроса, я выставил значение 100. По умолчанию там 30.
Исходя из этого можно первым запросом получить в ответе количество строк, а вторым, передать количество строк в запросе, в этом случае никакого цикла не потребуется
"Все гениальное просто, а все простое гениально!!!"
 
Oleg Boyaroff, огромное вам спасибо! По итогам сообщу  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Oleg Boyaroff, отдельное и огромное вам спасибо за, фактически, полное руководство!  :idea:
Не скажу, что понял прямо всё, но точно немало - формируемые в макросе строки нашёл в запросах страницы, нюанс парсинга 91ой книги (ФСЭМ не содержит частей) учёл

Цитата
Nordheim: первым запросом получить в ответе количество строк, а вторым, передать количество строк в запросе
сделал круче: получаю количество строк позиций в группе из строки (в конце) и проверяю с распознанным
Спасибо Вам!  :)
Парсер
Работает несколько минут (у меня аж 26) — я так понял, основное время уходит на загрузку страницы, т.к. я выставил 10 тыс позиций, чтобы не бегать по страницам
Парсинг овердлинной строки-сцепки всех позиций в группы очень быстрый, а с библой будет ещё быстрее (себе сделал версию как раз с ней)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
сделал круче: получаю количество строк позиций в группе из строки (в конце) и проверяю с распознанным
Я об этом написал в 14 сообщении, попробовал проверил все работает
Цитата
Jack Famous написал:
Работает несколько минут (у меня аж 26)
Таблица грузилась быстро, за несколько секунд, ни о каких минутах речи не шло
"Все гениальное просто, а все простое гениально!!!"
 
Jack Famous,грузилось долго. 113064 строки - это все данные?
 
Вот вариант без циклов, получаем количество строк и запрашиваем их непосредственно у нужной таблицы, время работы пара секунд. Или по итогу нужны все таблицы сайта?
Скрытый текст
Изменено: Nordheim - 20.09.2021 13:51:01
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Тимофеев: 113064 строки - это все данные?
да — всё, что на сайте, всё нашлось  :idea:

Цитата
Nordheim: по итогу нужны все таблицы сайта?
Ну дык …
а за вариант спасибо — начал понимать, сижу разбираюсь…
Изменено: Jack Famous - 20.09.2021 14:38:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Тестовый стенд (файл с 3мя модулями)
Вариант от Oleg Boyaroff — полностью готовый + вариант от Nordheim "как есть" + модуль JSON-Converter
Вариант от Nordheim с небольшими изменениями (в т.ч. границы массива - с единицы). coll As Dictionary и dic As Collection — это, я, конечно, оценил  :D
Nordheim, если есть возможность, то сделайте, пожалуйста, полную версию…
Изменено: Jack Famous - 20.09.2021 14:52:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: Coolection
Нет такого слова.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, спасибо - поправил  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Эх, интересно то как. Я бы еще в PQ запилил, но он собака почему-то прикручивает к запрашиваемому адресу ахулиард параметров, которые я не просил, и вадает ошибку, что он такое не могет. Вот кто так делает?
Вот горшок пустой, он предмет простой...
 
PooHkrd,  :D
Это ещё хорошо, что минстрой не обфускерил (пока что?) данные, как Памфилова на сайте с данными о выборах  :D
Я сейчас проверяю - перечень выгружаемых (файлом) с сайта позиций меньше на 2, чем на сайте + есть дубли различного уровня даже в спрарсеных данных. Бардак жесточайший, одним словом. Причём, с ФССЦ/ФСЭМ ещё хуже ситуация

К сожалению, сметные справочники у нас в строительстве, больше для галочки, нежели реально надёжный инструмент  :sceptic:
Изменено: Jack Famous - 20.09.2021 15:59:35
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Nordheim , если есть возможность, то сделайте, пожалуйста, полную версию…
Примерно как-то так| По времени 26:26
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, спасибо за дополнительный вариант!
Код дублировать не буду, т.к. там несколько классов и модулей. Время, как я понимаю, такое же (у себя не тестил)
В любом случае, я первый раз попробовал JSON и иметь такой конверетер точно лишним не будет  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
p.s. вы можете выгрузить ВСЕ данные через post запрос как у поиска, только объему возвращаемых данных там мегабайт на 80+.
Экспериментируйте  ;)  
 
Цитата
Oleg Boyaroff написал:
p.s. вы можете выгрузить ВСЕ данные через post запрос как у поиска
Одним запросом сразу все, можно пример кода?
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Oleg Boyaroff: post запрос как у поиска
я уже подумал над этим, но вернусь позже (и отпишусь) — надо боссу подготовит расширенную презентацию "всё плохо со справочниками"  :D
Ещё раз большое спасибо!  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Наверх