web scraping vba "Объектная переменная или с блочной переменной не установлена ​​ошибка" и сбой браузера

поэтому я пытаюсь очистить данные с нескольких веб-сайтов в excel. Я думаю, что код хорошо работает в теории, хотя у меня есть «Object variable» или «Block block not set error».

Первая проблема, с которой я сталкиваюсь, заключается в том, что иногда она отлично отходит от 2 до 10 и вставляет каждый бит данных, но иногда я получаю ошибку и вижу, что вставлено только 1 или 2 строки данных. Я действительно не мог понять, что может быть причиной на этом этапе.

Во-вторых, это своего рода демо-код. Я использую только небольшую партию данных и зацикливаю ее. Моя реальная цель – найти способ включить веб-поиск до 100 строк без сбоев моего компьютера или браузера. Было бы лучше, если бы я конвертировал свой код в стирание типа XMLHTTP, если да, то как я могу это сделать.

Заранее спасибо

Private Sub CommandButton1_Click() Dim ie As Object Dim iexp As Object Dim firstname(1 To 10), lastname(1 To 10) As Variant Dim mm(1 To 10), dd(1 To 10), yyyy(1 To 10) As Integer Dim PhoneNumber(1 To 10) As Variant Dim Address(1 To 10) As Variant Dim HomeValue(1 To 10) As Variant Dim i As Integer For i = 2 To 10 'get variables from excel sheet1 and search on peoplefinders.com firstname(i) = Sheet1.Cells(i, 1).Value lastname(i) = Sheet1.Cells(i, 2).Value mm(i) = Sheet1.Cells(i, 3).Value dd(i) = Sheet1.Cells(i, 4).Value yyyy(i) = Sheet1.Cells(i, 5).Value Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.Height = 1000 ie.Width = 1000 ie.navigate ("http://www.peoplefinders.com/peoplesearch/searchresults?search=People&fn=" & firstname(i) & "&mn=&ln=" & lastname(i) & "&city=&state=&age=&dobmm=" & mm(i) & "&dobdd=" & dd(i) & "&doby=" & yyyy(i)) Do While ie.Busy: DoEvents: Loop Dim Doc As HTMLDocument Set Doc = ie.document 'get elements and insert into cells in sheet 1 PhoneNumber(i) = Doc.getElementsByTagName("td")(2).getElementsByTagName("a")(0).innerText Address(i) = Doc.getElementsByTagName("td")(1).getElementsByTagName("a")(0).innerText Sheet1.Cells(i, 6).Value = PhoneNumber(i) Sheet1.Cells(i, 7).Value = Address(i) 'modify address for next search a = Split(Address(i), " ") b = Join(a, "-") 'search home value on zillow.com Set iexp = CreateObject("InternetExplorer.Application") iexp.Visible = True iexp.Height = 1000 iexp.Width = 1000 iexp.navigate ("http://www.zillow.com/homes/" & b & "_rb/") Do While iexp.Busy: DoEvents: Loop Dim Doc2 As HTMLDocument Set Doc2 = iexp.document iexp.navigate ("http://www.zillow.com/homes/" & b & "_rb/") 'insert home value into cells in sheet 1 HomeValue(i) = Doc2.getElementsByClassName("home-summary-row")(1).getElementsByTagName("span")(1).innerText Sheet1.Cells(i, 8).Value = HomeValue(i) Next End Sub 

Как указал Керем Тургутлу, проверяя, достаточно ли занятого Busy, вам нужно также проверить readystate. Вот как я это делаю:

 Sub WaitBrowser(browser As Object) Do While browser.Busy DoEvents Loop Do While browser.readyState <> 4 DoEvents Loop End Sub 

Затем я вызываю WaitBrowser IE после каждой навигации (где IE – это мой объект InternetExplorer.Application ), прежде чем вмешиваться в элементы документа.

Что касается других методов, когда это возможно, ради эффективности и предсказуемости я предпочитаю отправлять HTTP-сообщения напрямую с помощью API (я обычно использую WinHTTP, но, возможно, также можно использовать XMLHTTP или winInet). Два примечательных исключения: 1) Я хочу направить пользователя в браузер во время или после обработки или 2) есть сложные сценарии, связанные с поиском того, что отправить, чтобы получить нужные данные (в этом случае проще сделать браузер работа).

Вот пример, адаптированный из недавнего проекта (без проверки ошибок):

 Function FindLink() As String Dim Request as Object Set Request = CreateObject("WinHttp.WinHttpRequest.5.1") Request.Open "GET", "http://example.com/pagewithinfo" Request.Send Dim resp as String resp = Request.ResponseText 'create html tree with response Dim h As Object Set h = CreateObject("htmlfile") h.body.innerHTML = respA 'get the info FindLink = h.DocumentElement.GetElementsByTagName("a")(0).GetAttribute("href") Set h = Nothing Set Request = Nothing End Function 
  • Как проверить частичное совпадение строк в getelementById при очистке
  • Доступ к встроенным элементам HTML с помощью VBA Web Automation
  • Макрос Excel для сохранения веб-сайта
  • Скребок сети супермаркетов Аргентины
  • относительный путь для Excel в файле конфигурации весны
  • Какой самый простой способ создать «пожалуйста, подождите» или что-то подобное в ASP.NET
  • Сжатие данных VBA с использованием выпадающего списка
  • Получение данных с веб-страницы в Excel с помощью VBA
  • Требуется ли установить MS excel на сервере для запуска макросов из веб-приложения?
  • Почему эта функция PHP PDO не возвращает значение из базы данных?
  • Комплексная веб-скребка VBA
  • Interesting Posts

    У меня есть sql сгенерированный отчет с данными вроде 24-1, но при генерации в excel он отображается как 24-jan, … что такое решение в sql?

    Выберите столбец по букве из activeCell (без activeCell.EntireColumn)

    Создание нового вектора на основе пары уровней в R или Excel

    Не удалось ссылаться на именованный диапазон в VBA – диапазон метода объекта _global не удалось

    Как вернуть массив определенных пользователем типов, а затем передать в качестве аргумента в VBA

    Подмножество подписок для MS Access Tables в MS Excel с VBA

    VLOOKUP не дает ожидаемых результатов

    Формула в ячейках отсутствует после запуска VBA Macro

    Вызов события нажатия кнопки из суб, не зная имя кнопки перед запуском суб

    Ошибка удаления объекта диаграммы

    как передать значение активной ячейки URL-адресу в коде exca vba

    Печать 3 переменных из макроса вместе с выбранными строками

    Excel INDEX MATCH извлекает информацию случайным образом

    Поиск слова в заголовках и столбец для использования в вычислениях в Excel VBA

    Целевая ячейка Excel VBA при изменении, а затем игнорировать

    Давайте будем гением компьютера.