Что нового

[Сеть, интернет] Поиск по сайту, получить ответ

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Страница поиска по сайту http://www.zipzip.ru/?state=prqry&brand=&kind=
для общего поиска нужно заполнить последнее поле ввода
после окончания поиска появляется страница с одним и тем же адресом (неважно что мы искали) http://www.zipzip.ru/?
то есть меняется часть страницы
сделать поиск и получить ответ в html не сложно, я делаю это при помощи IE.au3
Код:
Local $oIE = _IECreate("http://www.zipzip.ru/?state=prqry&brand=&kind=", 1, 0, 1, 1)
	Local $oForm = _IEFormGetCollection($oIE, 2)
	Local $oInput = _IEFormElementGetObjByName($oForm, "descr")
	_IEFormElementSetValue($oInput, 'данные для поиска')
	_IEFormSubmit($oForm, 1)
	Local $oAttach = _IEAttach("http://www.zipzip.ru/?", 'url')
	Local $sHTML = _IEDocReadHTML($oAttach); ответ

хотелось бы не использовать IE. проблемы с ним разные
есть ли другие способы сделать то же самое?
искал по форуму, народ в основном интересует логирование на сайтах. здесь этого не нужно
думал использовать WinHttp, но так и не понял как применить. знаний маловато
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В IE нажимаете F12, переходите в режим отладки. Вкладка по работе с сетью (если нету, то сделайте в другом браузере). Включаете прослушку сети.
Заполняете форму, нажимаете submit, увидите ушедший запрос. Вам нужно из таблицы запросов искать тип text/html рядом будет написан метод POST или GET
Если посмотреть подробно запрос, то увидите адрес куда отправляется, все заголовки и тело запроса. Значит нужно все это повторить на winhttp, лучше всего этим
Работа с winhttp начинается с открытия соединения функцией _WinHTTPOpen
вторым этапом идет подключение к домену функцией _WinHTTPConnect($hOpen, 'домен')
дальше отправляете запрос функцией _WinHttpSimpleRequest($hConnect,тип(get/post), адрес куда отправлять(относительно домена),реферер,данные для отправки, заголовки)
Например:
Код:
$hOpen = _WinHTTPOpen($user_agent)
$hConnect = _WinHTTPConnect($hOpen, 'shop.turkcell.de')
$request_response = _WinHttpSimpleRequest($hConnect, 'GET', '/reg/services/getConfig.php', $referer, Default, $javascript_head)

В ответ придет нужная страница, если кодировка страницы отличается по умолчанию, то укажите нужную в последнем параметре $iMode

В конце закрываете хэндлы
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

Данные для отправки формируются так: имя=__WinHttpURLEncode(значение) знак & итд



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

Вот в твоем случае так:
Код:
#include <winhttp.au3>

$hOpen = _WinHTTPOpen('User-Agent	Mozilla/5.0 (Windows NT 6.1; Trident/7.0; EIE11;RURUWOL; rv:11.0) like Gecko')
$hConnect = _WinHTTPConnect($hOpen, 'www.zipzip.ru')

$data = 'brand=' & _
		'&kind=' & _
		'&state=' & _
		'&state=prlst' & _
		'&model=' & _
		'&descr=' & __WinHttpURLEncode('данные для поиска') & _
		'&send=' & __WinHttpURLEncode('Выдать товары')

$headers = 'Accept: text/html, application/xhtml+xml, */*' & @CRLF
$headers &= 'Accept-Encoding: ' & 'deflate' & @CRLF
$headers &= 'Accept-Language: ' & 'ru-RU' & @CRLF
$headers &= 'Content-Type: ' & 'application/x-www-form-urlencoded' & @CRLF
$headers &= 'Host: ' & 'www.zipzip.ru' & @CRLF
$headers &= 'Cache-Control: ' & 'no-cache' & @CRLF



$sHTML = _WinHttpSimpleRequest($hConnect, 'POST', '/?', 'http://www.zipzip.ru/?state=prqry&brand=&kind=', $data, $headers)
ConsoleWrite($sHTML & @CRLF)

_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
нет. возвращает не результат поиска. есть один момент
в коде страницы два элемента '&descr='
я использую второй. хотя, возможно это и не важно. но пока не работает
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ищу samsung - возвращается 322 результата.
Если мы говорим о странице http://www.zipzip.ru/?state=prqry&brand=&kind=
и поиск по Искать в описании и в каталожном N:
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проблема оказалась в строке
Код:
'&descr=' & __WinHttpURLEncode('данные для поиска') & _

если пишем поисковые данные на русском, то нет результата поиска. как я писал выше
изменил так
Код:
'&descr=' & 'данные для поиска' & _

все заработало
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Точно. Оказалось что __WinHttpURLEncode кодирует в UTF-8, а для сайта нужно ANSI.
Тогда функция такая, или же оставлять без кодирования, как у вас, если нет разницы.

Код:
Func __WinHttpURLEncode_ANSI($sData)
	Local $aData = StringToASCIIArray($sData, Default, Default, 1)
	Local $sOut
	For $i = 0 To UBound($aData) - 1
		Switch $aData[$i]
			Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
				$sOut &= Chr($aData[$i])
			Case 32
				$sOut &= "+"
			Case Else
				$sOut &= "%" & Hex($aData[$i], 2)
		EndSwitch
	Next
	Return $sOut
EndFunc   ;==>__WinHttpURLEncode
 
Верх