Страницы: 1
RSS
Объединение двух запросов PQ в один
 
Приветствую всех!

Есть два запроса, первый получает данные с инстаграма, на основании этих данных выполняется второй запрос. Это съедает очень много памяти и времени.

Для второго запроса источники находятся на Листе1 - Таблица5 и Таблица6. Необходимо чтобы вместо Таблицы5 - данные брались из 1 запроса ( Столбец W - "ID аккаунта"). Вместо Таблицы6 данные должны подтягиваться со столба AI (лист - Желаемый результат) - выделено красным..... столбец AI добавлен в ручную - как для него реализовать простейшую функцию, с помощью PQ? То есть необходимо добавить функцию "если" в 1 запрос - это и будет служить заменой таблицы6
Код
=ЕСЛИ(AG4<>"";AG4;AH4)
Второй запрос удаляет строки если в них пустые значения или ошибки - нужно чтобы они оставались, то есть если нет данных строки не съезжали

Для чего это нужно?
Инстаграм иногда блокирует сессию за большое количество запросов, и чтобы не делать два запроса - делаем один, тем самым оберегаем себя от бана :)

С первым запросом помог Михаил Л, со вторым Андрей Лящук - за что я им благодарен 8)
Впитываю знания, как борщ после тренировки ^^)
 
Молодое_Поколение,  сделал через megre предварительно взяв id и аккаунты с первого листа.
 
Saff, получается вы навели косметический ремонт ?  :)  Спасибо!

К сожалению это не решает проблемы
Впитываю знания, как борщ после тренировки ^^)
 
Если будет иной результат, мне будет интересно увидеть данное решение. По вашей постановке задачи я так это себе понял и реализовал.
Добавил косметический ремонт в данном файле.  
 
Saff, будем вместе ждать ответа :)  
Впитываю знания, как борщ после тренировки ^^)
 
Может советом кто-то поможет ?
Впитываю знания, как борщ после тренировки ^^)
 
Молодое_Поколение, вообще ни разу не понятно, что нужно
Цитата
Молодое_Поколение написал:
Второй запрос удаляет строки если в них пустые значения или ошибки - нужно чтобы они оставались
Если проблема только в этом то это можно решить так
Код
let
    Source =  let
                 a = (a) => 
                     List.Transform(
                         Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1], 
                         Text.From
                     )
              in
                 Table.FromColumns({a("Таблица5"), a("Таблица6")}),
    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"":50,""after"":"""&[Column2]&"""}"
                                  )),
                      tbl       = Table.Combine(
                                      List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each Table.FromRecords({[node]?}))
                                  ),
                      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"}),
                      columns   = List.Buffer(Table.ColumnNames(expand)),
                      indexed   = Table.ToRecords(Table.AddIndexColumn(expand,"i")),
                      records   = List.Transform(indexed,(r)=>Record.RenameFields(Record.RemoveFields(r,"i"),List.Zip({columns,List.Transform(columns, each Text.From(r[i])&"|"&_)})))
                  in 
                      if Table.RowCount(tbl) > 0 then Table.FromRecords({Record.Combine(records)}) else #table({"dummy"},{{null}})
              ),
    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]
              ),
    Demote  = Table.DemoteHeaders(Table.RemoveColumns(Custom2,{"dummy"},2)),
    Transp  = Table.Transpose(Demote),
    Split   = Table.SplitColumn(Transp, "Column1", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), 2),
    Replace = Table.ReplaceValue(Split,"id","ID публикации",Replacer.ReplaceValue,{"Column1.2"}),
    Result  = Table.Transpose(Replace)
in
    Result
 
Андрей Лящук,

Нужно:
1.  Для запроса "Начало" добавить столбец с функцией если - бывает нужное мне значение или в столбце end_cursor2 или end_cursor1
Код
ЕСЛИ("end_cursor2"="null","end_cursor1";"end_cursor2")

2. В запросе "Завершение" вместо таблицы5 - данные нужно получать из столбца "ID аккаунта", вместо таблицы6 из добавленного столбца ( 1 пункт )
Код
Table.FromColumns({a("Таблица5"), a("Таблица6")}),


3. Объединить два запроса "Начало" и "Завершение", чтобы был 1 запрос.
Впитываю знания, как борщ после тренировки ^^)
 
Скрытый текст
Изменено: Андрей Лящук - 20.07.2020 10:11:02
 
Андрей Лящук, Спасибо большое! :)  Дай ВАМ бог крепкого здоровья!

Подскажите, а как в данном запросе работает end cursor? значения берутся из одного столбца? Просто бывает так что значение или в end_cursor2 или в end_cursor1,

Правильно ли я понимаю, что теперь запрос один раз подключается к серверу инстаграмма? По логике вещей прошлый раз было два подключения, сейчас один, соответственно меньше тратится памяти, и инстаграм на нас не ругается что слишком часто к нему подключаемся?
Впитываю знания, как борщ после тренировки ^^)
 
Цитата
Молодое_Поколение написал:
как в данном запросе работает end cursor?
берется первое непустое значение из списка
Код
{user[edge_owner_to_timeline_media][page_info][end_cursor],
 user[edge_felix_video_timeline][page_info][end_cursor]}
Цитата
Молодое_Поколение написал:
Правильно ли я понимаю, что теперь запрос один раз подключается к серверу инстаграмма
нет, для каждой строки из таблицы ЗП_ССЫЛКИ выполняется 2 get запроса
Чтобы запросы были не слишком частыми можно использовать Function.InvokeAfter для задержки между обращениями к серверу
 
Андрей Лящук, понял, спасибо - то есть единственное что тут можно ещё сделать это задержку поставить... пока без неё буду работать ! Спасибо вам большое !
Впитываю знания, как борщ после тренировки ^^)
 
Андрей Лящук,

Андрей при переносе запроса в рабочий файл выдает ошибку
Цитата
DataSource.Error: Web.Contents не удалось получить содержимое из "https://www.instagram.com/mir.razvrata/?__a=1&quot; (404): Not Found
Сведения:
   DataSourceKind=Web
   DataSourcePath=https://www.instagram.com/mir.razvrata
   Url=https://www.instagram.com/mir.razvrata/?__a=1
В данной ситуации инстаграм аккаунт mir.razvrata, заблокирован инстаграмом и поэтому весь запрос выдает ошибку. Нужно чтобы запрос игнорировал такие аккаунты - просто пустые строки

Прикрепил файл, желтым выделены заблокированные аккаунты
Изменено: Молодое_Поколение - 20.07.2020 17:24:31
Впитываю знания, как борщ после тренировки ^^)
 
как-то так
Скрытый текст
Изменено: Андрей Лящук - 20.07.2020 18:56:40
 
Андрей Лящук,

Сначала такую ошибку выдает
Цитата
DataSource.Error: Загружены данные в формате HTML, а это не тот тип, который ожидался. Возможно, этот URL-адрес неверен, либо вы не указали правильные учетные данные для сервера.
Затем нажимаю "обновить предварительный просмотр", эта ошибка пропадает, появляется эта
Цитата
Expression.Error: Поле "graphql" записи не найдено.
Впитываю знания, как борщ после тренировки ^^)
 
видимо уперлись в ограничение по количеству/частоте запросов, у меня запрос
Код
let
    Source= Table.AddColumn(
        Excel.CurrentWorkbook(){[Name = "ЗП_ССЫЛКИ"]}[Content],
        "  ",
        each Json.Document(Web.Contents("https://www.instagram.com/" & [Столбец1] & "/?__a=1"))
    )
in
    Source
выдает ошибку на всех строках
Цитата
В запросе "" произошла ошибка. DataFormat.Error: В конце входного JSON-файла были обнаружены лишние символы.
Сведения:
   Value=
   Position=0
получилось победить только после копирования заголовков запроса и частично печенек (нужны только csrftoken и sessionid) из браузера
Код
let
    Source= Table.AddColumn(
        Excel.CurrentWorkbook(){[Name = "ЗП_ССЫЛКИ"]}[Content],
        "  ",
        each Json.Document(Web.Contents("https://www.instagram.com/" & [Столбец1] & "/?__a=1", [Headers=[
            Cookie="csrftoken=FuHJ2oE4Ew4mQm2SZYkzBnWqCTyWJynK; sessionid=8560511502%3Aq9GejLj90wiJ7R%3A16"
        ],ManualStatusHandling={404}]))
    )
in
    Source
Изменено: Андрей Лящук - 20.07.2020 21:18:09
 
Скрытый текст
 
Андрей Лящук, Возможно, завтра попробую еще раз а вот с куки что-то не так пошло
Цитата
Expression.Error: Заголовок "Cookie" поддерживается только при анонимном подключении. Эти заголовки могут использоваться во всех типах проверки подлинности. Accept, Accept-Charset, Accept-Encoding, Accept-Language, Cache-Control, Content-Type, If-Modified-Since, Prefer, Range, Referer
Впитываю знания, как борщ после тренировки ^^)
 
Андрей Лящук, попробовал с утра, такая же ошибка

может дело в этом?
Код
 bin       = Web.Contents("https://www.instagram.com/" & _ & "/?__a=1", [ManualStatusHandling={404}]),
Тут как-то странно "& _ &"  
Код
let
  Source    = Excel.CurrentWorkbook(){[Name = "ЗП_ССЫЛКИ"]}[Content],
  Custom1   = Table.Combine(
                  List.Transform(
                      Source,
                      each let
                          bin       = Web.Contents("https://www.instagram.com/"&[Column1]&"/?__a=1", [ManualStatusHandling={404}]),
                          json      = Json.Document(bin),
                          user      = json[graphql][user],
                          rec       = [
                                          #"Публикации" = user[edge_owner_to_timeline_media][count],
                                          #"Подписчики" = user[edge_followed_by][count],
                                          #"Подписки" = user[edge_follow][count],
                                          #"Биография" = user[biography],
                                          #"Сайт" = user[external_url],
                                          #"Полное имя" = user[full_name],
                                          #"Приватный аккаунт" = user[is_private],
                                          #"Аватарка HD" = user[profile_pic_url_hd],
                                          #"Количество хайлайтов" = user[highlight_reel_count],
                                          #"Подтвержденный аккаунт" = user[is_verified],
                                          #"Количество IGTV" = user[edge_felix_video_timeline][count],
                                          #"показывать ли рекомендованные вам чужие профили" = json[show_suggested_profiles],
                                          #"показывать ли кнопку Follow" = json[show_follow_dialog],
                                          #"Заблокировали ли вы текущий просматриваемый профиль" = user[blocked_by_viewer],
                                          #"речь о каких-то ограничениях, но не очень понятно о каких" = user[restricted_by_viewer],
                                          #"блокировка по стране" = user[country_block],
                                          #"фолловите ли вы тот аккаунт, который просматриваете" = user[followed_by_viewer],
                                          #"фолловит ли вас тот аккаунт, который вы просматриваете" = user[follows_viewer],
                                          #"has ar effects" = user[has_ar_effects],
                                          #"has channel" = user[has_channel],
                                          #"Заблокированы ли вы текущиМ просматриваемым профилем" = user[has_blocked_viewer],
                                          #"запросил ли тот аккаунт, который вы смотрите, у вас добавление в друзья" = user[has_requested_viewer],
                                          #"ID аккаунта" = user[id],
                                          #"Бизнес аккаунт" = user[is_business_account],
                                          #"недавно присоединился к инстаграм" = user[is_joined_recently],
                                          #"Имя бизнес категории" = user[business_category_name],
                                          #"Раздел бизнес категорий" = user[overall_category_name],
                                          #"ID бизнес категории" = user[category_enum],
                                          #"Общие подписчики" = user[edge_mutual_followed_by][count],
                                          #"запросили ли вы у аккаунта, который смотрите, добавление в друзья" = user[requested_by_viewer],
                                          #"Никнейм" = user[username],
                                          #"Подключенный к аккаунту фейсбука" = user[connected_fb_page],
                                          #"end cursor" = List.RemoveNulls(
                                                              {user[edge_owner_to_timeline_media][page_info][end_cursor],
                                                               user[edge_felix_video_timeline][page_info][end_cursor]}
                                                          ){0}?
                                      ],
                          json1     = Json.Document(Web.Contents(
                                          "https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&rec[ID аккаунта]&""",""first"":50,""after"":"""&rec[end cursor]&"""}"
                                      )),
                          tbl       = Table.Combine(
                                          List.Transform(json1[data][user][edge_owner_to_timeline_media][edges], each Table.FromRecords({[node]?}))
                                      ),
                          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"}),
                          columns   = List.Buffer(Table.ColumnNames(expand)),
                          indexed   = Table.ToRecords(Table.AddIndexColumn(expand,"i")),
                          records   = List.Transform(indexed,(r)=>Record.RenameFields(Record.RemoveFields(r,"i"),List.Zip({columns,List.Transform(columns, each Text.From(r[i])&"|"&_)}))),
                          combined  = if Value.Metadata(bin)[Response.Status]=400 then {[Никнейм=_,error=404]} else if rec[ID аккаунта]=null or rec[end cursor]=null then {rec} else if Table.RowCount(tbl)>0 then {Record.Combine({rec}&records)} else {rec}
                      in
                          Table.FromRecords(combined)
                  )
              ),
  Demote    = Table.DemoteHeaders(Custom1),
  Transp    = Table.Transpose(Demote),
  Split     = Table.SplitColumn(Transp, "Column1", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), 2),
  Replace   = Table.ReplaceValue(Split,"id","ID публикации",Replacer.ReplaceValue,{"Column1.2"}),
  Result    = Table.Transpose(Replace)

in
  Result

Мне кажется мы на правильном пути, Сдвинулись с мертвой точки, теперь такую ошибку выдает
Цитата
Expression.Error: Не удается преобразовать значение типа Table в тип List.
Сведения:
   Value=[Table]
   Type=[Type]
Изменено: Молодое_Поколение - 21.07.2020 09:53:17
Впитываю знания, как борщ после тренировки ^^)
 
Цитата
Молодое_Поколение написал:
Сдвинулись с мертвой точки,
Ниче не знаю про вашу мертвую точку, у меня все работает, запрос из #17 со свежими куки
 
Андрей Лящук, Тут второй части запроса нету у меня грузится только 34 столбца, Куки нужно каждый раз ставить новые?
Впитываю знания, как борщ после тренировки ^^)
 
Андрей Лящук, Добрый день!

Я разобрался почему инста банила, потому что задержки не было, сейчас я добавил функцию инвок с задержкой 5секунд на второй части запроса.
Гляньте пожалуйста, мой ip видимо временно забанен, не работает вообще запрос
Изменено: Молодое_Поколение - 22.07.2020 12:06:34
Впитываю знания, как борщ после тренировки ^^)
 
Андрей Лящук, помогите, почему по коду #17 не отображается вторая часть запроса? пример #21
Впитываю знания, как борщ после тренировки ^^)
Страницы: 1
Наверх