Такой вопрос. Раньше для скачивания информации (текста) с отдельных страниц одного сайта пользовался стандартной функцией querytables.add. Макросом через поиск выбиралась нужная мне информация.
Сейчас на данном сайте ввели проверку браузера перед загрузкой страницы. В результате даже просто гиперссылки из ячеек перестали открываться, не говоря уже про url-запросы.
Но. Команда vba открыть ссылку в IE по-прежнему работает, особенно если задержку времени ставить на загрузку.
Вопросы: 1. Есть ли способ использовать дальше querytables напрямую или подобная защита капитальна?
2. Можно ли скопировать текст средствами навигации IE и вставить его в том же табличном формате, как это делал querytables? Если возможен, просьба прикинуть скрипт. Сам написал до момента копирования текста в стринг-переменную.
3. Возможен ли такой вариант... vba открывает страницу в IE, сохраняет на локальный диск в определенную папку, а затем делается запрос querytables к этой сохраненной на локальном диске странице? Если возможен, просьба прикинуть скрипт. Полностью. Сам я даже не знаю, как (и можно ли) сделать url-запрос к локальному лиску и как дать команду IE сохранить сайт в нужной директории.
Спасибо за помощь! Дополнительную информацию скину по запросу.
Использовать дальше querytables - вряд ли. Он не умеет передавать заголовки запроса. А вам без этого не обойтись.
средствами навигации IE и вставить его в том же табличном формате - ну если только вы вручную можете выделить в IE нужную таблицу, скопировать её, вставить в Excel, - и результат вас устроит Код будет в этом случае ужасный, сложный (выделить таблицу в IE непросто, наверное), - но теоретически возможно. Проще уж тогда веб-страницу в Word открывать, - там намного проще выделить и скопировать таблицу (но в Word тоже, наверное, не откроется сайт как надо)
> Возможен ли такой вариант... да, возможен причем, страницу можно открывать без использования IE - так быстрее, и заголовки ничто не мешает передать, как браузер
Dim cHTTP As New WinHttpRequest
With cHTTP
.Open "GET", "http://rucaptcha.com/in.php", True
' это передаем заголовок запроса
' вам нужно будет 2-3 таких строки
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.Send
Спасибо. Все понятно, лучше в его развивать вариант номер 3.
Проверю, но почти уверен, что не через IE скачать страницу с сайта не выйдет. Так как первые 5 секунд открывается пустая страница с содержанием аля "checking yout browser...yout browser will recirect you to requesred content shortly... allow up to 5 sec". Думаю, все тут понятно))
Можно сразу 2 команды для меня прикинуть, пожалуйста? Считаем, что сайт уже о крыт в IE по команде vba.
Код
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate site.ru
While IE.busy Or (IE.readyState <> 4): DoEvents
Application.Wait (Now + TimeValue("0:00:07"))
1) сохранить страницу по адресу рабочий стол/папка ттт 2) сделать url-запрос функцией querytables.add. к данной странице (files/// и т.п.)
1) сохранить страницу по адресу рабочий стол/папка ттт
а что сложного-то? здесь есть весь нужный вам код http://excelvba.ru/code/GetWebPageText только заменить в коде innerText на innerHTML (чтобы брался HTML код вместо текста)
2) сделать url-запрос функцией querytables.add
все делаете как раньше, только подсовывая путь к файлу вместо ссылки на сайт где ваш код? что конкретно не получается?
1. VBA открывает страницу в IE. Статус: сделано. С задержкой грузится нужная страница (адрес при этом может меняться!!!), но защита проверки браузера преодолена.
1.1. Можно ли сохранить в string измененный адрес страницы?
2. VBA дает инструкцию сохранить страницу как html в заданную папку под заданным именем. Статус: не сделано. Просьба помочь. (Для дальнейших шагов пока делал этот шаг вручную из IE через "сохранить как" и выбирал html без картинок... по-хорошему, макрос должен делать те же действия)
Приведенная в предыдущем ответе ссылка сохраняет текст или код html в текстовом файле на рабочем столе. Это наверно не совсем то. Требуется сохранение именно страницы в формате html, чтобы запустить шаг 3.
3. К сохраненной на локальном диске странице делается url-запрос функцией querytables.add. Статус: сделано. Раньше наверно не работало, т.к. в пути присутствовала кириллица.
4. Полученная в результате такого импорта в Excel таблица обрабатывается определенным образом Статус: сделано. Собственно, ради сохранения именно этой части макроса и придумывался этот алгоритм с "сохранить как". Просто много времени было потрачено на написание поиска и копирования нужной информации, хотя через обработку html кода в word может быть было и проще.
5. Сохраненная на локальном диске страница удаляется, чтобы не было захламления. Статус: не сделано. Пока не нашел команды.
Приведенная в предыдущем ответе ссылка сохраняет текст или код html в текстовом файле на рабочем столе. Это наверно не совсем то. Требуется сохранение именно страницы в формате html, чтобы запустить шаг 3.
А вам не приходила в голову идея поменять в коде расширение .txt на .html ? Попробуйте, - и, о чудо, сразу в нужном вам формате начнёт сохранять.
PS: формат HTML от формата TXT ничем абсолютно не отличается
Цитата
Можно ли сохранить в string измененный адрес страницы?
да, можно
Код
msgbox IE.LocationURL,, "Это текущий адрес страницы в браузере"
Извиняюсь, что пропал. Благодаря советам выше удалось реализовать техническое решение через IE, которым все это время и пользовался. Однако у него обнаружился существенный недостаток, который иногда приводит к необходимости "ручками" доделывать за макросом. Просьба подсказать решение проблемы.
1. "Идеальный мир". Через IE вручную сохранить страницу на локальный диск в формате "только HTML. Затем к сохраненной таким образом странице применяем QueryTables.Add. Все работает в 100% случаев. Но не хватает автоматизации.
Правильно понимаю, что макросом нельзя запускать в IE функцию "сохранить как"?
2. Сейчас работает такой код:
Код
' Открываем страницу в IE, ждем проверки браузера
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate Adress1
While IE.busy Or (IE.readyState <> 4)
DoEvents
Wend
Application.Wait (Now + TimeValue("0:00:07"))
' Сохраняем на диск
FullFileName = ThisWorkbook.Path & Application.PathSeparator & ShortFileName
F = FreeFile
WebPageHTML = IE.Document.body.innerHTML
Open FullFileName For Output As #F: Print #F, WebPageHTML: Close #F
' Закрываем IE
IE.Quit
Set IE = Nothing
' Проводим перевод в табличную форму
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;" & "file:///" & FullFileName, Destination:=Range("$A$1"))
.Name = (ID)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
В 85% случаев все работает. Но! В 15% случаев при сохранении html влезают иероглифы типа такого: ֲכאהווע ףקאסעךמל ג דמנמהו �מגקוד. Как это исправить?
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, True)
ts.Write txt: ts.Close
SaveTXTfile = Err = 0
Set ts = Nothing: Set fso = Nothing
End Function