Что нового

_IENavigate и ошибка Invalid Object Type

Gealut

Новичок
Сообщения
38
Репутация
0
У меня скрипт перебирает список ссылок из текстового файла, открывает каждую в эксплорере, считывает нужную информацию и записывает в выводной файл.

За открытие нужной страницы в эксплорере отвечает вот эта функция:

Код:
Func MyIENavigate($aI, $ssyl)
	While 1
		_IENavigate($aI, $ssyl, 0)
		If @error = 1 Or @error = 3 Or @error = 4 Or @error = 8 Then
			; 1 - General Error
			; 3 - Invalid Data Type
			; 4 - Invalid Object Type
			; 8 - Access Is Denied
			ErrorLogWrite("Ошибка _IENavigate (" & @error & ") открытия страницы " & $ssyl)
			Sleep(60000)
			$aI = _IECreate()
			Sleep(5000)
			ContinueLoop
		ElseIf @error = 6 Or @error = 9 Then
			; 6 - Load Wait Timeout
			; 9 - Client Disconnected
			ContinueLoop
		EndIf
		; Раз пришли сюда - ошибки не было
		; То есть надо только подождать
		_IELoadWait($aI, 1000, 10000)
		If @Error = 0 Then ExitLoop
		If @error = 1 Or @error = 3 Or @error = 4 Or @error = 8 Then
			; 1 - General Error
			; 3 - Invalid Data Type
			; 4 - Invalid Object Type
			; 8 - Access Is Denied
			ErrorLogWrite("Ошибка _IELoadWait (" & @error & ") открытия страницы " & $ssyl)
			Sleep(60000)
			$aI = _IECreate()
			Sleep(5000)
			ContinueLoop
		Else
			; 6 - Load Wait Timeout
			; 9 - Client Disconnected
			ContinueLoop
		EndIf			
	WEnd
	Return $aI
EndFunc


К сожалению, через каждые 1000-3000 ссылок возникает ошибка номер 4 (Invalid Object Type), в основном у _IENavigate, но иногда и у _IELoadWait. Я пытался ее победить путем создания новой копии IE, но не очень это помогает - после создания 3-4 копий эксплорер перестает вообще загружать ссылки. Вот кусочек сгенеренного функцией лога:

Код:
=== Start Program: 09.11.2011 15:18:12
09.11.2011 17:11:04   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0098067-photo
09.11.2011 17:12:16   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0098068-photo
09.11.2011 17:14:37   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0098069-photo
09.11.2011 17:16:12   Ошибка _IENavigate (3) открытия страницы http://www.inmagine.com/ishop_single/bw0098069-photo
09.11.2011 17:17:25   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0098070-photo
09.11.2011 17:50:11   Ошибка _IELoadWait (4) открытия страницы http://www.inmagine.com/ishop_single/bw0146068-photo
09.11.2011 17:51:24   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0146069-photo
09.11.2011 17:52:59   Ошибка _IENavigate (3) открытия страницы http://www.inmagine.com/ishop_single/bw0146069-photo
09.11.2011 18:13:45   Ошибка _IELoadWait (4) открытия страницы http://www.inmagine.com/ishop_single/bw0146070-photo
09.11.2011 18:18:09   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0146071-photo
09.11.2011 18:19:22   Ошибка _IENavigate (4) открытия страницы http://www.inmagine.com/ishop_single/bw0146072-photo

Пример списка ссылок:

http://www.inmagine.com/pdrb164/pdrb164001-photo
http://www.inmagine.com/pdrb164/pdrb164002-photo
http://www.inmagine.com/pdrb164/pdrb164003-photo
http://www.inmagine.com/pdrb164/pdrb164004-photo

Между открытиями страниц в скрипте задана пауза в 2 сек, перед открытием новой копии IE пауза на 60 сек.

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

Может, кто-нибудь что-нибудь подскажет на эту тему? Не смог ничего внятного найти ни на этом форуме, ни на английском.

Спасибо.
 

shakur

Осваивающий
Сообщения
76
Репутация
24
Я пытался ее победить путем создания новой копии IE, но не очень это помогает - после создания 3-4 копий эксплорер перестает вообще загружать ссылки
Обьекты IE остаются в памяти? выгружать хоть не забываете?

по-моему ф-ция бред, сорри если грубо) зачем такие сложности? для решения вашей задачи разве такого скрипта не достаточно?
Код:
#include <IE.au3>
#include <file.au3>

dim $url[1]

$oIE = _IECreate("about:blank",0,0)
_FileReadToArray ("файл ссылок",$url)

for $i = 1 to $url[0]
 _IENavigate($oIE, $url)
 ;sleep(1000)
if @Error then
 $i -= 1 
; пробуем еще раз...
; или 
 ContinueLoop ; пропускаем эту ссылку
 
endif
 ; считываем данные с веб-страницы....
 ;записываем в файл
Next
_IEQuit($oIE)
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
Особых отличий предложенного вами варианта от моего не вижу. Кроме того, что у вас ожидание окончания загрузки страницы возложено на _IENavigate. У меня тоже когда-то так было сделано в одной из старых версий (я этот скрипт уже года полтора как постоянно совершенствую). Но потом я от этого варианта отказался, сейчас уже не помню почему и перешел на ожидание окончания загрузки страницы через _IELoadWait.

В любом случае, речь идет именно о том, что _IENavigate не может загрузить какую-нибудь страницу. И дело не в странице - после перезапуска скрипта он эту страницу прекрасно обрабатывает. В последний раз когда скрипт так завис Internet Explorer не показывал никакой страницы, а при наведении курсора выдавал всплывающее сообщение, что он не может загрузить страницу.

И ошибка не стабильна - иногда скрипт получает ее через ~1000 открытых страниц, иногда после пары тысяч, а иногда может отработать файл с 20 тысячами ссылок без каких-либо ошибок. Скрипт эксплуатируется на 3-4 компьютерах одновременно, на ноуте по вай-фаю ошибки чаще.

В принципе, на английском форуме я нашел совет перейти на Autoit последней беты, так как проблема может быть в связке IE.au3 и Internet Explorer 9. Только не очень хочется этого делать, в скрипте на данный момент уже больше 3000 строк кода, а при переходе на бету могут полезть ошибки в других частях скрипта... :(
 

shakur

Осваивающий
Сообщения
76
Репутация
24
пробывали работать с объектом Shell.Explorer.2? как он себя ведет?
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
Нет, не пробовал. Даже не думал о таком варианте. Буду курить доку, но проблем будет явно больше, чем есть сейчас: надо будет переписывать все куски кода, в которых используются такие функции как _IEImgGetCollection, _IETagNameGetCollection, _IETableGetCollection.

Сегодня утром откатил на одном ноуте (с win7) IE9 до IE8. С тех пор обработано примерно 6000 ссылок, ошибок не было. Это, конечно, на решение проблемы не тянет, только как временная "заплатка".
 

shakur

Осваивающий
Сообщения
76
Репутация
24
надо будет переписывать все куски кода, в которых используются такие функции как _IEImgGetCollection, _IETagNameGetCollection, _IETableGetCollection
та ни чего не надо переписывать...
Код:
...
$Form1 = GUICreate("ы", 1190,1250,  @DesktopWidth/2-190, @DesktopHeight/2-250)
$oIE = ObjCreate("Shell.Explorer.2")
$GUIActiveX = GUICtrlCreateObj($oIE, 215, 0, 435, 600)
;GUISetState(@SW_SHOW)
...

а далее работаем с переменной $oIE, как мы бы и работали в случае
Код:
$oIE = _IECreate("about:blank",0,0)



Добавлено:
Сообщение автоматически объединено:

считывает нужную информацию
а кокого вида инфу вы считываете, мб не стоит загружать каждый раз URL в браузере?, а воспользоватся
Код:
_INetGetSource

получать исходный код страницы и ...
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
Спасибо за Shell.Explorer.2, не знал про такую возможность, интересный вариант.

Сделал так (размеры - чтобы выводить на инфпанель скрипта):

Код:
Global $MyIE = ObjCreate("Shell.Explorer.2")
...
$GUIActiveX = GUICtrlCreateObj ($MyIE, 8, 208, 369, 128)
$MyIE.navigate("about:blank")


и функцию открытия страниц:

Код:
Func MyIENavigate($ssyl)
	$MyIE.navigate($ssyl)
	While $MyIE.readyState <> 4
		Sleep(100)
	WEnd
EndFunc


Теперь надо время, чтобы потестилось. На трех компах уже запущен такой вариант. Завтра-послезавтра будет статистика, падает или нет.

Надо еще подумать нельзя ли масштабировать выводимые страницы до размеров созданного окна... Это так, пришло в голову пока писал пост... :smile:
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
В общем, решение оказалось довольно неплохое. Конечно, Shell.Explorer.2 более тормозной, чем IE, страницы в себя грузит медленнее, так что скрипт больше времени тратит на обработку каждой ссылки. Но это буду оптимизировать в дальнейшем, пока же главное, что не глючит.

Еще скрипт с использованием Shell.Explorer.2 начал есть лишнюю память, на ноуте чуть меньше чем за сутки обработал 9000 ссылок и сказал "Out of memory". Но я откопал на английском форуме функцию _ReduceMemory, она неплохо помогает. В любом случае, это уже другая тема.

Спасибо shakur за помощь.
 

darkwhite

Новичок
Сообщения
129
Репутация
4
пробывали работать с объектом Shell.Explorer.2? как он себя ведет?
В общем, решение оказалось довольно неплохое. Конечно, Shell.Explorer.2 более тормозной, чем IE, страницы в себя грузит медленнее, так что скрипт больше времени тратит на обработку каждой ссылки. Но это буду оптимизировать в дальнейшем, пока же главное, что не глючит.
Более чем странно )) ведь Shell.Explorer.2 урезанный по возможностям ( и то лишь по нескольким) IE ) :scratch:
 
Верх