Страницы: 1 2 След.
RSS
PQ, получить таблицу с сайта
 
Доброго времени суток!
Прошу помочь со следующим вопросом:
С помощью Power Query попытался импортировать таблицу с данными погоды по часам с сайта, но не получается

Шаги в Excel следующие:
1.Данные
2.Из интернета
3.Вбиваю адрес www.wunderground.com/history/daily/ru/yekaterinburg/USSS/date/2018-11-20
4.Анонимно
и никакой таблицы там нет, а с сайта нужна приложенная табличка.
Office 365 версия 1910(12130,20410), Win10.
Изменено: Lari - 25.11.2019 11:17:32
 
Боюсь что никак, эта табличка формируется скриптами на странице, в коде страницы ничего похожего на неё не нашел.
Вот горшок пустой, он предмет простой...
 
PooHkrd, большое спасибо, я уже голову сломал, что делаю не так.
 
Lari, можете связаться с администрацией ресурса на предмет наличия у них API получения от них информации автоматизированными средствами по запросу. Но если такое у них есть, то вряд ли это бесплатно.
Вот горшок пустой, он предмет простой...
 
Вроде VBA справляется. Только отсортировать нужное.
Код
Sub WunderHrunder()
Dim XMLHTTP As Object
Dim Myurl$, Txt$
Myurl = "https://api.weather.com/v1/location/USSS:9:RU/observations/historical.json?apiKey=6532d6454b8aa370768e63d6ba5a832e&units=e&startDate=20181120"
Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
XMLHTTP.Open "GET", Replace(Myurl, "\", "/"), False
XMLHTTP.send
If XMLHTTP.statustext = "OK" Then
    Txt = XMLHTTP.responseText
    Debug.Print Txt
Else
    MsgBox "Отсутствует соединение..."
End If
Set XMLHTTP = Nothing
End Sub

Ссылка
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Доброе время суток
Цитата
Alemox написал:
Вроде VBA справляется
Так Power Query по такой ссылке отработает. Только вот как долго ключ будет жить?
 
Андрей VG, ну, можно наверное этот ключ спарсить из кода страницы, а потом уже лезть по этой ссылке?
Вот горшок пустой, он предмет простой...
 
Да, можно поковыряться может и валяется где он.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox написал:
Да, можно поковыряться может и валяется где он.
В таком виде валяется
apiKey=6532d6454b8aa370768e63d6ba5a832e&
 
Alemox, наковырял вроде.
Lari, вот так вроде работает:
Код
let
    Token = Text.BetweenDelimiters( Text.FromBinary(Web.Contents("https://www.wunderground.com/history/daily/ru/yekaterinburg/USSS/date/2018-11-20")), "SUN_API_KEY&q;:&q;", "&q;,&q;SUN_DEVICE_API_KEY" ),
    Source = Json.Document(Web.Contents("https://api.weather.com/v1/location/USSS:9:RU/observations/historical.json?apiKey=" & Token & "&units=e&startDate=20181120")),
    observations = Table.FromRecords( Source[observations] )
in
    observations
Вот горшок пустой, он предмет простой...
 
PooHkrd,что-то у меня с разрешениями беда
 
Сделайте вот так и попробуйте повторно.
Вот горшок пустой, он предмет простой...
 
 PooHkrd, табличку загрузил, градусы кажется по фаренгейту , а со временем не разобрался, когда в PQ меняю формат, выдает ошибку.
В excel тоже менял формат, не помогло. в гугле тоже не расшифровал.
Если с этим сайтом так криво получается может стоить мне поискать сайт с менее сложными скриптами, т.к. эта таблица значительно отличается от той что я приложил в начале этой темы.
 
Изменено: Lari - 25.11.2019 15:34:52
 
Lari, даты и время в Unix формате. надо только формулу подобрать. Здесь есть формулы
Изменено: artyrH - 25.11.2019 15:48:17
 
Это не совсем время, это так называемый TIMESTAMP. Переводится в привычный вам формат простой формулой:
Код
= #datetime(1970,1,1,0,0,0)+#duration(0,0,0,[expire_time_gmt])

А фаренгейты в цельсий перводить так:
Код
Celcius = ([Fahrenhiet]-32) * 0.5556
Изменено: PooHkrd - 25.11.2019 15:49:50
Вот горшок пустой, он предмет простой...
 
PooHkrd, artyrH, большое спасибо за помощь и уделенное время. Узнал для себя новое.
Но если не затруднит, не могли бы вы немного объяснить магию из сообщения #10 PooHkrd
 
Lari, а вы доделали остальное?
типа так должно быть
Код
let
    Token = Text.BetweenDelimiters( Text.FromBinary(Web.Contents("https://www.wunderground.com/history/daily/ru/yekaterinburg/USSS/date/2018-11-20")), "SUN_API_KEY&q;:&q;", "&q;,&q;SUN_DEVICE_API_KEY" ),
    Source = Json.Document(Web.Contents("https://api.weather.com/v1/location/USSS:9:RU/observations/historical.json?apiKey=" & Token & "&units=e&startDate=20181120")),
    observations = Table.FromRecords( Source[observations] ),
    #"Renamed Columns" = Table.RenameColumns(observations,{ {"expire_time_gmt", "1"}, {"temp", "2"}, {"dewPt", "3"}, {"rh", "4"},{"wdir_cardinal", "5"},{"wspd", "6"},{"gust", "7"}, {"pressure", "8"}, {"precip_total", "9"}, {"wx_phrase", "10"}}),
    #"Reordered Columns" = Table.SelectColumns(#"Renamed Columns",{ "1", "2", "3","4", "5", "6", "7", "8", "9", "10"}),
    #"Replaced Value" = Table.ReplaceValue(#"Reordered Columns",null,0,Replacer.ReplaceValue,{"7", "9"}),
    #"Rounded Off" = Table.TransformColumns(#"Replaced Value",{{"1", each #datetime(1970,1,1,0,0,0)+#duration(0,0,0,(_)), type datetime}, {"2", each Text.From(Number.Round((Number.From(_)-32) * 0.5556, 0)) & "*C", type text},{"3", each Text.From(Number.Round((Number.From(_)-32) * 0.5556, 0)) & "*C", type text},{"4", each Text.From(_)&"%", type text}, {"6", each Text.From(Number.RoundUp(Number.From(_)*1.609))&" km/h", type text}, {"7", each Text.From(Number.RoundUp(Number.From(_)*1.609))&" km/h", type text}, {"9", each Text.From(Number.RoundUp(Number.From(_)*1.609))&" km/h", type text}, {"8", each Text.From(Number.Round(Number.From(_)*33.86625725,2))&" hPa", type text}})
in
    #"Rounded Off"
 
Цитата
Lari написал:
объяснить магию
Там ловкость рук и никакого мошенства. Для начала товарищ Alemox в своем макросе показал с какого сайта ваш сайт реально берет данные для заполнения таблицы, которую вы хотели с него утащить. Как он вытащил параметры строки запроса не знаю, из кода страницы я видел что по факту погода берется с api.weather.com но как составить запрос не нашел - опыта мало.
Главным неизвестным параметром для запроса является token который формирует сайт wunderground чтобы получить данные с погоды.ком. Этот токен является ключом, который действует ограниченное время, и постоянно тащить с погоды.ком данные по одному и тому же ключу не получится.
Поэтому в первом шаге мы получаем из кода страницы актуальный на данный момент токен, потом подсовываем его погоде.ком, та думает что это к ней лезет wunderground и отдает в ответе таблицу в формате JSON, дальше мы этот ответ расшифровываем и собираем в таблицу.
Вот горшок пустой, он предмет простой...
 
artyrH,нет, я итоговый код не делал и не смог бы сделать. Большое спасибо за конечный код.
PooHkrd, в сообщении #10 в строке 2 я так понял что токен всегда обрамлен
слева "SUN_API_KEY&q;:&q;" и справа "&q;,&q;SUN_DEVICE_API_KEY".
я проверил на других датах, везде так обрамляется.
Как вы получаете в строке 3 то что слева и справа от токена, я не понял. Или вы это взяли по аналогии из макроса из #5 ?
Изменено: Lari - 26.11.2019 14:42:23
 
Цитата
Lari написал:
Или вы это взяли по аналогии из макроса из #5
Именно, я же прямо об этом написал, что если бы не Alemox то ничего остального сделать лично у меня не получилось бы.
Вот горшок пустой, он предмет простой...
 
Alemox,не подскажете, как вы получили адрес из 4-й строки #5?
 
Lari, попробуйте так: перейти по ссылке из #1. нажмите  Ctrl + U. затем нажмите Ctrl + F и в поиске введите apiKey
 
artyrH, так я получаю токен, но не сайт куда его вводить. (слово токен узнал из этой темы:-) )
а как узнать куда его вставлять?
 
Цитата
Lari написал:
сайт куда его вводить
эта часть статична. за  исключением этого - USSS:9:RU
Код
https://api.weather.com/v1/location/USSS:9:RU/observations/historical.json?apiKey=
и эта, кроме текста даты
Код
&units=e&startDate=20181120
с токеном и собирается полный адрес
Изменено: artyrH - 26.11.2019 16:30:03
 
artyrH,статично, но хотелось бы понимать откуда и как это берется.
 
Цитата
Lari написал:
подскажете, как вы получили адрес из 4-й строки #5
Добрый вечер.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox,большое спасибо, разбираю.
 
Заметил закономерность, что в нетворке нужно найти строчку , начинающуюся с historical.
Возможно ли автоматизировать вход на страничку, вход в нетворк, поиск historical, проход по ссылке и копирование данных?
 
 
Получайте код страницы через Text.FromBinary(Web.Contents( ссылка )) и ищите в этом тексте что хотите. Если в нем нет, то боюсь что вряд ли.
Вот горшок пустой, он предмет простой...
 
PooHkrd,ссылка, которую я получаю в нетворке в historical нет в коде страницы.
Вопрос всем,можно через VBA это можно сделать?

О, кстати, за неделю apikey не поменялся
Получается в ссылке меняется только часть с кодом города и датой
А в PQ возможны циклы или  это уже в VBA?
Изменено: Lari - 05.12.2019 12:26:14
Страницы: 1 2 След.
Наверх