VBA - XMLHTTP web scraping


4

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

Что я могу сделать для повышения скорости очистки данных (кроме VB Script многопоточности)?

С

  • IE навигацией, visible = false и без каких-либо изображений, которые я имел 1000 ссылок извлеченные в 3мине 45sec
  • Msxml2.XMLHTTP в 3мине 30 сек
  • msxml2.serverXMLHTTP 1мин 40sec - .setRequestHeader "Content-Type", "text/xml".setRequestHeader "Accept-Encoding", "compress, gzip" и не влияют на производительность

Лучше объявить и создать объекты в этом суб (что означает внутри цикла для 42 000 ссылок s) или снаружи и сделать их общедоступными переменными?

Public Sub PrintCompanyData() 
Dim oDom As Object: Set oDom = CreateObject("htmlFile") 
Dim htmlelePopUp As IHTMLElement 
Dim unformattedData As String 

With CreateObject("msxml2.serverXMLHTTP") 'CreateObject("msxml2.xmlhttp") 
    .Open "GET", Link, False 
    '.setRequestHeader "Content-Type", "text/xml" 
    '.setRequestHeader "Accept-Encoding", "compress, gzip" 
    .send 

    If .ReadyState = 4 And .Status = 200 Then 

     oDom.body.innerHTML = .responseText 

     With WS 
      For Each htmlelePopUp In oDom.getElementsByTagName("tbody") 
       unformattedData = htmlelePopUp.Children(htmlelePopUp.Children.Length - 1).innerText 
       .Range("a" & ItemCount + 1).Value2 = Replace(unformattedData, Chr(10), vbNullString) 
      Next htmlelePopUp 
     End With 

    End If 

End With 

Set oDom = Nothing 

End Sub 
2

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

Вместо latebinding как этот

With CreateObject("msxml2.serverXMLHTTP") 

Вы можете рано связывать свои объекты, устраняя время COM требуется, чтобы сделать динамический поиск. Однако время, которое это экономит, будет незначительным по сравнению с общей продолжительностью выполнения.


Я не трепку на VBA, я < 3 VBA, но это просто не правильный инструмент для работы, если вам это нужно, чтобы работать быстрее, чем это. То, что вам действительно нужно, - это язык, который способен многопоточно и асинхронно программировать, чтобы максимально использовать время процессора, пока вы ожидаете возвращения этих запросов Http. Похоже, пришло время узнать некоторые C# или F # для меня. Даже Powershell может быть хорошим вариантом.

+2

Использование раннего связывания сократило время выполнения на 2% в среднем. 29 окт. 162016-10-29 22:23:38


1

Строка кода ".Открыть" GET ", Link, False" заставляет процесс быть асинхронным. Измените это на «True» в третьем параметре, и процесс будет выполняться асинхронно. Видимо, VBA недооценивается.

+1

Выполняется асинхронно ... Ваши первые два предложения противоречивы, и неясно, как третий относится к чему-либо. Асинхронно ... а потом что? Подождать, пока он закончится? VBA является однопоточным, наверняка вам нужен приемник для реагирования на асинхронную обработку - и это сильно изменяет код OP. Разум, иллюстрирующий? Или это сообщение предназначалось для комментариев на ОП? 26 сен. 172017-09-26 03:35:50