Что нового

Ускорение получения данных с веб страницы

vovsla

Осваивающий
Сообщения
607
Репутация
36
Есть необходимость собрать все ссылки с веб страницы на заданную глубину.
Получилась вот такая функция
Код:
Func LinkGet($StartLink, $Depth)
	Dim $LinksArr[2]=[1, $StartLink]
	For $CurrentDepth=1 To $Depth
		$UBoundLinksArr=UBound($LinksArr)-1
		For $LikArrNum=$LinksArr[0] To $UBoundLinksArr
			ConsoleWrite($LikArrNum&@CRLF)
			$PageObject=_IECreate($LinksArr[$LikArrNum], 0, 0)
			If @error Then
				_IEQuit($PageObject)
				ContinueLoop
			EndIf
			$NewLinks=_IELinkGetCollection($PageObject)
			For $NewLink In $NewLinks
				_ArrayAdd($LinksArr, $NewLink.href)
			Next
			_IEQuit($PageObject)
		Next
		$LinksArr[0]=$LinksArr[0]+$UBoundLinksArr
	Next
	Return $LinksArr
EndFunc

Только работает очень медленно т.к. для сбора ссылок каждый раз есть ожидание загрузки страницы браузера.
Можно ли как-то ускорить процесс сбора?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
#Include <Array.au3>

Global $oHTTP = ObjCreate( "WinHttp.WinHttpRequest.5.1" )
Global $oHTML = ObjCreate( "HTMLFILE" )

$aTest = LinkGet('http://autoit-script.ru/index.php?topic=20290')
_ArrayDisplay($aTest)

Func LinkGet($_StartLink, $_Depth = 1)
	Const $__MAX = 9999

	Local $aLinks[$__MAX + 1] = [1, $_StartLink], $oLinks, $iLen
	; ---
    For $Depth = 1 To $_Depth Step 1
		For $Link = 1 To $aLinks[0] Step 1
			$oHTTP.Open("GET", $aLinks[$Link])
			$oHTTP.Send()
			$oHTTP.WaitForResponse

			If $oHTTP.ResponseText Then
				$oHTML.Write($oHTTP.ResponseText)
				; *
				$oLinks =  $oHTML.GetElementsByTagName("a")
				$iLen = $oLinks.Length()
				If $aLinks[0] + $iLen > $__MAX Then _
					$iLen = $__MAX - $aLinks[0]

				For $i = 0 To $iLen - 1 Step 1
					$aLinks[$aLinks[0] + $i + 1] = $oLinks.Item($i).hRef
				Next
				$aLinks[0] += $iLen
				; *
				$oHTML.Close
				If $aLinks[0] = $__MAX Then _
					ExitLoop 2
			EndIf
		Next
    Next
	ReDim $aLinks[$aLinks[0] + 1]
	; ---
    Return $aLinks
EndFunc
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Большое спасибо.
Где можно посмотреть какие объекты можно создавать с помощью ObjCreate?
И какие еще есть опции помимо ResponseText, GetElementsByTagName?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Vovsla
Почти все все как у IE.au3, можете посмотреть реализацию этой библиотеки.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384106(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/hh772960(v=vs.85).aspx
 
Верх