Что нового

[Заезженно :) ] Асинхронная загрузка(скачивание) Веб Страниц

ivanius

Знающий
Сообщения
74
Репутация
5
У меня уже написана функция которая через WinHttp.WinHttpRequest.5.1 отправляет и получает нужные мне данные (HTML таблица-страница, версия для печати) и сохраняет ее в файл, которая находится в отдельном модуле.
Сервер оооочень долго думает (около 4х секунд) на каждую страницу, а их достаточно много, поэтому нужно сделать это асинхронно, при этом сообщая Главному скрипту ошибки или успешное завершение (Container.au3 или Messages.au3)
3 часа посмотрев форум и подумав нашел 2 варианта:
1)Написать отдельный Exe в 1 функцию, который будет принимать параметры или как-то прямо из скрипта генерировать новый процесс отдельного скрипта (давно находил тему, но потерялась).
2)Найти как отправлять POST запросы через InetGet
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если создать на каждый запрос свой WinHttp.WinHttpRequest.5.1, то, видимо работает.
Вот пример, конечно грубый и несовершенный с точки зрения кодинга, это все можно сделать одной функцией итп итд, но он только лишь для того, что бы показать то, что я имею ввиду:
Код:
Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")

Global $WinHttpRequest[100]
$WinHttpRequest[0] = ObjCreate('WinHttp.WinHttpRequest.5.1')
$WinHttpRequest[0].Open('GET', 'http://autoit-script.ru/index.php?topic=18772.0', True)
$WinHttpRequest[0].Send()

$WinHttpRequest[1] = ObjCreate('WinHttp.WinHttpRequest.5.1')
$WinHttpRequest[1].Open('GET', 'http://autoit-script.ru/index.php?topic=18771.0', True)
$WinHttpRequest[1].Send()

$WinHttpRequest[2] = ObjCreate('WinHttp.WinHttpRequest.5.1')
$WinHttpRequest[2].Open('GET', 'http://autoit-script.ru/index.php?topic=18770.0', True)
$WinHttpRequest[2].Send()

$WinHttpRequest[3] = ObjCreate('WinHttp.WinHttpRequest.5.1')
$WinHttpRequest[3].Open('GET', 'http://autoit-script.ru/index.php?topic=18768.0', True)
$WinHttpRequest[3].Send()

$WinHttpRequest[4] = ObjCreate('WinHttp.WinHttpRequest.5.1')
$WinHttpRequest[4].Open('GET', 'http://autoit-script.ru/index.php?topic=18766.0', True)
$WinHttpRequest[4].Send()

$count = 5
Local $timer = TimerInit()
While $count
	If IsObj($WinHttpRequest[0]) Then
		If $WinHttpRequest[0].Status Then
			ConsoleWrite('+0 '  & $WinHttpRequest[0].Status& @CRLF)
			_Write(0)
			$WinHttpRequest[0] = 0
			$count -=1
		EndIf
	EndIf

	If IsObj($WinHttpRequest[1]) Then
		If $WinHttpRequest[1].Status  Then
			ConsoleWrite('+1 ' & $WinHttpRequest[1].Status & @CRLF)
			_Write(1)
			$WinHttpRequest[1] = 0
			$count -=1
		EndIf
	EndIf


	If IsObj($WinHttpRequest[2]) Then
		If $WinHttpRequest[2].Status Then
			ConsoleWrite('+2 ' & $WinHttpRequest[2].Status & @CRLF)
			_Write(2)
			$WinHttpRequest[2] = 0
			$count -=1
		EndIf
	EndIf

	If IsObj($WinHttpRequest[3]) Then
		If $WinHttpRequest[3].Status Then
			ConsoleWrite('+3 '  & $WinHttpRequest[3].Status & @CRLF)
			_Write(3)
			$WinHttpRequest[3] = 0
			$count -=1
		EndIf
	EndIf

	If IsObj($WinHttpRequest[4]) Then
		If $WinHttpRequest[4].Status Then
			ConsoleWrite('+4 '  & $WinHttpRequest[4].Status & @CRLF)
			_Write(4)
			$WinHttpRequest[4] = 0
			$count -=1
		EndIf
	EndIf

	Sleep(250)
WEnd

Func _Write($h)
	Local $timer = TimerInit()
	Do
		If $WinHttpRequest[$h].ResponseText Then ExitLoop
	Until TimerDiff($timer) > 4000
	ConsoleWrite('Timer: ' &  TimerDiff($timer) & @CRLF)
	ConsoleWrite(StringLen($WinHttpRequest[$h].ResponseText) & @CRLF)
EndFunc

Func _ErrFunc($oError)
    ; Do anything here.
EndFunc   ;==>_ErrFunc
 
Автор
I

ivanius

Знающий
Сообщения
74
Репутация
5
Но уже интересно, по поводу темы что я говорил вот она:http://autoit-script.ru/index.php?topic=16594.0
Сейчас буду проверять и смотреть, скорее всего этого будет достаточно, мне 5-ти - 10-ти обьектов с головой будет, просто после загрузки буду на его место след ссылку скармливать.
 
Автор
I

ivanius

Знающий
Сообщения
74
Репутация
5
Проверил вариант с обьектами, меня он полностью устраивает, даже не нужно костыли с потоками и подобным делать - это очень хорошо.
Просто я предполагал что тут как и в VBA загрузка идет когда пишешь $HTTP.Send($Data), там для обхода пришлось очень большие костыли делать.
Мозг взрывается уже - не могу думать.


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

На VBA я делал вот такую вот фитчу с XMLHTTP:
Код:
Sub ReadyStateChangeHandler()

  If XMLHttpReq.ReadyState = 4 Then
    Debug.Print sURL & " ReadyState is " & XMLHttpReq.ReadyState
    If XMLHttpReq.Status = 200 Then
      'Process the response here
      'hrefToHyperLink XMLHttpReq.responseText, ActiveCell
      Application.Run ResponseProcessor, XMLHttpReq, sURL, sMsg
      bIAmAvailable = True
    Else
      Application.Run ResponseProcessor, XMLHttpReq, sURL, sMsg
      Debug.Print "N " & XMLHttpReq.Status & ", Text " & XMLHttpReq.StatusText
    End If
  End If
End Sub

Public Sub XMLHttpCall(ByVal ReqMethod As String, _
                       ByVal url As String, ByVal uResponseProcessor As String, _
                       Optional ByVal AsyncCall As Boolean = True, _
                       Optional ByVal uMsg As String = "")
  Set XMLHttpReq = CreateObject("MSXML2.XMLHttp")

  If AsyncCall Then
    sURL = url: sMsg = uMsg
    ResponseProcessor = uResponseProcessor
    XMLHttpReq.OnReadyStateChange = Me
  End If
  With XMLHttpReq
    .Open ReqMethod, url, AsyncCall
    .setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36"
    .Send uMsg
    If Not AsyncCall Then Application.Run uResponseProcessor, XMLHttpReq, url, uMsg
  End With
End Sub
Есть ли такое на Автоит?


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

Ладно фигня это все...
Не понимаю все должно работать, а возвращает мне непонятные страницы как будто я ничего не отправлял :stars: :stars: :stars:
Код:
$WinHttpRequest[1] = ObjCreate('WinHttp.WinHttpRequest.5.1')
$WinHttpRequest[1].Open('POST', 'HTTP://www.arenda-piter.ru/master_result.php',True)
$WinHttpRequest[1].SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$WinHttpRequest[1].Send('sposob=1&tip_poiska=1&oper=1&term1=1&term3=3&region=1&est_ch_pro16=1%EA.%EA%E2&prod_ch0=%ED%E5+%E2%E0%E6%ED%EE&s_ch0=%ED%E5+%E2%E0%E6%ED%EE&r_ch1=%C0%E4%EC%E8%F0%E0%EB%F2%E5%E9%F1%EA%E8%E9&rlo_ch0=%ED%E5+%E2%E0%E6%ED%EE&m_ch0=%ED%E5+%E2%E0%E6%ED%EE&price_ch0=0&price1=&price2=&val=RUR&SearchGO=%C8%F1%EA%E0%F2%FC&var_number=&SearchGO=%C8%F1%EA%E0%F2%FC')


Короче даже в твоем приvере не отправляет данные, не знаю что случилось...
Если убрать асинхронность - то все нормально, а так - нет...
Да или если отправть не через send($Data) , а записать в адресную строку - то работает.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Мне возвращает результаты поиска
Код:
 Вы искали: 1к.кв.
Регион 	Санкт-Петербург
Категория поиска 	Сдают
Срок Аренды 	Длительный (от 11 мес и более), Короткий (от 1 до 10 мес включительно)
Район 	Адмиралтейский
Метро 	не важно
Цена 	не важно
Наличие Фото 	не важно

ivanius [?]
Да или если отправть не через send($Data) , а записать в адресную строку - то работает.
Если так работает, то POST не важен. Пользуйтесь InetGet
 
Автор
I

ivanius

Знающий
Сообщения
74
Репутация
5
мне важен, мне с это страницы нужно отправить потом пост на РАспечатку, а то я так 1000 вариантов буду год грузить, в распечатке они сразу все отображаются.
Странно у меня на 8.1 не работает код который выше привел.
Вобщем, у меня косяк где-то по середине, этот запрос выполняется, а уже следующий на печать - ничего не возвращает, может быть этот не успевает прогрузится - не понятно
Ладно знаю решение всех проблем - лечь поспать нужно, а то всю ночь сидел уже 22 часа не спал...
 
Верх