Страницы: 1
RSS
Выгрузка данных по ценовым запросам ЭТП ГПБ с помощью Power query
 
Уважаемые коллеги!
Помогите, пожалуйста, решить следующую задачу:
Необходимо с торговой площадки ЭТП ГПБ вытащить данные по ценовым запросам поставщиков с помощью PQ.
Там есть API, которое позволяет работать с JSON.
https://etpgpb.ru/files/api_documentation_cz.docx?ver=0

вот такой запрос позволяет вытащить 1 страницу данных со списком предложений:
Код
Table.FromRecords(
    Json.Document(
        Web.Contents(
            "https://etp.gpb.ru/nsi/kimapi/publicpriceorderlist?limit=50&page=1",
            [
                Headers = [
                    Accept="application/json",
                    #"X-Requested-With"="XMLHttpRequest",
                    #"Content-Type"="application/json"
                ],
                Content = Json.FromValue([
                    opt = []
                ])
            ]
        )
    )[entries]
)

а, например, вот такой вытаскивает данные по конкретному ИДшнику

Код
let
    Запрос2 = Table.FromRecords(
    Json.Document(
        Web.Contents(
            "https://etp.gpb.ru/nsi/kimapi/publicpriceorderinfo?id=230295",
            [
                Headers = [
                    Accept="application/json",
                    #"X-Requested-With"="XMLHttpRequest",
                    #"Content-Type"="application/json"
                ],
                Content = Json.FromValue([
                    opt = []
                ])
            ]
        )
    )[positions]
)
in
    Запрос2

Я подозреваю, что возможно вытащить все данные по всем ИДшникам в одну таблицу, но к сожалению не хватает знаний.
 
Доброе время суток.
Ну, выдернуть данные по первому запросу для всех страниц, начиная с первой, пока есть отдача, можно так
Код
let
    baseUrl = "https://etp.gpb.ru/nsi/kimapi/publicpriceorderlist?limit=1000&page=",
    existed = List.Generate(
        () => [pageId = 1, url = baseUrl & Text.From(pageId), data = Json.Document(Web.Contents(url))[entries]],
        each List.Count([data]) > 0,
        each [pageId = [pageId] + 1, url = baseUrl & Text.From(pageId), data = Json.Document(Web.Contents(url))[entries]],
        each [data]
    ),
    toTable = Table.FromRecords(List.Combine(existed))
in
    toTable

Только, например, id = 230295, в этих данных нет. Соответственно,
Цитата
Ezoptron написал:
вытащить все данные по всем ИДшникам
требует детализации - что это?
Ну, а по второму вопросу, несмотря на
Цитата
2.6. Один вопрос - одна тема. Не следует в открываемой теме обозначать и задавать сразу несколько вопросов.
Получив первым запросом номера Id на страницах просто подставляете, как и в коде выше, их в запрос 2 и получаете данные, потом только несколько простых трансформаций.
 
Андрей VG, почему-то по вашему запросу выгружается только 11 страниц, а их там 19 на данный момент.
А как подставить несколько ИДшников в один запрос?
Вопрос-то один...в идеале хотелось бы получить одну большую простыню, где оба запроса, приведенных мной в качестве примера, будут связаны воедино по ИДшнику.
Изменено: Ezoptron - 22.09.2021 11:25:51
 
Цитата
Ezoptron написал:
а их там 19
Я не смотрел это там, да и где тот там не знаю. Поставьте limit=4 и будет у вас 116 страниц :)  Ну, и записей в итоге станет больше - 464, вместо 275. Почему - вопрос не ко мне, а к авторам API.
 
Андрей VG,

приблизительно то, что нужно по одному ИДшнику, получается вот таким запросом из рекордера, но он какой-то монструозный
Код
let
    Источник = Json.Document(Web.Contents("https://etp.gpb.ru/nsi/kimapi/publicpriceorderinfo?id=" & "230940")),
    #"Преобразовано в таблицу" = Record.ToTable(Источник),
    #"Транспонированная таблица" = Table.Transpose(#"Преобразовано в таблицу"),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Транспонированная таблица", [PromoteAllScalars=true]),
    #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"id", Int64.Type}, {"title", type text}, {"status", Int64.Type}, {"date_sent", type datetimezone}, {"date_delivery", type date}, {"date_response", type datetimezone}, {"delivery_conditions", type text}, {"delivery_address", type text}, {"use_price_without_nds", type logical}, {"max_price_type", Int64.Type}, {"for_small_business", type logical}, {"for_producer", type logical}, {"for_authorized_dealer", type logical}, {"russian_production", type logical}, {"national_project", type logical}, {"deny_alternative", type logical}, {"allow_edo", type logical}, {"customer_comment", type any}, {"customer_name", type text}, {"customer_inn", type number}, {"customer_kpp", Int64.Type}, {"customer_documents", type any}, {"positions", type any}, {"regions", type any}}),
    #"Развернутый элемент positions" = Table.ExpandListColumn(#"Измененный тип", "positions"),
    #"Развернутый элемент positions1" = Table.ExpandRecordColumn(#"Развернутый элемент positions", "positions", {"position_name", "quantity", "okei_code", "okei_name", "id", "max_price", "okpd2_name", "okpd2_code", "max_cost", "documents"}, {"positions.position_name", "positions.quantity", "positions.okei_code", "positions.okei_name", "positions.id", "positions.max_price", "positions.okpd2_name", "positions.okpd2_code", "positions.max_cost", "positions.documents"}),
    #"Развернутый элемент positions.documents" = Table.ExpandListColumn(#"Развернутый элемент positions1", "positions.documents"),
    #"Развернутый элемент regions" = Table.ExpandListColumn(#"Развернутый элемент positions.documents", "regions"),
    #"Развернутый элемент regions1" = Table.ExpandRecordColumn(#"Развернутый элемент regions", "regions", {"code", "name"}, {"regions.code", "regions.name"})
in
    #"Развернутый элемент regions1"
Страницы: 1
Наверх