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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ivanius [?]

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

Русское сообщество AutoIt


Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Если создать на каждый запрос свой WinHttp.WinHttpRequest.5.1, то, видимо работает.
Вот пример, конечно грубый и несовершенный с точки зрения кодинга, это все можно сделать одной функцией итп итд, но он только лишь для того, что бы показать то, что я имею ввиду:
Код: AutoIt [Выделить]
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
 


Оффлайн ivanius [?]

  • Новичок
  • *
  • Сообщений: 74

  • Автор темы
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Но уже интересно, по поводу темы что я говорил вот она:http://autoit-script.ru/index.php?topic=16594.0
Сейчас буду проверять и смотреть, скорее всего этого будет достаточно, мне 5-ти - 10-ти обьектов с головой будет, просто после загрузки буду на его место след ссылку скармливать.

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
ivanius  [?]
Цитировать
Найти как отправлять POST запросы через InetGet
Никак. На то он и InetGet.
Посмотри на TCPInet, там есть асинхронная закачка.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн ivanius [?]

  • Новичок
  • *
  • Сообщений: 74

  • Автор темы
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Проверил вариант с обьектами, меня он полностью устраивает, даже не нужно костыли с потоками и подобным делать - это очень хорошо.
Просто я предполагал что тут как и в VBA загрузка идет когда пишешь $HTTP.Send($Data), там для обхода пришлось очень большие костыли делать.
Мозг взрывается уже - не могу думать.


Добавлено: Январь 22, 2015, 07:30:43
На 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
Есть ли такое на AutoIt?


Добавлено: Январь 22, 2015, 09:55:13
Ладно фигня это все...
Не понимаю все должно работать, а возвращает мне непонятные страницы как будто я ничего не отправлял  :stars: :stars: :stars:
Код: AutoIt [Выделить]
$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) , а записать в адресную строку - то работает.
« Последнее редактирование: Январь 22, 2015, 11:01:22 от ivanius »

Русское сообщество AutoIt


Оффлайн inververs [?]

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

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

Оффлайн ivanius [?]

  • Новичок
  • *
  • Сообщений: 74

  • Автор темы
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
мне важен, мне с это страницы нужно отправить потом пост на РАспечатку, а то я так 1000 вариантов буду год грузить, в распечатке они сразу все отображаются.
Странно у меня на 8.1 не работает код который выше привел.
Вобщем, у меня косяк где-то по середине, этот запрос выполняется, а уже следующий на печать - ничего не возвращает, может быть этот не успевает прогрузится - не понятно
Ладно знаю решение всех проблем - лечь поспать нужно, а то всю ночь сидел уже 22 часа не спал...
« Последнее редактирование: Январь 22, 2015, 12:21:17 от ivanius »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
3060 Просмотров
Последний ответ Май 14, 2013, 13:10:12
от Vlasssov
8 Ответов
4192 Просмотров
Последний ответ Июль 30, 2012, 08:02:45
от zlo-kazan
2 Ответов
1013 Просмотров
Последний ответ Сентябрь 20, 2014, 19:23:14
от alex33
1 Ответов
1812 Просмотров
Последний ответ Май 20, 2015, 14:29:42
от alex33
11 Ответов
4162 Просмотров
Последний ответ Октябрь 19, 2015, 14:07:47
от Yashied
0 Ответов
593 Просмотров
Последний ответ Октябрь 16, 2015, 13:07:54
от madmasles
2 Ответов
1585 Просмотров
Последний ответ Июнь 13, 2016, 21:24:26
от Dk
1 Ответов
2460 Просмотров
Последний ответ Декабрь 06, 2018, 13:58:06
от kv68rab
1 Ответов
229 Просмотров
Последний ответ Январь 10, 2019, 15:58:37
от InnI
14 Ответов
1039 Просмотров
Последний ответ Май 15, 2019, 19:57:21
от CreatoR