Страницы: 1
RSS
Многопоточность или ее имитация, Загружаем несколько сайтов одновременно!
 
Во вложении класс и пример работы с ним!
Очень много времени трачу именно на загрузку страниц и т.д. сейчас активно читаю MSDN  и забугорные форму и как это реализуется на других языках, cURL  и т.д. ищу альтернативу особенно ИНДУССКОМУ IE (ой как они его любят же).
В общем случае мы используем один из этих объектов и получаем ответы от сервера так:
Код
  'Dim XMLHttp As Object: Set XMLHttp = CreateObject("Microsoft.XMLHTTP") 
  'Dim XMLHttp As Object: Set XMLHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
  'Dim XMLHttp As Object: Set XMLHttp = CreateObject("MSXML2.ServerXMLHTTP")
  'Dim XMLHttp As Object: Set XMLHttp = CreateObject("MSXML2.XMLHttp") '
  'Dim XMLHttp As Object: Set XMLHttp = New WinHttpRequest
  XMLHttp.Open "GET", "site.com", False 'OR "POST" type and True for redirect
  'XMLHttp.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
  'XMLHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  'XMLHttp.SetRequestHeader "Cache-Control", "no-store, no-cache"
  'XMLHttp.SetRequestHeader "Pragma", "no-cache"
  'XMLHttp.Send StrConv("title=Title&cat=Cat&post=PostText&pas=tipapass", vbFromUnicode)
  XMLHttp.Send '"title=Title&cat=Cat&post=PostText&pas=tipapass" << тут дольше всего висит
  Debug.Print XMLHttp.ResponseText
  Set XMLHttp = Nothing
 
Если кто сталкивался или знает  XMLHttp.Send действительно отправляет и ждет ответа или может только отправить и не ждать или он и так только отправляет
какие еще есть варианты?

По сути в общем смысле идея следующая:
1)сделать или массив или несколько объектов через рекурсию, любого из перечисленных выше или может даже IE
2)создали, отправили сайт на загрузку, проверили загрузился или нет 1 раз, если нет:
2.1)создали, отправили сайт на загрузку, проверили загрузился или нет ПЕРВЫЙ САЙТ, потом наш, если нет:
2.n)создали, отправили сайт на загрузку, проверили загрузился или нет ПЕРВЫЙ САЙТ, если да - забрали данные, убили обьект, проверили следующий, до n

Реально ли так сделать? - пока еще думаю на счет реализации и преимущества в скорости.
Пока по сравнению всех выше перечисленных объектов WinHttp.WinHttpRequest.5.1 - работает дольше всех в 2.5 раза, но грузит все сайты (и китайские) с любого URL, у него есть TimeAut, если сильно долго грузится и т.д., в теории есть и
Цитата
WaitForResponse
Specifies the wait time, in seconds, for an asynchronous Send method to complete, with optional time-out value.
но пока я не вычитал как им пользоваться и можно ли на VBA.
Во вложении класс и пример работы с ним!
Изменено: Иван - 22.10.2014 11:16:16 (Первая часть ответа - готова)
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Цитата
в теории есть и WaitForResponse но пока я не вычитал как им пользоваться и можно ли на VBA
у меня на сайте есть пример:
http://excelvba.ru/code/GetHTTPResponse


Код
Const TIMEOUT& = 6    ' в секундах

Function GetResponse(ByVal URL$) As String
    On Error Resume Next: Err.Clear
    Static xmlhttp As WinHttpRequest
    If xmlhttp Is Nothing Then Set xmlhttp = New WinHttpRequest

    xmlhttp.Open "GET", URL$, True: DoEvents
    xmlhttp.Send: DoEvents

    If Not xmlhttp.WaitForResponse(TIMEOUT&) Then
        Debug.Print "timeout", URL: Exit Function
    End If

    GetResponse = xmlhttp.responsetext
End FunctionSub test() ' пример использования
   On Error Resume Next
    txt = GetResponse("http://ExcelVBA.ru/")
    Debug.Print Len(txt) ' возвращает длину текста: 62737 символов
End Sub 

Цитата
Реально ли так сделать?
думаю, да
но сложно
сам подумывал сделать такое для своей программы Парсер сайтов,
но пока обхожусь однопоточной загрузкой

ваши варианты вряд ли подойдут
при асихнронном запросе макрос висит на строке WaitForResponse
при синхронном - на строке Send
(т.е. пока ответ сервера не получен, - другие команды макросов выполняться не будут, - т.к. VBA однопоточный)

как вариант, - написать отдельный компонент (не на VBA)? подключить к проекту, - и через него работать с многопоточностью
 
О Значит кто-то все-таки сталкивался и проверял, да ваш сайт вообще нечто - он меня  и вдохновил и обучил за прошлый год и сейчас переодически смотрю обновления.
Цитата
Игорь пишет:  (т.е. пока ответ сервера не получен, - другие команды макросов выполняться не будут, - т.к. VBA однопоточный)
как вариант, - написать отдельный компонент (не на VBA)? подключить к проекту, - и через него работать с многопоточностью
Да об этом то и идет речь минимальная мысль это IE их можно много открывать и проверять загруженность страницы (но он долго грузит), далее средства cURL или чего-то подобного (сейчас уже пытаюсь реализовать проблема в передаче данных или через буфер или файлы) + ко всему у нас есть CMD, в котором что-то можно выделить, но опять-же не хотелось бы батник таскать с программой (нужно программно создавать) и т.д.                                                                                             Сейчас еще смотрю что можно сделать написав ADD IN для VBA по типу MZTOOLZ, какие там есть возможности.
Как вариант думаю написать что-то на Delphi или C++.
Изменено: Иван - 20.10.2014 23:48:30
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Пока только реальный способ только через ИЕ, даже вот
Скрытый текст

Очень интересная статья, где все есть  :)  
http://www.tushar-mehta.com/publish_train/xl_vba_cases/vba_web_pages_services/index.htm#_Toc173749354
занимаюсь переводом стать, выложу тут

только что вспомнил, когда делал и искал таймер нашел асинхронный таймер на вба, который работал прекрасно!
к Стати вот нашел ту статью на хабре http://habrahabr.ru/sandbox/67296/ (про таймер)
Изменено: Иван - 01.07.2015 20:45:23
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Цитата
когда делал и искал таймер нашел асинхронный таймер на вба, который работал прекрасно!
не обязательно изобретать велосипеды даже с таймером
достаточно поискать простое решение у меня на сайте :)
http://excelvba.ru/code/timer/htmlfile
 
Ну вот ночь не прошла даром и после долгого покраснения моих глаз, а потом ОТЛИЧНОГО СНА (очень рекомендую тем у кого-то что-то не получается) мы получили пока следующее:
Module - Test Async
Скрытый текст
class CXMLHTTPHandler
В этом классе есть 1 секрет который мы не видим и из-за чего все это дело работает, а именно:
1)нужно удалить и експортировать код
2)через блокнот или что-то подобное открыть и дописать после: "Sub OnReadyStateChange()" строчку "Attribute Value.VB_UserMemId = 0"
3)снова импортировать и смотреть на результат, взято из статьи http://www.cpearson.com/excel/DefaultMember.aspx
Скрытый текст


И что вы думаете - работает  :)  , да еще и как, как минимум, нет подвисания, а значит можно спокойно делать все что угодно пока грузится(как минимум Ваш PI прогресс не висит, а это уже что-то),
НО после прочтения первой статьи я понял что нельзя загружать несколько сайтов одновременно, только делать что-то другое т.к. обьект 1 и класс 1, дальше напишу как сделать так чтоюы можно было несколько сайтов загружать одновременно.
И еще не знаю что делать если выключена библиотека с MSXML2.XMLHttp?
П.С. Начал переводить главную статью готово  на 10%
Изменено: Иван - 24.10.2014 14:08:50
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Цитата
Иван пишет:  что делать если выключена библиотека с MSXML2.XMLHttp
Через CreateObject её, поздним связыванием...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
В свое время делал через vbs.
Черпал идею отсюда

пример в hta
 
Интересно конечно, я еще посмотрю, но для этого нам нужно что? - таскать с собой этот файл или в создавать считывать из него и т.д. в любом случае использовать не ОЗУ, а тормознутый ВИНТ, что ой как не хорошо и тормозит, конечно по сравнению с тем что сейчас есть, лучше, но все-равно немного не-то.

Еще перевожу статью, как переведу - выложу, статья офигенная  и результат - тот что нужно!
Смысл тот же что и в предыдущем сообщении, но теперь можно делать сколько угодно асинхронных запросов!

 цепочка:
1)запрос пользователя (список сайтов, ссылок, запросов ...)
2) отправка запросов (ждем по вайлу пока одна из глобальных переменных не поменялась) , как только меняется
3.1)пошел запрос на следующий сайт в эту глобальную переменную
3.2)выполняем действие с переменной, после обработки ее идем к пункту 2)
4)обработано все, запись данных

Выложу код главный сюда:

Скрытый текст
и класс:
Скрытый текст
Изменено: Иван - 24.10.2014 14:08:17
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
не надо ничего таскать, там обычный vbs.
 
Статью почти перевел, есть еще пару вопросов и мне нужна Ваша помощь.
1)Пока не пойму как реализовать CreateObject, с поздним связыванием...
2)Почему-то некоторые сайты не грузились, когда заменил на MSXML2.ServerXMLHTTP - пошло, но намного медленней и хочу реализовать следующее:
Использовать сначала  MSXML2.XMLHTTP, а если будет ошибка - то  MSXML2.ServerXMLHTTP (Хотя нет знаю, создам 2 копии классов и функций, просто буду при ошибке вызывать другой)
Сейчас протестировал и MSXML2.XMLHTTP работает но через раз.

Заменил все объявления MSXML на Object и связал в одном месте, только что протестировал - все прекрасно работает.
Но проблема с загрузкой через раз - остается.
1)Решено
2)Тоже вроде решено

уже встраиваю в один из проектов - прирост скорости ОГРОМНЫЙ + никаких подвисаний, сейчас делаю краштесты, возможно получится что-то уложить буду по десятку страниц сверху загружать.
Изменено: Иван - 22.10.2014 23:51:02
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Как бы это смешно не звучало, но у меня проблема с синхронизацией асинхронного модуля)))
Сам модуль пока не готов, но вот то что сейчас использую:


Скрытый текст
и сама процедура, парсим ссылки на картинки

Скрытый текст
Исправил предварительно записав переменную т.е. вместо
Код
      Set FindsImg = GetTxt(AsyncXMLHttpResponse(I - 2), "src=.(.*?\.(\w){3})(.\d{1,}){1,}\.\w{3}""")
Код
       html$ = AsyncXMLHttpResponse(I - 2)
       Set FindsImg = GetTxt(html$, "src=.(.*?\.(\w){3})(.\d{1,}){1,}\.\w{3}""")
 
Изменено: Иван - 24.10.2014 14:07:23
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Для удобства чтения темы прячьте листинги под спойлер (кнопка "sp" видна при формировании сообщения).
 
в общем в результате сейчас получился вот что-то вроде такого поисковика, мои способности + слабенький дизайнер и это все прямо в екселе:
Изменено: Иван - 27.10.2014 01:07:09
Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле.
 
Добрый день! При запуске Skype появляется окно с ошибкой:
Во время выполнения произошла ошибка.
Запустить отладку?
Строка: 1
Ошибка: XMLHttpReguest - определение отсутствует.
               ДА                     НЕТ
После нажатия на НЕТ
Во время выполнения произошла ошибка.
Запустить отладку?
Строка: 8
Ошибка: window. msrCrypto/suble - есть null или не является объектом.
              ДА                      НЕТ
ЧТО ЭТО вообще такое?? Будет ли это мешать работе Skype? Я в этом ничего не понимаю. Нади ли что-то с этим делать? Объясните, пожалуйста, кто знает. А то просто раздражает, когда чего-то вдруг вылазит, а ты не понимаешь что нужно делать или может , наоборот ничего не делать? Спасибо.
 
Каким боком Ваш вопрос связан с Excel?
Страницы: 1
Читают тему
Наверх