Скачивание (загрузка) текста web-страницы в текстовый файл

При помощи этого макроса вы можете скачать текст с выбранной страницы веб-сайта:

Sub ЗагрузкаТекстаВебСтраницы()
    Set IE = CreateObject("InternetExplorer.Application"):    ' загружаем браузер Internet Explorer
    On Error Resume Next
    addr$ = "http://excelvba.ru/services"    ' указываем адрес сайта (веб-страницы), текст которой загружаем

    IE.Navigate addr$    ' загружаем сайт
     While IE.busy Or (IE.readyState <> 4): DoEvents: Wend    ' ждем, пока загрузится страница
    ' Set ieDoc = IE.Document    ' ссылка на открытый документ

    txt$ = IE.Document.body.innerText    ' считываем текст веб-страницы в текстовую переменную
    
    '[a1] = txt$ ' помещаем текст веб-страницы на лист Excel
    IE.Quit: Set IE = Nothing    ' закрываем браузер
    
    MsgBox txt$, vbInformation, "Текст веб-страницы " & addr$ ' выводим сообщение с текстом с сайта
End Sub

То же самое - но в виде функции:

Function WebPageText(ByVal sURL As String) As String
    On Error Resume Next
    Set IE = CreateObject("InternetExplorer.Application"):    ' загружаем браузер Internet Explorer
    IE.Navigate sURL    ' загружаем сайт
    While IE.busy Or (IE.readyState <> 4): DoEvents: Wend    ' ждем, пока загрузится страница
    WebPageText = IE.Document.body.innerText    ' считываем текст веб-страницы
    IE.Quit: Set IE = Nothing    ' закрываем браузер
End Function

Если же нужен HTML код страницы, то используйте такой вариант

' создаём объект IE
Set IE = CreateObject("InternetExplorer.Application")
 
' переходим по ссылке в браузере
IE.Navigate URL
 
' ждём, пока страница загрузиться
While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend
 
' считываем HTML код веб-страницы в текстовую переменную
Code$ = IE.Document.body.innerHtml  

Пример использования этой функции для загрузки текста страниц из интернета:

Sub ПримерИспользованияФункции_WebPageText()
    ' считываем текст страницы <a href="http://excelvba.ru/services" title="http://excelvba.ru/services">http://excelvba.ru/services</a> в переменную txt
    txt = WebPageText("http://excelvba.ru/services")
    ' получаем путь к папке "Рабочий стол"
    ПутьКРабочемуСтолу = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    ' сохраняем текст из переменной txt в файл PageText.txt на рабочем столе
    SaveTXTfile ПутьКРабочемуСтолу & "\PageText.txt", txt
    ' открываем созданный текстовый файл в Excel
    Workbooks.OpenText ПутьКРабочемуСтолу & "\PageText.txt", , , xlDelimited
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

PS: Если вас интересует ИСХОДНЫЙ КОД страницы - используйте эту функцию: http://excelvba.ru/code/GetHTTPResponse

Вложения:

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Максим, открывать ссылку в браузере, и загружать содержимое страницы с использованием разных браузеров, — разные вещи.
Первое делается легко, второе - сложно, и только с установкой дополнительного ПО.

Добрый день. Подскажите пожалуйста, что нужно изменить, что б вместо IE открывать ссылки в другом браузере, не являющемся браузером по умолчанию, например в Chrome? Макросом буду открывать ссылки в разных браузеров, поэтому только для того, что по умолчанию- не подходит

Добрый день - использу ваш код для загрузки html страницы очень удобно спасибо Вам огромное. Но в последние дни проблемы с использованием кода на сайте https://rosreestr.ru/wps/portal/online_request вставляю эту страницу и проблемы возникают с тем что она не отгружает текст а только открывает ie и больше никаких действий, неделю назад все было хорошо. Я использовал макрос ЗагрузкаТекстаВебСтраницы. Подскажите с чем это может быть связано.

Да, можно и часть.
На сайте есть функция для поиска нужных тегов в html коде

Классные коды, огромное спасибо. А можно импортировать не всю страницу, а кусок? По тегам или еще как-нибудь

Переустанавливал, откатывал на старую версию, поставил винду 10 64 бит, и офис 16.

Возможно, IE криво установился или обновился. Попробуйте переустановить ИЕ

Function WebPageText не работает, ранее работала перестала после очередного пакета обновления виндоус7. Останавливается на строке
While IE.busy Or (IE.readyState <> 4): DoEvents: Wend
при этом страница в браузере открывается. если поставить
MsgBox IE.Document.body.innerText
При любом времени ожидания объект IE.Document пуст.
Если использовать http://excelvba.ru/code/GetHTTPResponse или https://excelvba.ru/code/FileQueryRange данные возвращаются. В чем проблема?

Меня интересует такой же вопрос: как загрузить содержимое текстового файла с этой страницы или сам файл

Огромное спасибо! То, что надо! Очень полезная в хозяйстве вещь!

Николай, да, можно, - только это будет уже совсем другой макрос.
Впрочем, у меня есть готовое решение для такой задачи, - всё будет работать в точности как вам надо:
http://excelvba.ru/programmes/Parser
И ссылки из выделенных строк возьмет из заданного столбца, и результат в те же строки выведет

Здравствуйте, отличный макрос (программа)! Подскажите пожалуйста, а можно сделать так, чтобы задавать диапазон ссылок (например: от А1 до А10) или выделять N-ое количество ссылок - макросы - выполнить и макрос их обрабатывает? И ещё, выводить содержимое ссылки не в новом документе, а в ячейке соседнего столбца? Понимаю, раскатал губу, своими запросами, не сочтите за наглость! Заранее благодарю за ответ...

Добрый день! возможно уже есть пример описания получения части данных со web-страницы, заключенных между определенными тегами, например ... и помещение их в ячейку

Как-то так:

Sub FindAllBrowserWindows()
    On Error Resume Next
    Set objshell = CreateObject("shell.application")
    Set oShellWind = objshell.Windows
 
    For Each w In oShellWind    ' перебираем все окна
        URL$ = w.LocationURL
        If URL$ Like "http*" Then    ' если это окно браузера (открыт сайт)
            txt$ = w.document.DocumentElement.outerhtml
            MsgBox "HTML код: " & vbNewLine & txt, vbInformation, "Найдена страница: " & URL$
        End If
    Next
    Set oShellWind = Nothing
End Sub

Добрый день.
Вы писали:
"Как перебрать все вкладки (и получить URL открытых страниц и их содержимое), я знаю (делал)"
Не мог бы бы подсказать как?
Спасибо!

Андрей, тут подсказать не смогу
Как перебрать все вкладки (и получить URL открытых страниц и их содержимое), я знаю (делал)
А как узнать, какая из вкладок активная, тут сложнее (надо к самому приложению обращаться, или через WinAPI все вкладки проверять) - мне такого делать не приходилось, потому, посоветовать ничего не могу.

Здравствуйте.
Подскажите, пожалуйста, следующее
Есть несколько уже открытых web-страниц в ИЕ. Они в разных вкладках и в разных окнах.
Нужно обработать только активную в данный момент вкладку или окно.
Как средствами VBA определить какая(ое) из всех вкладок-окон в данный момент активны?
Спасибо

Альтернатива есть, - можно работать с сайтами без использования браузера
Например: http://excelvba.ru/code/gethttpresponse
Браузер, собственно, вообще не нужен, - просто изредка с ним удобнее работать (код проще)

PS: IE8, как и любой другой браузер, отлично работает с HTTPS
Проблема IE - только в том, что он тормозит, и может подвисать
(потому я, в своё парсере, IE стараюсь не использовать вообще)

Доброго Времени Суток Вам.
Подскажите, а есть альтернатива:CreateObject("InternetExplorer.Application")
Дело в том, что у меня XP sp2 = IE8, который в свою очередь не работает c https.

Сергей, ответил вам на почту

Здравствуйте. Очень нужна Ваша помощь. Есть база ссылок в Excel. База для интернет-магазина. Есть столбцы с названием, описанием ... ценой и ссылкой на сайт-донор. Нужно сделать так, чтоб макрос выполнял перебор этих ссылок и сравнивал цену в ячейке с ценой на сайте.
Можете мне в этом помочь?

Про какую программу речь?
В статье, где вы разместили комментарий, никакой программы нет.

Речь про надстройку «Парсер сайтов»? Если да, - можем настроить под заказ.
Заказы на парсер принимаются в таком виде: http://excelvba.ru/programmes/Parser/order

Скачал тестовую программу. Подскажите как сделать выгрузку списка компаний с сайта в таблицу ексель, и их контактов. Найти контакты возможно с других сайтов этих компаний, (поиск по названию компаний). Т.е. на сайте, где список компаний - там нет контактов, контакты есть на сайтах этих компаний, нужен поиск сайтов по названию компаний - переход и скачка контактов. Возможно это сделать через Данную программу? И как? Сайт, с которого нужен список компаний http://www.franchisee.su/catalog/s-p-avto-lyubye-zapchasti-na-lyubye-avt...

Большое спасибо!

Валентина, в функции SaveTXTfile найдите строку

Set ts = fso.CreateTextFile(filename, True)

и замените её на
Set ts = fso.CreateTextFile(filename, True, True)

Файл создавался пустой, т.к. было попытка сохранить его в кодировке ANSI, а на веб-странице присутствуют символы, недопустимые в этой кодировке.
После того, как строчку в коде поменяете, файл будет создаваться в кодировке UTF-16, - там все символы допустимы.

Добрый день!
Я пробую сохранить текст, а также код страницы https://www.discogs.com, но текстовый файл - пуст.
При этом текст в переменной txt есть.

Добрый день! хороший макрос. Но как загружать код не только страницы но и код элемента находящегося на странице?

Спасибо большое! получилось реализовать именно этим способом.

Здравствуйте, Max.

Возможно, поможет добавление паузы в код:
http://excelvba.ru/code/GetHTTPResponse#comment-2210

Ну или добавьте в код из этой статьи задержку в пару секунд.
(надо подождать, пока отработает редирект, и скрипт сформирует страницу результатов)
После строки
 While IE.busy Or (IE.readyState <> 4): DoEvents: Wend    ' ждем, пока загрузится страница
напишите
 application.wait now + 2/86400 ' пауза 2 секунды

Спасибо Вам за сайт. Очень много полезной и качественной информации.

Столкнулся с проблемой урл: "http://nylottery.ny.gov/wps/portal/NumbersTracker?game=NUMBER"
Ни одним способом, найденным на сайте, не могу загрузить данные с сайта в excel (Copy-Past не в счет). Веб-запрос тоже результатов не дает.
Подскажите, возможно есть другие способы, или я что-то упускаю. Заранее спасибо.

Подозрение что не в той отправляется. Потому что от гугла приходит INVALID_REQUEST

Ну как не работает? Может, не в той кодировке ответ приходит?
Так в этом случае можно изменить кодировку файла

GetHTTPResponse на моей конфигурации не работает с русскими буквами в запросе. Т.е. Иркутск не проходит. Мне пришлось сделать транслитерацию, но это сократило количество корректных ответов от гугла на треть. Т.е. не решение

Здравствуйте, Дмитрий.
Во-первых, код работает и с вашей ссылкой (Excel 2010, Win XP, IE 7), но дело да\же не в этом.
По ссылке возвращается XML - зачем результат в ячейки помещать?

Есть 2 способа получить XML с сайта:

1) Получить исходный текст веб-страницы

2) Скачать результат как обычный файл

И у меня этот код ничего не возвращает запросом по адресу "http://maps.google.com/maps/api/geocode/xml?address=London&sensor=false"
Excel 2010, Win 7, IE 9

А запрос html из первоначального примера возвращает корректные данные. Возможно это потому что с гугла xml приходит?

А если в запросе London на Иркутск поменять?

Здравствуйте, Жека.
Использование браузера по-умолчанию в подобных макросах невозможно.

Браузеров много разных - соответственно, методы работы (программного взаимодействия) с ними сильно отличаются.
Придётся писать код для каждого отдельного браузера. (и получится не 5 строк кода, а в сотню раз больше)

Есть другой способ получить текст веб-страницы - использовать веб-запрос 
(в этом случае можно обойтись вообще без макросов - этот запрос можно создать вручную, а настроить автообновление данных)

Ещё раз спасибо за Ваши программы. Возник вопрос :
Как переделать строку
Set IE = CreateObject("InternetExplorer.Application") ,
что бы загружался браузер по умолчанию, а не только InternetExplorer.
Спасибо за ответ.

Здравствуйте, Алексей.
Тут не получится дать универсальный совет - в каждом случае надо выдирать из текста различные данные.
Обычно я делаю это при помощи функции Split (для разделения текстовой строки на 2 части).
2 вызова этой функции - и нужные данные из огромного текста получены.

Кроме того, можно попробовать применить веб-запрос - в этом случае курс доллара можно получить без единой строки кода.

PS: У меня на сайте есть отдельный макрос для получения курса доллара на нужную дату.

Спасибо, все работает
Я вот полностью забираю текст с сайта, а потом функциями excel выбираю нужное
А вот как в макросе прописать так называемый парсинг, т.е. мне надо найти например курс доллара на конкретную дату

Спасибо Вам за ответ!
Видимо у меня что-то с настройками? Посмотрю.
Я делал аналогично - загнал в переменную адрес. Результатом было ''.

Огромное спасибо за совет, поискать по форуму "Планеты" - с лёту в поисковиках не нашел. Надо было быстро получить координаты. Сначала хотел воспользоваться json, но не смог добраться даже да текста. Надеюсь, на форуме найду.

Еще раз благодарю за очень оперативный ответ!

Здравствуйте, Антон.

Я взял вышеопубликованную функцию ЗагрузкаТекстаВебСтраницы,
в одной строке кода заменил адрес сайта:

' указываем адрес сайта (веб-страницы), текст которой загружаем
addr$ = "http://maps.google.com/maps/api/geocode/xml?address=London&sensor=false" 

И увидел сообщение с ожидаемым результатом.
Так что не знаю, в чем проблема, - у меня всё работает.

PS: Я бы на вашем месте поискал готовое решение - на форуме «Планеты Excel» встречал как-то 2 решения вашей задачи
(определение координат по адресу, путем парсинга XML с подобный веб-страниц)

Здравствуйте!

Спасибо за Ваш отличный сайт!

Я попытался воспользоваться кодом с этого примера.
Планировал прочитать текст со странички по адресу "http://maps.google.com/maps/api/geocode/xml?address=London&sensor=false"

Но в переменную от объект WebPageText = IE.Document.body.innerText ничего не записывается. Подскажите, в чем может быть проблема?
Если открывать линк в IE, то результат отображается.

Спасибо!

Спасибо.. Link.innerText - это то что нужно..А я в справке это свойство не нашёл.. Ещё раз спасибо..

Судя по результату, link.nameProp возвращает не надпись на ссылке, а что-то другое:
(я плохо ориентируюсь в объектной модели DOM)

Debug.Print "Ссылка №" & n, Link.href, Link.nameProp

Результат:

Ссылка №96 http://excelvba.ru/category/pivot pivot
Ссылка №97 http://excelvba.ru/category/Windows Windows
Ссылка №98 http://excelvba.ru/category/archive archive
Ссылка №99 http://excelvba.ru/category/WMI WMI
Ссылка №100 http://excelvba.ru/category/registry registry
Ссылка №101 http://excelvba.ru/category/WinAPI WinAPI
Ссылка №102 http://excelvba.ru/category/mail mail
Ссылка №103 http://excelvba.ru/category/business business
Ссылка №104 http://excelvba.ru/category/price price
Ссылка №105 http://excelvba.ru/category/finance finance
Ссылка №106 http://excelvba.ru/category/autoparts autoparts
Ссылка №107 http://excelvba.ru/category/billing billing
Ссылка №108 http://excelvba.ru/category/realty realty


Насколько мне известно, для получение текста ссылки надо использовать свойство Link.innerText

Debug.Print "Ссылка №" & n, Link.href, Link.innerText

Результат:

Ссылка №123 http://excelvba.ru/category/hyperlinks Гиперссылки (15)
Ссылка №124 http://excelvba.ru/category/password Логин и пароль (12)
Ссылка №125 http://excelvba.ru/category/sound Звук и видео (1)
Ссылка №126 http://excelvba.ru/category/calendar Календарь (дата, время) (6)
Ссылка №127 http://excelvba.ru/category/pictures Изображения (картинки) (13)
Ссылка №128 http://excelvba.ru/category/class Модули класса (13)
Ссылка №129 http://excelvba.ru/category/toolbar Панель инструментов (16)
Ссылка №130 http://excelvba.ru/category/popup Контекстное меню (4)
Ссылка №131 http://excelvba.ru/category/array Массивы (9)
Ссылка №132 http://excelvba.ru/category/VBE Проект VBA (1)
Ссылка №133 http://excelvba.ru/category/encode Перевод и кодировка (4)
Ссылка №134 http://excelvba.ru/category/sort Сортировка (1)
Ссылка №135 http://excelvba.ru/category/string текстовые строки (4)
Ссылка №136 http://excelvba.ru/category/userform Форма ввода (19)
Ссылка №137 http://excelvba.ru/category/CheckInput Проверка ввода (7)
Ссылка №138 http://excelvba.ru/programmes/1 Простые макросы

Спасибо..Всё получается.
А надпись на этой ссылке можно получить свойством link.nameProp ??
Спасибо за ответ..

В общем случае, после загрузки веб-страницы, надо обратиться к свойству Links веб-страницы:

Sub ПечатьСпискаСсылокВебСтраницы()
    ' загружаем браузер Internet Explorer
    Set IE = CreateObject("InternetExplorer.Application"):
    ' указываем адрес сайта (веб-страницы), на которой будем искать ссылки
    addr$ = "http://excelvba.ru/services"
 
    IE.Navigate addr$    ' загружаем страницу
    While IE.busy Or (IE.readyState <> 4): DoEvents: Wend    ' ждем, пока загрузится страница
    
    For Each link In IE.Document.Links    ' перебираем все ссылки на странице
        ' выводим номер и адрес гиперссылки
        n = n + 1: Debug.Print "Ссылка №" & n, link.href
    Next
 
    IE.Quit: Set IE = Nothing    ' закрываем браузер
End Sub

Результат увидите в окне Immediate:

Хорошая програмка. Спасибо. А как можно загрузить с вэб-страницы гиперссылки?? Спасибо за ответ..

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
   ____   _   _    ___            _  _          
/ ___| | | | | / _ \ __ _ | || | ___
| | _ | |_| | | | | | / _` | | || |_ / _ \
| |_| | | _ | | |_| | | (_| | |__ _| | __/
\____| |_| |_| \__\_\ \__, | |_| \___|
|_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.