Страницы: 1
RSS
VBA: парсинг через защиту
 
Добрый день.

Такой вопрос. Раньше для скачивания информации (текста) с отдельных страниц одного сайта пользовался стандартной функцией querytables.add. Макросом через поиск выбиралась нужная мне информация.

Сейчас на данном сайте ввели проверку браузера перед загрузкой страницы. В результате даже просто гиперссылки из ячеек перестали открываться, не говоря уже про url-запросы.

Но. Команда vba открыть ссылку в  IE по-прежнему работает, особенно если задержку времени ставить на загрузку.

Вопросы:
1. Есть ли способ использовать дальше querytables напрямую или подобная защита капитальна?

2. Можно ли скопировать текст средствами навигации IE и вставить его в том же табличном формате, как это делал querytables?
Если возможен, просьба прикинуть скрипт. Сам написал до момента копирования текста в стринг-переменную.

3. Возможен ли такой вариант... vba открывает страницу в IE, сохраняет на локальный диск в определенную папку, а затем делается запрос querytables к этой сохраненной на локальном диске странице?
Если возможен, просьба прикинуть скрипт. Полностью. Сам я даже не знаю, как (и можно ли) сделать url-запрос к локальному лиску и как дать команду IE сохранить сайт в нужной директории.

Спасибо за помощь!
Дополнительную информацию скину по запросу.
Изменено: Gaevsky - 10.10.2016 17:48:00
 
Использовать дальше querytables - вряд ли. Он не умеет передавать заголовки запроса. А вам без этого не обойтись.

средствами навигации IE и вставить его в том же табличном формате - ну если только вы вручную можете выделить в IE нужную таблицу, скопировать её, вставить в Excel, - и результат вас устроит
Код будет в этом случае ужасный, сложный (выделить таблицу в IE непросто, наверное), - но теоретически возможно.
Проще уж тогда веб-страницу в Word открывать, - там намного проще выделить и скопировать таблицу (но в Word тоже, наверное, не откроется сайт как надо)

> Возможен ли такой вариант...
да, возможен
причем, страницу можно открывать без использования IE - так быстрее, и заголовки ничто не мешает передать, как браузер

по коду:
это для веб-запросов
http://excelvba.ru/code/WebQueryRange
(функции без разницы, делать запрос к файлу HTML, или к сайту)

это для скачивания страницы в файл
http://excelvba.ru/code/GetHTTPResponse
там пару строк надо добавить, для отправки заголовков запроса, типа такого
Код
  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
Изменено: Игорь - 10.10.2016 17:54:06
 
Столько вопросов а конкретики 0!
Как можно ответить на вопрос не зная о каком сайте речь.
 
Спасибо. Все понятно, лучше в его развивать вариант номер 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/// и т.п.)
Изменено: Gaevsky - 10.10.2016 23:07:38
 
Цитата
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. Сохраненная на локальном диске страница удаляется, чтобы не было захламления.
Статус: не сделано. Пока не нашел команды.
 
Цитата
Gaevsky написал: 5. Сохраненная на локальном диске страница удаляется, чтобы не было захламления.
Статус: не сделано. Пока не нашел команды.
Ссылка.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо! По шагу 5 то что надо.

Шаги 1.1. и 2 поможете советом?
 
Цитата
Приведенная в предыдущем ответе ссылка сохраняет текст или код 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 влезают иероглифы типа такого:  ֲכאהווע ףקאסעךמל ג דמנמהו �מגקוד.
Как это исправить?
 
поколдуйте с перекодировкой WebPageHTML перед сохранением
http://excelvba.ru/code/encode

или сохраняйте в файл HTML в кодировке UTF-16
Код
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


и тогда иероглифов не будет
 
Цитата
Игорь написал:
и тогда иероглифов не будет

Спасибо большое.
Вариант 1 тестить не стал - кто его знает, какая исходная кодировка.

Вариант 2 сработал с первого раза в форме саба))) Никакого китайского.
Код
    ...
    ShortFileName = "ID" & (ID) & Format(Now, "dd-mm-yy-hh-mm-ss") & ".htm"
    FullFileName = ThisWorkbook.Path & Application.PathSeparator & ShortFileName
    WebPageHTML = IE.Document.body.innerHTML
    Call SaveTXTfile(FullFileName, WebPageHTML)

Sub SaveTXTfile(ByVal filename As String, ByVal txt As String)
    Set fso = CreateObject("scripting.filesystemobject")
    Set ts = fso.CreateTextFile(filename, True, True)
    ts.Write txt: ts.Close
End Sub
Изменено: Gaevsky - 24.01.2017 00:42:14
Страницы: 1
Наверх