Страницы: 1
RSS
Разложить json файл на кластеры
 
Здравствуйте!

Получаю запросом Json документ:
https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variabl...

С первого значения edges начинаются, публикации, всего там 50 публикаций, как получить кластеры для каждой публикации?
Пример - приложенная фотография
Впитываю знания, как борщ после тренировки ^^)
 
Шулер что ли
 
Цитата
Молодое_Поколение написал:
С первого значения edges начинаются, публикации,
вот я сходил по вашей ссылке и получил
Код
{"data":{"user":{"edge_owner_to_timeline_media":{"count":347,"page_info":{"has_next_page":false,"end_cursor":null},"edges":[]}}},"status":"ok"}

Нет никакого первого значения у edges.
F1 творит чудеса
 
Цитата
Михаил Л написал:
Шулер что ли
Молодое_Поколение,вы на каких данных свои скриншоты нафотографировали?
 
Максим Зеленский,

"edges":[{"node":{"id":"2351723699592102345","__typename":"GraphVideo","edge_media_to_caption":{"edges":[{"node":{"text":"\u0414\u0430\u043b \u0434\u0430\u043b \u0443\u0435ba\u043b"}}]}

Вот же, возможно у вас не выполнен вход в инстаграм аккаунт в браузере, и данный паблик закрытый, чтобы получить всю инфу нужно в браузере войти в инсту и подписаться на него. чтобы не запариваться с этим, я прикрепил блокнот со всеми данными, которые я могу получить от туда.
Впитываю знания, как борщ после тренировки ^^)
 
Михаил Л,

На том файле что вы вчера вчера скинули, я сидел разбирался с ним, чтобы понять как PQ читает Json файлы, и пришел к выводу, что данные там упорядочены в кластеры. мне как раз нужно вытащить их
Впитываю знания, как борщ после тренировки ^^)
 
Молодое_Поколение, на основе вашего файла - как дойдете до списка записей - в таблицу, и дальше просто разворачивайте нужное, да и всё.
Код
// data (2)
let
    Source = Json.Document(File.Contents("g:\zelen\Desktop\XLS\data.txt")),
    data1 = Source[data],
    user = data1[user],
    edge_owner_to_timeline_media = user[edge_owner_to_timeline_media],
    edges = edge_owner_to_timeline_media[edges],
    #"Converted to Table" = Table.FromList(edges, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded {0}" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"node"}, {"node"}),
    #"Expanded {0}1" = Table.ExpandRecordColumn(#"Expanded {0}", "node", {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"}, {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"})
in
    #"Expanded {0}1"
F1 творит чудеса
 
Максим Зеленский,

То что нужно. Делаю по вашему примеру свой файл. Данные я получаю из запроса, без блокнота. У меня возникли сложности, где ошибка? Здесь роль источника выполняет custom2 все что выше вспомогательные данные
Код
let
    Таблица_ID = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Таблица_end_cursor = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],

    info = let    

    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Typed  = Table.TransformColumnTypes(Source ,{"Столбец1", type text}),
    Source2 = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    Typed2  = Table.TransformColumnTypes(Source2 ,{"Столбец1", type text}),

    Custom1 = Table.FromColumns({Typed[Столбец1],Typed2[Столбец1]}),
    Custom2 = Table.AddColumn(Custom1, "a", each Json.Document(Web.Contents("https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"))),

    data1 = Source[data],
    user = data1[user],
    edge_owner_to_timeline_media = user[edge_owner_to_timeline_media],
    edges = edge_owner_to_timeline_media[edges],
    #"Converted to Table" = Table.FromList(edges, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded {0}" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"node"}, {"node"}),
    #"Expanded {0}1" = Table.ExpandRecordColumn(#"Expanded {0}", "node", {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"}, {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"})
in
    #"Expanded {0}1"
in
    info
Впитываю знания, как борщ после тренировки ^^)
 
Цитата
Молодое_Поколение написал:
где ошибка?
ошибок у вас целая куча.
  1. Что делают строки 2 и 3 вашего кода?
  2. Обратите внимание, куда ссылается строка 15 кода: она обращается к строке 7. Но там нет столбца [data]. Его пока вообще нигде нет.
  3. Все, что начинается с 15 строки, должно разбирать один JSON. А вы, судя по всему, запросили JSONов по количеству строк в таблицах на листе. Значит, вам надо обрабатывать таким образом каждый ответ.
Попробуйте вот такой вариант (не проверял, ибо)
Код
let    
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Typed  = Table.TransformColumnTypes(Source ,{"Столбец1", type text}),
    Source2 = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    Typed2  = Table.TransformColumnTypes(Source2 ,{"Столбец1", type text}),
 
    Custom1 = Table.FromColumns({Typed[Столбец1],Typed2[Столбец1]}),
    Custom2 = Table.AddColumn(Custom1, "a", each Json.Document(Web.Contents("https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"))),

//это функция разброра одного ответа:
    OneJson = (Response)=>
    let
        data1 = Response[data],
        user = data1[user],
        edge_owner_to_timeline_media = user[edge_owner_to_timeline_media],
        edges = edge_owner_to_timeline_media[edges],
        #"Converted to Table" = Table.FromList(edges, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Expanded {0}" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"node"}, {"node"}),
        #"Expanded {0}1" = Table.ExpandRecordColumn(#"Expanded {0}", "node", {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"}, {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"})
    in
        #"Expanded {0}1",
// это столбец, в котором функция применяется к ответам:
    Result = Table.AddColumn(Custom2, "Result", each OneJson([a]), type table)
in
    Result
Изменено: Максим Зеленский - 13.07.2020 20:11:58
F1 творит чудеса
 
Максим Зеленский, можно ли прописать условие в запросе?

Допустим если typename выдает -  Graphvideo то нужно вытаскивать video_view_count, а если GraphImage то edge_liked_by? Такое возможео?
Впитываю знания, как борщ после тренировки ^^)
 
Код
let
    Source =  let
                 a = (a) => 
                     List.Transform(
                         Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1], 
                         Text.From
                     )
              in
                 Table.FromColumns({a("Таблица1"), a("Таблица2")}),
    Custom1 = Table.AddColumn(
                  Source, 
                  "a", 
                  each let
                      json      = Json.Document(Web.Contents(
                                      "https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variabl...; & 
                                      [Column1]& """,""first"":12,""after"":""" & [Column2] & """}"
                                  )),
                      tbl       = Table.FromRecords(
                                      List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each [node]?), 
                                      null, 
                                      2
                                  ),
                      transform = Table.ReplaceValue(tbl, null, null, 
                                      (a, b, c) => let
                                          a = if a is record 
                                                  then Record.ToList(a){0} 
                                                  else a,
                                          b = if a is list
                                              then if a{0}[node]? <> null
                                                  then a{0}[node][text]
                                                  else Table.FromRecords(a)
                                              else a
                                      in
                                          b, 
                                      {"edge_media_to_caption", "edge_media_to_comment", "edge_media_preview_like", "owner", "thumbnail_resources"}
                                  ),
                      expand    = Table.ExpandRecordColumn(transform, "dimensions", {"height", "width"}, {"dimensions.height", "dimensions.width"}),
                      expand1   = Table.ExpandTableColumn(expand, "thumbnail_resources", 
                                      {"src", "config_width", "config_height"}, 
                                      {"thumbnail_resources.src", "thumbnail_resources.config_width", "thumbnail_resources.config_height"}
                                  )
                  in
                      if Table.RowCount(tbl) > 0 then expand1 else tbl
              ),
    Custom2 = Table.Combine(
                  Table.ReplaceValue( Custom1, each [Column1], each [Column2], 
                      (a, b, c) => Table.AddColumn(Table.AddColumn(a, "ID", each b), "after", each c), 
                      {"a"}
                  )[a]
              )
in
    Custom2
 
Андрей Лящук, спасибо большое Андрей :) , иду разбираться с запросом
Впитываю знания, как борщ после тренировки ^^)
 
Андрей Лящук,

Посидел разобрался. У меня возникло три вопроса:

1. Можно реализовать полученные данные для одного пользователя, в одну строку? (то есть 50 публикаций в одну строку, в примере на Листе1 как нужно, на Листе2 как сейчас есть)
2. Как реализоваться выбор данных при условии? Допустим если мы разбираем первый кластер и он GraphImage то берем одни данные, если это GrahpVideo то другие и тд? Я накидал пример, но не знаю куда это вставлять
3.  Есть два вида GraphVideo, у одного есть product_type у другого нету, как сделать чтобы различал два типа?

Выбор данных при условии:
Код
if typename = "GraphVideo" (product_type) then 

   ( "typename" = "GraphVideo"
   "id",
   "shortcode",
   "edge_media_to_caption":{"edges":[{"node":{"text":""}}]},
   "edge_media_to_comment":{"count":},
   "comments_disabled",
   "taken_at_timestamp",
   "edge_media_preview_like":{"count":}
   "location",
   "thumbnail_src",
   "product_type",
   "title",
   "video_duration",
   "video_view_count" )

if typename = "GraphImage" then 

   ( "typename" = "GraphVideo",
   "id",
   "shortcode",
   "accessibility_caption",
   "edge_media_to_caption",
   "edge_media_to_comment",
   "comments_disabled",
   "taken_at_timestamp",
   "edge_media_preview_like",
   "location",
   "thumbnail_src" )

if typename = "GraphVideo" then 

   ( "__typename",
   "id",
   "shortcode",
   "edge_media_to_caption",
   "edge_media_to_comment",
   "comments_disabled",
   "taken_at_timestamp",
   "edge_media_preview_like",
   "location",
   "thumbnail_src",
   "video_view_count" )

if typename = "GraphSidecar" then 

   ( "__typename",
   "id",
   "shortcode",
   "edge_media_to_caption",
   "edge_media_to_comment",
   "comments_disabled",
   "taken_at_timestamp",
   "edge_media_preview_like",
   "thumbnail_src" )

Впитываю знания, как борщ после тренировки ^^)
 
вариант со сводной по модели данных
Код
// Запрос1
let
    Source =  let
                 a = (a) => 
                     List.Transform(
                         Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1], 
                         Text.From
                     )
              in
                 Table.FromColumns({a("Таблица1"), a("Таблица2")}),
    Custom1 = Table.AddColumn(
                  Source, 
                  "a", 
                  each let
                      json      = Json.Document(Web.Contents(
                                      "https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"
                                  )),
                      tbl       = Table.FromRecords(
                                      List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each [node]?), 
                                      null, 
                                      2
                                  ),
                      transform = Table.ReplaceValue(tbl, null, null, 
                                      (a, b, c) => let
                                          a = if a is record 
                                                  then Record.ToList(a){0} 
                                                  else a,
                                          b = if a is list
                                              then if a{0}[node]? <> null
                                                  then a{0}[node][text]
                                                  else Table.FromRecords(a)
                                              else a
                                      in
                                          b, 
                                      {"edge_media_to_caption", "edge_media_to_comment", "edge_media_preview_like", "owner", "thumbnail_resources"}
                                  ),
                      expand    = Table.Buffer(Table.ExpandRecordColumn(transform, "dimensions", {"height", "width"}, {"dimensions.height", "dimensions.width"})),
                      grouped   = Table.Group(expand,"__typename",{"a",each Table.AddIndexColumn(_,"i")})[a]
                  in 
                      if Table.RowCount(tbl) > 0 then Table.Combine(grouped) else #table({},{}) 
              ),
    Custom2 = Table.Combine(
                  Table.ReplaceValue( Custom1, each [Column1], each [Column2], 
                      (a, b, c) => Table.AddColumn(Table.AddColumn(a, "ID", each b), "after", each c), 
                      {"a"}
                  )[a]
              ),
    Typed   = Table.TransformColumnTypes(Custom2,{{"i", Int64.Type}}),
    Unpivot = Table.UnpivotOtherColumns(Typed, {"ID", "after", "__typename","i"}, "Атрибут", "Значение")
in
    Unpivot
Изменено: Андрей Лящук - 15.07.2020 04:53:50
 
Андрей Лящук,

Очень нравится ваша работа, спасибо! :)

Есть пару нюансов
1. Можно сделать данные в одну строку для одного аккаунта? Это очень нужно... желаемый результат на Листе1
2. Подскажите пожалуйста, почему нет значений в для Id 1901233123 GraphVideo - video_view_count, прикрепляю скрин.
 
Впитываю знания, как борщ после тренировки ^^)
 
Запрос для сводной

Запрос с объединением в одну запись
Изменено: Андрей Лящук - 17.07.2020 03:29:52
 
Спасибо за помощь!  я с утра гляну и отпишусь  
Впитываю знания, как борщ после тренировки ^^)
 
Андрей Лящук,

Спасибо большое!
Уже есть с чем работать!
Скорей всего в процессе использования данного запроса возникнут вопросы , но сейчас их нет  :)  
Изменено: Молодое_Поколение - 16.07.2020 12:58:07
Впитываю знания, как борщ после тренировки ^^)
Страницы: 1
Наверх