Страницы: 1
RSS
Как скачатьть файл из интернета с помощью VBA?
 
Как скачать файл с сайта (downloader) без открытия и сохранить его в нужной папке без возникновения меню "открыть/сохранить"  
Нагуглить по форуму и вне по этому вопросу не удалось
 
Общее решение состоит в том, что есть функция в VBA - Shell() - запускает любую программу в винде.    
Выбираете менеджер закачек с поддержкой командной строки и формируете эту строку в VBA. Грубо говоря так:  
comString="путь_к_донлоадеру\имя_донлоадера.ехе" & "набор ключей"  
ans=Shell(comString)
Bite my shiny metal ass!      
 
Все делается очень просто при использовании API-функции URLDownloadToFile  
 
Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long  
 
Function DownLoadFile(FromPathName As String, ToPathName As String) As Boolean  
   DownLoadFile = URLDownloadToFile(0, FromPathName, ToPathName, 0, 0) = 0  
End Function  
 
Sub Main()  
   Dim ссылка As String, Filename As String  
   Link = "http://titan-pro.org/titan-pro.org_ДАТА.rar"  
   Filename = Replace(Environ(24), "TEMP=", "") & "\price"  
   ' скачанный прайс найдёте здесь: C:\WINDOWS\TEMP\price  
   On Error Resume Next: Kill Filename  
 
   For d = Now To Now - 30 Step -1    ' за последние 30 дней  
       ссылка = Replace(Link, "ДАТА", Format(d, "d.mm.yy"))  
       Debug.Print "Ищем файл: ", ссылка  
       If DownLoadFile(ссылка, Filename) Then  
           MsgBox "Скачан прайс за " & Format(d, "DD MMMM YYYY")  
           Exit Sub  
       End If  
       Debug.Print "Проверена дата: ", d  
   Next  
End Sub  
 
 
Подробнее - здесь:  
http://www.programmersforum.ru/showpost.php?p=337028&postcount=2  
http://www.mrexcel.com/forum/showpost.php?p=2045787&postcount=4
 

{quote}{login=VL55}{date=04.01.2010 06:13}{thema=Как скачатьть файл из интернета с помощью VBA?}{post}Нагуглить по форуму и вне по этому вопросу не удалось{/post}{/quote} Странно, у меня нашлось: http://otvety.google.ru/otvety/thread?tid=13e628eada06ef65&table=%2Fotvety%2Flabel%3Flid%3D1b549d575b1ad0a8 Строка запроса - название темы.

 
Огромное спасибо за помощь.
 
{quote}{login=Юрий М  
Странно, у меня нашлось: http://otvety.google.ru/otvety/thread?tid=13e628eada06ef65&table=%2Fotvety%2Flabel%3Flid%3D1b549d575b1ad0a8 Строка запроса - название темы.</P>{/post}{/quote}  
 
И что вы думаете, предложенный по ссылке метод на пробе работал хорошо, но только я его зарядил на скачку 4-х файлов мой антивирус начал ругатся (типа обноружен Троян-доунлодер) и утащил файл с кодом на карантин )))
 
Дык, не виноват я :-) Вопрос к автору макроса или к антивирусу :-))
 
{quote}{login=}{date=14.01.2010 09:17}{thema=Re: Re: Как скачатьть файл из интернета  с помощью VBA?}{post}  
 
И что вы думаете, предложенный по ссылке метод на пробе работал хорошо, но только я его зарядил на скачку 4-х файлов мой антивирус начал ругатся (типа обноружен Троян-доунлодер) и утащил файл с кодом на карантин ))){/post}{/quote}  
 
Ну так а зачем было использовать компоненты CreateObject("InternetExplorer.Application") и CreateObject("MSXML2.XMLHTTP") ?????  
 
Чем не устроило моё решение, где для скачивания файла используется WinAPI?  
 
И никакие антивирусы не ругаются, вроде бы...
 
{quote}{login=EducatedFool}  
Чем не устроило моё решение, где для скачивания файла используется WinAPI?  
 
И никакие антивирусы не ругаются, вроде бы...{/post}{/quote}  
 
На самом деле воспользовался вашим вариантом за что спасибо боольшое! просто он у меня сначало не заработал по моей вине.  
 
Если можете подскажите как мне получить содержимое wwwстраницы аналогичное открытию страницы в браузере, "выделить всё","скопировать",вставить только текст в ячейку [A1]. По другому не получается заполучить нужные данные,ни веб-запросом, ни прямой скачкой страницы (не селён в вебе но насколько понимаю потому что на странице ява или типо того), только ручное копирование.
Насколько понимаю это можно сделать через обьекты Set ie = CreateObject("InternetExplorer.Application"), соответственно как дождаться что сраница загрузилась полностью и как её скопировать из ie?
 
Я обычно качаю страницы из интернета таким кодом:  
 
 
Function GetHTTPResponse(ByVal sURL As String) As String  
   On Error Resume Next  
   Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")  
   With oXMLHTTP  
       .Open "GET", sURL, False  
       '    раскомментируйте следующие строки и подставьте верные IP, логин и пароль  
       ' если вы сидите за proxy  
       '    .setProxy 2, "192.168.100.1:3128"  
       '    .setProxyCredentials "user", "password"  
       .send  
       sHTMLBody = .responseBody  
   End With  
   For i = 0 To UBound(sHTMLBody)  
       GetHTTPResponse = GetHTTPResponse & ChrW(AscW(Chr(AscB(MidB(sHTMLBody, i + 1, 1)))))  
   Next  
   pi.Hide  
   Set oXMLHTTP = Nothing  
End Function  
 
Private Sub ПримерИспользования()  
   txt = GetHTTPResponse("http://ExcelVBA.ru")  
   MsgBox txt  
   Debug.Print SaveTXTfile("C:\Documents and Settings\Игорь\Рабочий стол\PageText_test.txt", txt)  
End Sub  
 
Function SaveTXTfile(ByVal filename As String, ByVal txt As String) As Boolean  
   On Error Resume Next: Err.Clear  
   Set fso = CreateObject("scripting.filesystemobject")  
   Set ts = fso.CreateTextFile(filename, True)  
   ts.Write txt: ts.Close  
   SaveTXTfile = Err = 0  
   Set ts = Nothing: Set fso = Nothing  
End Function  
 
 
Но результат - не ТЕКСТ, а ИСХОДНЫЙ КОД страницы.
 
{quote}{login=EducatedFool}  
 
Но результат - не ТЕКСТ, а ИСХОДНЫЙ КОД страницы.{/post}{/quote}  
 
Увы, код страницы ничего не даёт, страница динамическая,поэтому я вижу только манипуляцию с обьектом InternetExplorer, но вот как ? как дождаться что страничка открылась ? как скопировать её в буфер..ничего не смог найти((( Везде описано только открытие страницы и всё на этом.
 
Если надо получить ТЕКСТ страницы, то можно использовать примерно такой код:  
 
Sub test()  
   Set IE = CreateObject("InternetExplorer.Application"): DoEvents  
 
   IE.Navigate "http://ExcelVBA.ru"  
   While IE.readyState <> 4: DoEvents: Wend ' ждем, пока загрузится страница  
   Set ieDoc = IE.Document  
 
   For i = 0 To IE.Document.all.Length - 1  
       MsgBox IE.Document.all.item(i).innerText, vbInformation, "Элемент № " & i  
   Next  
     
   IE.Quit  
   Set IE = Nothing  
End Sub  
 
 
Я в объектной модели DOM пока плохо разбираюсь, так что, возможно, есть более простой способ.  
Но меня и такой вариант устраивает.  
Смотрите, что скачивается, выбираете индексы нужных Вам элементов,  
и модернизируете код, чтобы обрабатывался текст только из интересующих Вас частей веб-страницы.  
 
 
Вот пример работы со страницей, содержащей фреймы:  
(заполняется поле поиска, нажимается кнопка ОТПРАВИТЬ, обрабатывается результат из сформированной скриптом веб-страницы)  
 
 
Function GetSubsribersCollection(Optional ByVal SearchString As String = "*") As Collection  
   On Error Resume Next  
   'Set GetSubsribersCollection = New Collection  
   If Len(Trim(SearchString)) = 0 Then Exit Function    ' пустая строка поиска недопустима  
 
   ' pi.Show "Биллинг - запрос данных "  
   '  "Подключение к серверу..."  
   Set IE = CreateObject("InternetExplorer.Application"): DoEvents  
   NavStr = "https://..../template.cgi?tpl=base/index.tpl"  
   'IE.Visible = -1  
 
   IE.Navigate NavStr  
     
   While IE.readyState <> 4: DoEvents: Wend  
   Set ieDoc = IE.Document  
   'pi.StartNewAction 20, 70, "Обработка запроса..."  
 
   With ieDoc.frames.item(0).Document  
       .all("search_limit").selectedIndex = 2  
       .all("search").Value = SearchString  
       .forms("frm_param").submit  
   End With  
     
   While IE.Busy  
       DoEvents  
   Wend  
 
   Set t = ieDoc.frames.item(1).Document.activeElement.childNodes(1)  
 
   For i = 1 To t.Rows.Length - 2  
       'If i Mod PI_step = 0 Then pi.CurAction 0, 0, , "Обрабатывается строка " & i  
       With t.Rows.item(i).Cells  
           ' код  
       End With  
   Next i  
     
   IE.Quit  
   Set IE = Nothing  
   pi.Hide  
End Function
 

Вы бы лучше дали ссылку на сайт, и сказали, что именно оттуда надо скачать, и что потом сделать со скачанным... Как использовать буфер обмена - можно почитать здесь: http://www.programmersforum.ru/showpost.php?p=154621&postcount=4 (полагаю, что в Вашем случае он абсолютно не нужен...) Кое-что по теме: http://www.programmersforum.ru/showthread.php?t=65795

 
Страничка http://www.alpari.ru/ru/pamm/rating/ и  мне нужен сам рейтинг.  
Я почитал выши сылки и сдаётся мне что самым надёжным вариантом будет если юзеры будут вручную открывать нужную страницу и копировать её.
 
> самым надёжным вариантом будет если юзеры будут вручную открывать нужную страницу и копировать её.  
 
Поверьте, это не самый надежный вариант.  
К тому же, разные браузеры по-разному копируют таблицы в буфер обмена - приходится анализировать, какой из браузеров был использован, и запускать соответствующий макрос обработки.  
 
По поводу Вашего сайта:  
 
Достаточно в цикле загрузить 10 страниц с адресами типа  
http://www.alpari.ru/ru/pamm/rating/#PammList?page=1&sort=rating&sorttype=ASC  
 
(где вместо page=1 подставлять page=2, page=3 и т.д.)  
 
Если Вам надо получить в Excel таблицу из 6 столбцов такого вида:  
1 Invincible_trader:58529    20.03.2009 2500 EUR 1183.77% 0.00% 45.69%  
 
то это реально. Сложно, но возможно.
 
К тому же, по каждому ПАММ-счету можно макросом скачать готовый файл Excel.  
 
Пример ссылки для скачивания файла:  
http://www.alpari.ru/ru/pamm/info/login/58529/action/excel  
 
Короче, алгоритм упрощается:  
1) грузим в цикле 10 страниц (см. пост выше)  
2) в каждой из них находим по 50 ссылок на ПАММ-счета  
3) из адресов ссылок (нас интересуют только последние 6 символов из адреса ссылки) формируем ссылки на файлы excel  
5) Загружаем в специальную папку все 500 файлов  
6) Анализируем их.
 
{quote}{login=EducatedFool}  
 
По поводу Вашего сайта:  
 
Достаточно в цикле загрузить 10 страниц с адресами типа  
http://www.alpari.ru/ru/pamm/rating/#PammList?page=1&sort=rating&sorttype=ASC  
 
(где вместо page=1 подставлять page=2, page=3 и т.д.)  
..{/post}{/quote}  
Я так и делал,но список рейтинга не сохраняется как только не пробовал.И скачивал и веб-запросом,сохраняется вся страница но без списка.Только копированием из експлоера всей страницы в ручную и последующей вставкой на страницу  
 
{quote}{login=EducatedFool}  
Если Вам надо получить в Excel таблицу из 6 столбцов такого вида:  
1 Invincible_trader:58529    20.03.2009 2500 EUR 1183.77% 0.00% 45.69%  
{/post}{/quote}  
 
С этим то как раз никаких проблем. Эту часть я уже сделал и она работает.  
И файлы я уже скачиваю и обрабатываю.  
 
{quote}{login=EducatedFool}{date=18.01.2010 04:20}{thema=}{post}> самым надёжным вариантом будет если юзеры будут вручную открывать нужную страницу и копировать её.  
 
Поверьте, это не самый надежный вариант.  
К тому же, разные браузеры по-разному копируют таблицы в буфер обмена - приходится анализировать, какой из браузеров был использован, и запускать соответствующий макрос обработки..{/post}{/quote}  
Ёлки-палки...Я надеялся что таких проблем не будет. Остаётся только обязать пользователя пользоваться Експлорером и автоматизировать только открытие нужных страниц. Всё равно Експорер стоит у всех по умолчанию хоть и пользуются все кто во что горазд.
 
{post}{quote}{login=EducatedFool}  
 
По поводу Вашего сайта:  
 
Достаточно в цикле загрузить 10 страниц с адресами типа  
http://www.alpari.ru/ru/pamm/rating/#PammList?page=1&sort=rating&sorttype=ASC  
 
(где вместо page=1 подставлять page=2, page=3 и т.д.)  
{/quote}  
Я так и делал,но список рейтинга не сохраняется как только не пробовал.И скачивал и веб-запросом,сохраняется вся страница но без списка.Только копированием из експлоера всей страницы в ручную и последующей вставкой на страницу  
 
{quote}  
Если Вам надо получить в Excel таблицу из 6 столбцов такого вида:  
1 Invincible_trader:58529    20.03.2009 2500 EUR 1183.77% 0.00% 45.69%  
{/quote}  
 
С этим то как раз никаких проблем. Эту часть я уже сделал и она работает.  
И файлы я уже скачиваю и обрабатываю.  
 
{quote} самым надёжным вариантом будет если юзеры будут вручную открывать нужную страницу и копировать её.  
 
Поверьте, это не самый надежный вариант.  
К тому же, разные браузеры по-разному копируют таблицы в буфер обмена - приходится анализировать, какой из браузеров был использован, и запускать соответствующий макрос обработки..{/quote}  
Ёлки-палки...Я надеялся что таких проблем не будет. Остаётся только обязать пользователя пользоваться Експлорером и автоматизировать только открытие нужных страниц. Всё равно Експорер стоит у всех по умолчанию хоть и пользуются все кто во что горазд.
 
Откройте Вашу страницу в FireFox (c подключенным расширением Firebug),  
и изучите структуру страницы:  
 
http://i072.radikal.ru/1001/f3/a86a6bcf58b7.jpg  
 
После этого Вам станет понятно, как с ней работать.  
Ну и изучите HTML DOM (Document Object Model):  
http://www.script-coding.info/DOM.html
 
{quote}{login=EducatedFool}{date=18.01.2010 04:55}{thema=}{post}  
После этого Вам станет понятно, как с ней работать.  
{/post}{/quote}  
 
Упс...вопросов появилось столько что я не знаю с чего и начать ))) Точнее один : что всё это значит ? )))  
Вообщем пошёл я пытаться учить эту мат.часть.  
Однако спасибо.
 
{quote}{login=EducatedFool}{date=18.01.2010 04:20}{thema=}{post}>    
По поводу Вашего сайта:  
 
Достаточно в цикле загрузить 10 страниц с адресами типа  
http://www.alpari.ru/ru/pamm/rating/#PammList?page=1&sort=rating&sorttype=ASC  
 
(где вместо page=1 подставлять page=2, page=3 и т.д.)  
 
.{/post}{/quote}  
Я понял почему я не мог получить список рейтинга с этой страницы. Браузер (у меня IE6)сообщал что страница загружена, а тем временем список ещё не был свёрстан. Я после .Busy поставил небольшую паузу и список наконец-то удалось  заполучить через ExecWB OLECMDID_SELECTALL.    
А можно ли установить задержку при скачивании страниц через QueryTables ?
 
Подскажите, пожалуйста, как исходный код страницы перенести полностью построчно на лист excel?
 
Здесь есть пример кода: http://excelvba.ru/code/GetHTTPResponse
 
Подскажите пожалуйста как перед поиском нужной информации на странице, передать ей параметры и отработать нажатие кнопки?    
А конкретно на сайте (https://fx-trend.com/ru/pamm/agent/502024/) внести в поле "Кол-во периодов" значение 1 и нажать "Применить"?
Страницы: 1
Наверх