Что нового

Как ускорить работу парсер-программы

Нубокодер

Новичок
Сообщения
75
Репутация
0
Пример для наглядности:

Код:
#include <IE.au3>
#include <GUIConstantsEx.au3>

Opt("WinWaitDelay", 100) ; время паузы после успешных оконных функций (по умолчанию=250)
Opt("GUIOnEventMode", 1)  ; Включает режим OnEvent (по событию)

Global $url[4] = ["", "http://www.youtube.com/channel/UCc4Gj-WdPIbF8fBmCYB2wqA", "http://yandex.ru/images/search?text=autoit", "http://games.mail.ru"]; массив адресов

$hGui = GUICreate("Окошко чтоб закрыть программу", 400, 20, 5, 5) ; создание окна
GUISetState(@SW_SHOW) ; окно видимо
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked") ; обработка закрытия программы
;RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main", "Display Inline Images", "REG_SZ","no" ) ; отключить показ картинок (, но они все равно грузятся)
$oIE = _IECreate($url[0], 0, 1, 0) ; создаю окно браузера IE

While 1

  For $i = 1 To 3
	_IENavigate($oIE, $url[$i], 0) ; переход по адресу без загрузки страницы
	_IELoadWait($oIE) ; ждем полной загрузки страницы
 	$link4 = _IETagNameGetCollection ( $oIE, 'a', 3) ; нахожу 4-ую ссылку на текущей странице браузера
 	$link4 = $link4.innertext ; выделяю текст в найденой ссылке
 	ConsoleWrite ( $i & " сайт: " & $link4 & @CRLF ) ; вывожу текст найденой ссылки в консоль
	ConsoleWrite ( @SEC & "." & @MSEC & @CRLF ) ; вывожу текущее время (сек.мсек)
	ConsoleWrite ( "-----------------------------" & @CRLF )
  Next

WEnd

;~ Функция закрытия программы:
Func _CLOSEClicked()
  If MsgBox(4 + 256, "Подтверди базар:", "Сыкануть по полной программе и свалить в ужасе?") = 6 Then
   	;RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main", "Display Inline Images", "REG_SZ","yes" ) ; включить показ картинок
    _IEQuit($oIE)
    Exit
  EndIf
  Return
EndFunc


Программа сканирует 3 интернет страницы и выводит в консоль текст 4-ой ссылки на каждой из страниц.

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

Отключение показа картинок в браузере не помогает. Картинки не выводятся, но все равно постоянно подгружаются. Время переходов остается примерно таким же.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Нубокодер
А зачем вам IE?

Для наглядности:
Код:
Global $oHTML = ObjCreate( "HTMLFILE" )

While 1
	; ~~
	$oHTML.Write( $sHtml )

	; ~~
	$links = $oHTML.GetElementsByTagName( "a" )
	; ~~

	$oHTML.Close
WEnd


$sHtml - исходный код страницы, можете получить используя:
1) InetRead
2) WinHttp.WinHttpRequest.5.1
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
firex,
Если ссылки формируются, например, при помощи javascript, то, ИМХО, объект HTMLFILE их не покажет.
 
Автор
Нубокодер

Нубокодер

Новичок
Сообщения
75
Репутация
0
IE мне нужен, потому что основная программа написана для него. Она намного сложнее, а здесь представлен всего лишь пример, чтоб акцентировать проблему. Наверно придется комбинировать ObjCreate и функции для IE, но вопрос остается прежним: как можно уменьшить время между переходами В ДАННОМ КОНКРЕТНОМ ПРИМЕРЕ?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Нубокодер [?]
IE мне нужен, потому что основная программа написана для него. Она намного сложнее, а здесь представлен всего лишь пример, чтоб акцентировать проблему.
Вы назвали свою программу парсером. Тут два варианта:
1) Возможностей HTMLFILE должно хватить (если не используется js).
2) Вы не понимаете определение "парсер".

Нубокодер [?]
В ДАННОМ КОНКРЕТНОМ ПРИМЕРЕ
Заметно - никак.
 
Автор
Нубокодер

Нубокодер

Новичок
Сообщения
75
Репутация
0
Очень жаль что никак... :( Но ответ я получил, а значит тема решена. Спасибо за помощь.
 

darkwhite

Знающий
Сообщения
129
Репутация
5
Код:
_IELoadWait($oIE) ; ждем полной загрузки страницы

попробуйте заменить ожидание, кодом проверки на наличие закрывающего тэга </body>
Код:
while 1
sleep(100)
if StringInStr ( _IEDocReadHTML ( $oIE),"</body>") then exitloop
wend

как то вот так писал по памяти так что проверяйте
 
Верх