Что нового

Проблема с InetRead() - кэширование

Delikanov

Новичок
Сообщения
7
Репутация
0
Использую функцию для скачивания страницы с интернета:

Код:
$sHTML = BinaryToString(InetRead("http://site"), 1)


Функция крутится в цикле и страница скачивается 1 раз в минуту и потом происходит парсинг текста.
Устанавливаю флаг 1 - принудительно перезагрузить с удалённого сайта. Но флаг не работает, данные как-то кэшируются и в переменную $sHTML записывается тоже самое, что и на предыдущем шаге, хотя на самом деле страница уже изменилась. При этом если вручную обновить страницу в IE, то новая версия закачается и в InetRead()

Кто-нибудь сталкивался с таким поведением? Подскажите способ, как верно получать актуальные данные с веб страницы.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Delikanov [?]
как верно получать актуальные данные с веб страницы
Как вариант, использовать TCP функции (на форуме уже есть примеры получения страницы, поищи что то вроде _HttpRead/Get).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Delikanov,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
D

Delikanov

Новичок
Сообщения
7
Репутация
0
Разобрался. Функция InetRead() реально какая-то глючная, заменил ее на вот так :
Код:
_IEAction($oIE, "refresh")
_IELoadWait($oIE)
$sHTML = _IEDocReadHTML($oIE)


Правда приходится держать открытым IE и в цикле обновлять страницу, но такой вариант меня тоже устраивает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Delikanov [?]
заменил ее на вот так
Ужас, ради этого использовать IE...
Вот функция получения кода с использованием TCP:

Код:
$sHtml = _HTTPRead("http://google.com")

Func _HTTPRead($sURL, $iRemove_Header = 1)
	TCPStartup()
	
	Local $sHost = StringRegExpReplace($sURL, ".*://(.*?)/.*", "\1")
	Local $sPage = StringRegExpReplace($sURL, ".*://.*?(/.*)", "\1")
	
	Local $sName_To_IP = TCPNameToIP($sHost)
	Local $iSocket = TCPConnect($sName_To_IP, 80)
	
	If $iSocket = -1 Then
		TCPShutdown()
		Return SetError(1, 0, "")
	EndIf
	
	Local $sCommand = "GET " & $sPage & " HTTP/1.0" & @CRLF
	
	$sCommand &= "Host: " & $sHost & @CRLF
	$sCommand &= "User-Agent: AutoIt/" & @AutoItVersion & " (Windows; U; Windows NT 5.1; en-US; rv:1.8.1)" & @CRLF
	$sCommand &= "Referrer: " & $sHost & @CRLF
	$sCommand &= "Connection: close" & @CRLF & @CRLF
	
	Local $iBytesSent = TCPSend($iSocket, $sCommand)
	
	If $iBytesSent = 0 Then
		TCPShutdown()
		Return SetError(2, @error, 0)
	EndIf
	
	Local $sRecv = "", $sCurrentRecv
	
	While 1
		$sCurrentRecv = TCPRecv($iSocket, 16)
		
		If @error <> 0 Then
			ExitLoop
		EndIf
		
		If $sCurrentRecv <> "" Then
			$sRecv &= $sCurrentRecv
		EndIf
	WEnd
	
	TCPCloseSocket($iSocket)
	TCPShutdown()
	
	$sRecv = BinaryToString(StringToBinary($sRecv), 4)
	
	If $iRemove_Header Then
		$sRecv = StringRegExpReplace($sRecv, '^[\S\s]+?(\r?\n){2}', '')
	EndIf
	
	Return $sRecv
EndFunc
 
Верх