Что нового

поисковый запрос на zakupki.bashneft.ru

tref777

Новичок
Сообщения
38
Репутация
2
Добрый День!
Нужна помощь в написании поискового запроса на сайте http://zakupki.bashneft.ru
Например как отправить GET или POST запрос с ключевым словом "проект"
Попытка сделать это по шаблону, найденном на сайте возвращает код странички - результат широковещательного запроса ' '.

Код:
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект

$oRequest.Open('POST', 'http://zakupki.bashneft.ru', 0) ;Создаём соеденение, указываем адрес страницы
$oRequest.SetRequestHeader('User-Agent', 'au3browser') ;Указываем заголовок User-Agent
$oRequest.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))
$oRequest.Send('ctl00$BodyHolder$ContentHolder$ctl22=проект') ;отправляем запрос
$sData = $oRequest.ResponseText

ConsoleWrite($sData)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Запрос отправляется методом POST в форму http://zakupki.bashneft.ru/Default.aspx
Заполняются переменные: ctl00$BodyHolder$ContentHolder$ctlXX
Где XX = 11,12,15,16,17,18,21,22,26
и еще ctl00$BodyHolder$ContentHolder$ctl45$PageSizeDropdown
Кроме того, вам при первоначальной загрузки страницы, нужно найти и получить значение __VIEWSTATE
И его же перенаправить.
После отправки запроса, получить новый URL, если WinHTTP делает автоматический переход ( я не вкурсе) , то получите страницу с результатами поиска.



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

+ Еще может нужно будет передавать Referer
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
Мда...как все сложно.. :( Боюсь я сам тут не разберусь
Насколько я понял это какой-то нестандартный POST запрос?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Нет, почему же :smile: не сложно, это стандартный запрос для aspx приложений. (я про __VIEWSTATE)
А такие переменные опрделил сам сайт. Вам на WinHTTP принципиально нужно?
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
Нет, не принципиально. Мне надо написать функцию для сайта, которая будет отправлять список запросов и извлекать данные о закупках. Вот камень преткновения оказался для меня этот сайт, с остальными вроде все гладко :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
tref777,
А может проще все это делать в скрытом окне IE?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Поищи только библиотеку WinINet.au3
Код:
#include "WinINet.au3"

$sReg_pattern_add = '\s*=[\s"' & "']*([^<>\r\n'" & '"]+)' ;\s*=[\s"']*([^<>\r\n'"]+) Тут находим значение между ковычками (если есть)
Global Const $sReg_VIEWSTATE = "(?i)\Q__VIEWSTATE\E.*?\Qvalue\E" & $sReg_pattern_add
Global Const $User_Agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"

Global $hInternetOpen, $hInternetConnect
Global $sFORMDATA = ""

_PostData()


Func _PostData()
	Local $readfile = Binary("")
	Local $textData, $aBalance, $iBalance, $pattern
	Local $hOpenRequest, $SendRequest
	$hInternetOpen = _WinINet_InternetOpen($User_Agent, $INTERNET_OPEN_TYPE_PRECONFIG)
	$hInternetConnect = _WinINet_InternetConnect($hInternetOpen, $INTERNET_SERVICE_HTTP, 'zakupki.bashneft.ru', $INTERNET_DEFAULT_HTTP_PORT)


	$hOpenRequest = _WinINet_HttpOpenRequest($hInternetConnect, "GET", "/Default.aspx")
	$SendRequest = _WinINet_HttpSendRequest($hOpenRequest, 'Accept: text/html' & @CRLF, Default)

	Do
		$readfile &= _WinINet_InternetReadFile($hOpenRequest, 5000)
	Until @error Or Not @extended
	$textData = BinaryToString($readfile, 4) ;UTF8

	$aVIEWSTATE = StringRegExp($textData, $sReg_VIEWSTATE, 1)
	If @error Then Return SetError(2, 1)
	$__VIEWSTATE = $aVIEWSTATE[0]
	_WinINet_InternetCloseHandle($hOpenRequest)

	$hOpenRequest = _WinINet_HttpOpenRequest($hInternetConnect, "POST", "/Default.aspx")
	$__VIEWSTATE = _URLEncode($__VIEWSTATE)
	
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl11', '23.06.2012')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl12', '24.07.2012')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl15', '')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl16', '-1')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl17', '-1')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl18', '')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl21', '')
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl22', 'бесперебойного') ;Ключевые слова
	_addFormData('ctl00$BodyHolder$ContentHolder$ctl26', 'найти')
	_addFormData('__VIEWSTATE', $__VIEWSTATE)

	$vOptional = StringToBinary($sFORMDATA)
	$SendRequest = _WinINet_HttpSendRequest($hOpenRequest, 'Content-Type: application/x-www-form-urlencoded' & @CRLF, $vOptional)
	$readfile = Binary("")
	Do
		$readfile &= _WinINet_InternetReadFile($hOpenRequest, 5000)
	Until @error Or Not @extended
	$sFORMDATA = ''
	$textData = BinaryToString($readfile, 4) ;UTF8
;~ 	ConsoleWrite($textData & @LF)
	_WriteToDfile("out.html",$textData)
EndFunc   ;==>_PostData

Func _addFormData($sname, $value)
	$value = _UnicodeToUrl($value)
	If $sFORMDATA Then
		$sFORMDATA &= "&" & $sname & "=" & $value
	Else
		$sFORMDATA &= $sname & "=" & $value
	EndIf
EndFunc   ;==>_addFormData

Func _UnicodeToUrl($sStr)
	Local $sOut
	For $i = 1 To StringLen($sStr)
		$chr = StringMid($sStr, $i, 1)
		Switch AscW($chr)
			Case 1040 To 1103
				$bin = StringToBinary($chr, 4)
				$fByte = StringMid($bin, 3, 2)
				$sByte = StringMid($bin, 5, 2)
				$sOut &= "%" & $fByte & "%" & $sByte
			Case Else
				$sOut &= $chr
		EndSwitch
	Next
	Return $sOut
EndFunc   ;==>_UnicodeToUrl

Func _URLEncode($sToEncode)
	$sToEncode = StringReplace($sToEncode, "!", "%21")
	$sToEncode = StringReplace($sToEncode, "#", "%23")
	$sToEncode = StringReplace($sToEncode, "$", "%24")
	$sToEncode = StringReplace($sToEncode, "&", "%26")
	$sToEncode = StringReplace($sToEncode, "'", "%27")
	$sToEncode = StringReplace($sToEncode, "(", "%28")
	$sToEncode = StringReplace($sToEncode, ")", "%29")
	$sToEncode = StringReplace($sToEncode, "*", "%2A")
	$sToEncode = StringReplace($sToEncode, "+", "%2B")
	$sToEncode = StringReplace($sToEncode, ",", "%2C")
	$sToEncode = StringReplace($sToEncode, "/", "%2F")
	$sToEncode = StringReplace($sToEncode, ":", "%3A")
	$sToEncode = StringReplace($sToEncode, ";", "%3B")
	$sToEncode = StringReplace($sToEncode, "=", "%3D")
	$sToEncode = StringReplace($sToEncode, "?", "%3F")
	$sToEncode = StringReplace($sToEncode, "@", "%40")
	$sToEncode = StringReplace($sToEncode, "[", "%5B")
	$sToEncode = StringReplace($sToEncode, "]", "%5D")
	Return $sToEncode
EndFunc   ;==>_URLEncode

Func _WriteToDfile($sFileName, $sDataToWrite)
;~ 	Return 1 ; Ничего не писать. Убрать если нужен анализ.
	Local $hFile = FileOpen($sFileName, 2 + 128)
	FileWrite($hFile, $sDataToWrite)
	FileClose($hFile)
EndFunc   ;==>_WriteToDfile
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
madmasles,
Можно и так, но это на самый крайний вариант. Хотелось бы все-таки обойтись без "костылей" типа IE, заодно поверхностно освоить принципы работы web, на примерах AutoIT.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
+ Юникод можно передать так еще:
Код:
$value = StringToBinary($value,4)
$value = BinaryToString($value,1)
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
inververs,
Спасибо! Завтра посижу, попробую вникнуть в суть кода.
Посоветуйте хорошую литературку, написанную простым языком, чтобы можно было разобраться в основах и технологии работы сайтов. Т.е. я не хочу становиться вебмастером, но чтобы знаний было достаточно для написания несложных запросов к веб серверу.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
tref777
Я такую литературу не знаю :smile: Просто почитайте про запросы POST и GET (этого будет достаточно)
 
Верх