Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Power query: импорт данных из интернета по списку сайтов
 
Уважаемые коллеги!
Подскажите, пожалуйста, как решить проблему...скорее всего кто-нибудь делал нечто подобное...
Полагаю, что PQ подходит для этого.

Необходимо с сайта http://www.zakupki.gov.ru по конкретным номерам закупок импортировать данные журнала изменений в эксель.
страница для примера: http://www.zakupki.gov.ru/epz/order/notice/ea615/view/event-journal.html?regNumber=20617000001180010... где после regNumber= указан номер закупки.
С импортом данных из одной страницы проблем не возникает, а вот если их много, то не совсем понятно как это сделать.
 
Вы так это себе видите?
 
PooHkrd, да...что-то типа )
спасибо )

правда проблема в том, что при большом количестве закупок (например 50) запрос зависает...полагаю, что происходит это из-за каких-то ошибок...
нет ли в PQ какого-нибудь аналога On error resume next, чтобы ошибки просто пропускались?
 
Предлагаю ознакомиться с параметрами функции Web.Contents. Попробуйте побаловаться с параметром Timeout. Если проблема в долгой отдаче со стороны сервера, то уменьшая это время вы уменьшаете время ожидания запроса к сайту. По умолчанию стоит параметр 100 сек. А еще рекомендую пообщаться с тех.поддержкой сайта на тему не блочит ли вас ихний файрвол при попытке такого количества обращений в малый промежуток времени. Вас могут воспринимать как попытку DDOS.
 
PooHkrd,
добавил параметр Timeout с длительностью 3 сек
Источник = Web.Page(Web.Contents("http://zakupki.gov.ru/223/purchase/public/purchase/info/journal.html?regNumber="&Но...,  [Timeout=#duration(0, 0, 0, 3)]))

теперь при вызове функции в конструкторе запросов работает быстро, но если возникает какая-то ошибка, то на стадии развёртывания столбцов таблица заканчивается на первой ошибке...например если всего закупок 50, а на 35 произошла какая-то ошибка загрузки данных, то итоговая таблица заканчивается на 35 закупке...

можно ли как-то сделать так, чтобы возникающая ошибка игнорировалась, и выгрузка происходила без неё?
 
В вызове функции попробуйте использовать конструкцию
try function otherwise null
 
PooHkrd, спасибо )

сейчас в редакторе всё нормально выводится, а вот если нажать "Закрыть и загрузить", то на листе экселя получаются либо неполные данные, либо вообще ничего не выводится...
 
не могу понять в чём дело...то работает, то не работает, то выборочно работает...может ещё какие-нибудь параметры нужно указать в запросе?
 
Ezoptron, а чего Вы хотели? Чтобы zakupki.gov.ru стабильно работали? У нас тут Планета Эксель, а не Фантлаб :)
 
StoTisteg, ну понятное дело, что они могут нестабильно работать )
просто я понять не могу в чём косяк...может в самом запросе нужно какой-нибудь ещё параметр указать? в PQ я вообще ламер )
 
Чтобы понять нужно тестировать как минимум 2 разных варианта получения данных по одному и тому же списку, например, через PQи через VBA, если глючат оба варианта - общайтесь с админами сайта (хотя нулевой результат такого общения в принципе предсказуемый).
 
PooHkrd, мне кажется, что нужно в запросе что-то добавить. Пытался в инете что-нибудь найти, но предлагаемые возможные решения как-то не заработали...
к сожалению, в PQ нет возможности пошагово посмотреть как он работает и что делает...
 
Когда вы создаете столбец то по факту вы практически одновременно закидываете на сайт запросов равное количеству строк в таблице, возможно было бы правильнее вызвать эту функцию через Table.TransformColumns, тогда, я так подозреваю, PQ их должен будет посылать по очереди, а не скопом. Чуть позже попробую - сейчас нет возможности.
 
PooHkrd, тогда уж через List.Accumulate или List.Generate с использованием Funtcion.InvokeAfter с установкой задержки вызова. Но и там надо тестировать
F1 творит чудеса
 
Цитата
PooHkrd написал:
возможно было бы правильнее вызвать эту функцию через Table.TransformColumns
Попробовал - не помогло.
Цитата
Максим Зеленский написал:
с использованием Funtcion.InvokeAfter
тоже попробовал - аналогично  :(
Цитата
Максим Зеленский написал:
тогда уж через List.Accumulate или List.Generate
Table.TransformColumns как я понимаю по сути, аналогична List.Transform, почему вы считаете что ваше предложение должно сработать? Я просто с этими функциями пока не очень дружу, прям щас на коленке вариант запроса не на строчу.
 
Цитата
PooHkrd написал:
>>Максим Зеленский: тогда уж через List.Accumulate или List.Generate<<
Table.TransformColumns как я понимаю по сути, аналогична List.Transform, почему вы считаете что ваше предложение должно сработать?
Но List.Generate или List.Accumulate может спокойно ждать ответ, например, перед каждым следующим циклом. А TransformColumns и List.Transform не будут этого делать, так как там порядок обработки элементов вообще неизвестен заранее
Что-то вроде такого:
Код
=List.Accumulate(список_url, {}, (s,c)=>s & Function.InvokeAfter( ()=>Web.Contents(c), #duration(0,0,0,10)))
F1 творит чудеса
 
Цитата
Ezoptron написал: не могу понять в чём дело..
Максим Зеленский, не могли бы вы в файле подправить запрос?  )
 
Ezoptron,
вроде ж всё понятно написал :)
Код
F1 творит чудеса
 
Соответственно каждый запрос отправляется с задержкой в 3 секунды. 50 запросов = 150+ секунд на выполнение
F1 творит чудеса
 
спасибо большое )
запрос работает...правда только в редакторе...при выгрузке на лист почему-то выдаётся ошибка DataSource.Error
 
Судя по всему, там срабатывает таймаут при загрузке некоторых страниц. Что с ними делать при этом? Например, пропускать, если страница не загрузилась за N секунд. Или упороно продолжать пытаться ее загрузить?
F1 творит чудеса
 
Максим Зеленский, если страница не загрузилась за N секунд, то её нужно пропустить.
Страницы: 1
Читают тему (гостей: 1)
Наверх