|
Разная скорость работы с COM объектом | ☑ | ||
---|---|---|---|---|
0
баржоми
22.10.13
✎
22:08
|
Подскажите почему огромная разница в скорости получения данных
Вариант №1 В этом варианте открываю браузер IE ПолучитьAppIE() ; url = "бла бла бла"; ДокументСайт = ПолучитьHtmlDoc(appIE,url); Для Каждого Стр из ДокументСайт.body.all Цикл Сообщить( Стр.className+ " = " + Стр.innerText); КонецЦикла; Функция ПолучитьAppIE() Попытка // создаем новый процесс приложения IE appIE = Новый COMОбъект("InternetExplorer.Application"); appIE.Visible = Истина; // не отображаем его (браузер) на экране Исключение Сообщить("Ошибка создания приложения InternetExplorer.Application..."); КонецПопытки; Возврат appIE; // вернем указатель на процесс КонецФункции Функция ПолучитьHtmlDoc(appIE,url) Попытка // загружаем страницу из интернета appIE.Navigate(url); i=0; // ждем пока загрузится страница по url Пока appIE.Busy цикл i = i + 1; сообщить(i); КонецЦикла; htmlDoc=appIE.Document; Исключение Сообщить("Ошибка создания документа html"); КонецПопытки; Возврат htmlDoc; КонецФункции Вариант №2 Размещаю на форме поле табличного документа ЭлементыФормы.Сайт.Перейти("бла бла бла"); Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл Сообщить( Стр.className+ " = " + Стр.innerText); КонецЦикла; Собственно вопрос: почему вариант №2 работает примерно в 200-300 раз быстрее? Есть необходимость использовать именно первый метод. |
|||
1
shurikvz
22.10.13
✎
23:06
|
Пока appIE.Busy цикл
i = i + 1; сообщить(i); КонецЦикла; не надо так делать. и не понял, а во втором варианте где ожидание окнчания загрузки страницы? В первом ждем, а во втором пофиг? Или тогда пояснить: в чем именно вариант 2 работает в 200 раз быстрее. |
|||
2
Нуф-Нуф
23.10.13
✎
09:35
|
(1) как я понимаю в первом варианте открывается ИЕ, в нем получается страница, и средствами ие перебирается страница.
во втором случае страница открывается в 1с в поле хтмл и перебирается средствами 1с. |
|||
3
баржоми
23.10.13
✎
09:49
|
(1) В втором варианте дожидаюсь открытия страницы путем вот такой проверки (дожидаюсь в коде появления текста "Мы в Контакте" - это самый низ страницы):
Пока Найти(ЭлементыФормы.Сайт.ПолучитьТекст(),"Мы в Контакте") = 0 Цикл пауза(1); счетчикСекунд = СчетчикСекунд+1; Если СчетчикСекунд > 60 тогда ОснСтрока.Комментарий= "Ошибка сервера"; Возврат Ложь; Прервать; КонецЕсли; КонецЦикла; |
|||
4
баржоми
23.10.13
✎
09:54
|
(2) Да. Все верно
Вариант №1 предполагает открытие интернет эксплорера в отдельном окне, где пробегаюсь по нему циклом Для Каждого Стр из ДокументСайт.body.all Цикл Вариант№2 предполагает открытие страницы на форме обработке, где таким же циклом пробегаюсь по странице Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Вроде бы и там и там COM объект, а вот именно скорость перебора циклом существенно разная Мне по ряду причин необходимо использовать именно вариант№1 (интернет эксплорер в отдельном окне), но так очень долго перебор в цикле работает |
|||
5
Нуф-Нуф
23.10.13
✎
10:03
|
не с той стороны, но все же, почему нельзя использовать второй вариант? с обработкой?
|
|||
6
баржоми
23.10.13
✎
10:08
|
(5) Может быть и можно, но я не нашел способа как сделать одновременно обращение к нескольким сайтам (т.е. не по очереди, а именно параллельно).
А вот при использовании интернет эксплорера- то пожалуйста, наплодил сколько нужно окон и работай с ними + когда работаешь на форме (ПолеHTMLДокумента), то возникают проблемы с скриптами майлру, гугла (соц сети). Выходит надпись "Произошла ошибка скрипта" и кнопочки продолжить ДА НЕТ (настройки интернет эксплорера крутить не помогает) |
|||
7
arsik
гуру
23.10.13
✎
10:16
|
(0) Тебе уже написали - убери "сообщить(i);"
|
|||
8
баржоми
23.10.13
✎
10:17
|
(5) В продолжение
При работе именно с окном интернет эксплорера можно использовать свойство объекта Silent (Управляет возможностью выдачи обозревателем диалоговых окон о критических ошибках и сообщений безопасности (булево). ) |
|||
9
баржоми
23.10.13
✎
10:19
|
(7) Убрано. некорректно скопировал из кода. Но в там милисекунды на самом деле. Долго идет именно перебор Для Каждого Стр из ДокументСайт.body.all Цикл
|
|||
10
arsik
гуру
23.10.13
✎
10:29
|
ДокументСайт.body.all - а что это. Может его каким то образом в массив можно закинуть?
|
|||
11
Нуф-Нуф
23.10.13
✎
10:30
|
(10) имхо поле HTML
|
|||
12
баржоми
23.10.13
✎
10:33
|
(10) Это СОМ объект полученный вот так:
ПолучитьAppIE() ; url = "http://www........."; ДокументСайт = ПолучитьHtmlDoc(appIE,url); Где: Функция ПолучитьAppIE() Попытка // создаем новый процесс приложения IE appIE = Новый COMОбъект("InternetExplorer.Application"); appIE.Visible = Истина; // не отображаем его (браузер) на экране Исключение Сообщить("Ошибка создания приложения InternetExplorer.Application..."); КонецПопытки; Возврат appIE; // вернем указатель на процесс КонецФункции // Получаем объект DOMDocument с помощью приложения InternetExplorer.Application Функция ПолучитьHtmlDoc(appIE,url) Попытка // загружаем страницу из интернета appIE.Navigate(url); i=0; // ждем пока загрузится страница по url Пока appIE.Busy цикл i = i + 1; //сообщить(i); КонецЦикла; // получаем html-страницу как DOM (объектная модель документа) htmlDoc=appIE.Document; // body = appIE.Document.getElementsByTagName("body"); Исключение Сообщить("Ошибка создания документа html"); КонецПопытки; Возврат htmlDoc; КонецФункции А вот если бы его в массив запихнуть, то наверное все проблемы бы и исчезли. Пробовал даже скопировать его (СОМ объект) на ПолеХТМЛДокумента на форме, не дает, говорит что поле объекта недоступно для записи |
|||
13
kiruha
23.10.13
✎
10:33
|
(9)
А в каком случае перебор свойств внешнего com объекта идет быстро ? Я таких не знаю. Поэтому и юзают ComSafeArray и цельную выгрузку листа Exel например |
|||
14
баржоми
23.10.13
✎
10:36
|
(11) А как быть с тем что у меня одновременно обращение к 15 страницам должно быть? Сделать просто 15 ПолеHTMLДокумента на форме и по очереди каждому сказать Перейти (Navigate) и не заморачиваться?
|
|||
15
баржоми
23.10.13
✎
10:38
|
(13) Быстро идет когда на форме создаю ПолеHTMLДокумента (HTMLDocumentField) и использую 1совский метод Перейти (Navigate)
тогда да. быстро идет перебор Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл где Сайт - Поле ХТМЛ документа |
|||
16
kiruha
23.10.13
✎
10:41
|
Ты разницу между объектом 1С и com объектом совсем не различаешь ?
|
|||
17
kiruha
23.10.13
✎
10:42
|
Есть еще объект ДокументHTML
|
|||
18
баржоми
23.10.13
✎
10:44
|
(17) Можно чуть поглубже мысль развернуть? И да есть пробелы в знаниях. Потому и спрашиваю
|
|||
19
kiruha
23.10.13
✎
10:47
|
1С медленно работает с перебором свойств не родных com объектов, а не только с html. Поэтому нужно использовать по возможности внутренние объекты 1С и операции массовой загрузки
|
|||
20
Нуф-Нуф
23.10.13
✎
10:51
|
ну если действительно чужой комобъект работает медленее, тогда действительно - 15 полей и работа с ними.
или 15 раз запускать обработку через фоновое задание. |
|||
21
баржоми
23.10.13
✎
10:54
|
(19) Спасибо. Стало понятнее почему так.
Т.е. мне есть смысл почитать про ComSafeArray и использовать массовую загрузку с чужого СОМ объекта? |
|||
22
kiruha
23.10.13
✎
11:02
|
(21)
Лучше про ДокументHTML |
|||
23
баржоми
23.10.13
✎
11:25
|
(22) Но к сожалению это не решает проблемы "ошибка выполнения скрипта на странице". При использовании внутреннего объекта 1С нет метода Silent
|
|||
24
Serginio1
23.10.13
✎
14:27
|
(19) Внутренние сервера (DLL) работают тоже быстро. А вот с внешними (.exe) из-за маршалинга между процессами беда.
InternetExplorer.Application соответствует ielowutil.exe |
|||
25
kiruha
23.10.13
✎
14:42
|
(24)
А как тут применить DLL ? А в vbscript ? |
|||
26
kiruha
23.10.13
✎
14:43
|
в смысле есть DLL для доступа к страницам HTML ?
|
|||
27
Serginio1
23.10.13
✎
15:08
|
(25) Например самому написать или воспользоваться нетовским враппером v8: Вопрос по NetObjectToIDispatch
|
|||
28
shurikvz
23.10.13
✎
15:51
|
да, не поленился посмотрел, действительно с ком объектом обход дольше.
Возник вопрос - а для чего document.body.all? Не проще ли получить только нужные HTMLЭлементы и с ними работать (getElementsByTagName, getElementByID)? И потом - действительно ли нужно параллельно парсить 15 страниц? Да, возможно удастся сэкономить время на параллельной загрузке страниц (еще смотря как код написать), но обработка результата то все равно последовательно в одном потоке идти будет. |
|||
29
баржоми
23.10.13
✎
16:04
|
(28) Страничка полностью в даже браузере гугл хром подгружается примерно за 2-4 секунды (отвечает медленно сам сайт). Если последовательно делать, то только на загрузку страниц уйдет до 1 минуты
А вот за getElementsByTagName, getElementByID спасибо, упустил я это из виду. Сейчас попробую |
|||
30
shurikvz
23.10.13
✎
16:20
|
(29) Я даже больше подскажу: все зависит от того что за сайт, и какие данные с него получить надо. Если там не используются всякие относительно новомодные ajaxы, и какая-нибудь еще браузероспецифичная хрень, не нужен программный серфинг по сайту, то вообще можно использовать класс 1С HTTPСоединение, послать гет запрос, и получить тело html страницы. Как дом-документ парсить естественно не получится, но если известно что ищешь, просто пользоваться поиском по строке, ну или подключить регулярные выражения.
|
|||
31
kiruha
23.10.13
✎
17:55
|
(27)
Круто. Может на инфостарт выложишь ? |
|||
32
Serginio1
23.10.13
✎
18:22
|
(31) Может быть. Сейчас кстати прикручиваю к семерке для вэб сайтов. Но этим больше пользуется oleg_km
наверное у него уже больше наработок. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |