Что нового

Получить исходник страницы, приближенный к исходнику из IE

The Dream

Новичок
Сообщения
393
Репутация
3
Подскажите пожалуйста, какой способ, вернее каким способом можно получить исходник страницы, приближенный к тому, что выдает IE?

Спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
dream.reckless,
Какая у Вас цель?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Код:
_IEDocReadHTML
_IEBodyReadHTML


Код:
InetRead
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
madmasles, цель такая - потом из этого исходника извлечь все ссылки. Правда как это сделать, сейчас тоже думаю.

если это производить через IE - то бывает он иногда "заглючит"..
 

_dron_

Знающий
Сообщения
84
Репутация
8
Код:
$html = $oIE.document.body.innerHTML


только объект должен быть виден
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
dream.reckless [?]
цель такая - потом из этого исходника извлечь все ссылки.
Если на сайте нет авторизации или каких-то действий, прежде чем появятся нужные ссылки, то, ИМХО, лучше использовать функцию InetRead() и паттерн к ней, в противном случае, кроме функции _IEBodyReadHTML() и паттерна к ней, есть еще варианты, достаточно сложные (TCP* функции, _WinHttp* функции, объекты WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP.6.0 и т.д. и т.п.)
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
madmasles, я тоже к этому пришел, но вот как извлекать ссылки из исходника.. или создавать новую тему?

Регулярные выражения. Можно с помощью них, но тогда возникает погрешность - что не все будут учтены. Тогда может лучше исходник вставлять в обьект ie, и оттуда уже.. или глупость?
 

_dron_

Знающий
Сообщения
84
Репутация
8
лучше регулярными

http://autoit-script.ru/index.php/topic,4052.0.html
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
dream.reckless [?]
но вот как извлекать ссылки из исходника.. или создавать новую тему?
Создавайте тему, если не получается самому получить все нужные ссылки.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
_dron_ наверно лучше, но увы, не понимаю как реализовать
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Если всётаки получать ссылки через IE то пример:
Код:
#include <IE.au3>
$oIE = _IE_Example ("basic")

$aLinks = _IELinkGetCollection($oIE)
For $oLink In $aLinks
MsgBox(0, "tst link", "Link url: "&$oLink.href&@CRLF&"link text: "&$oLink.innerTEXT)
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
alex33 [?]
получать ссылки через IE то пример
А если нужны не все ссылки, а только определенные? И через InetRead() гораздо быстрее.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186

erlik

Продвинутый
Сообщения
317
Репутация
84
dream.reckless
У меня в программе DllViewer сделано примерно так:
Код:
Func ReadPage($sSource); $sSource - URL сайта
	Local $sText = InetRead($sSource,$DOWNLOADOPTION); $DOWNLOADOPTION -опции загрузки
	Return BinaryToString($sText)
EndFunc

Local $sText = ReadPage($sSource)
Local $aMatches = StringRegExp($sText,  $sPattern,1); $sPattern - шаблон для извлечения ссылок определенного вида; у меня же используется массив паттернов, который перебирается в цикле
; а так можно все ссылки получить - шаблон взят из справки
;Local $aMSSearchLinks = StringRegExp($sText, '(?si)(?:.*?)?(https?:\/\/[\w.:]+\/?(?:[\w\/?&=.~;\-+!*_#%])*)',3); массив ссылок
;_ArrayDisplay($aMSSearchLinks)


InetRead и регулярные выражения действительно очень быстро работают. Вот замеры из моего кода.
Код:
Старт=0.00351081836737291
Чтение первой страницы msdn =949.080406956511
Pattern [1]=<a href="(http://msdn.microsoft.com/en-us/library/windows/desktop/.+?)"
ссылка[1]=http://msdn.microsoft.com/en-us/library/windows/desktop/aa374973(v=vs.85).aspx
Поиск в первой странице msdn =949.571482675647
Скачиваем страницу описания с http://msdn.microsoft.com/en-us/library/windows/desktop/aa374973(v=vs.85).aspx
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
erlik спасибо большое, работает.

Но не всегда с задачей справляется InetRead - бывает так, что происходит в этом месте так называемое "зависание", редко, но бывает. Это напрямую зависит от сайта (будет возможность - продемонстрирую пример).

А вы сравнивали InetRead и InetGet? Они наверно одинаковы. А если с IE - то конечно разница ощутимая.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А вы сравнивали InetRead и InetGet? Они наверно одинаковы.
Ну можно сказать и так... :smile: с той лишь разницей что одна контент читает в переменную, а другая записывает в файл.
P.S. Я думаю что InetRead быстрей т.е. не надо открывать / создавать, записывать и закрывать файл.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
dream.reckless
Насчет сравнения - тут сложно сказать. Я у себя посмотрел - время скачивания страниц сильно разнится от сайтов. И InetGet() и InetRead() - они у меня в паре используются - выдают очень разные результаты. С одного у меня скачивается за 200 мс, c другого за 2500 мс, а то и больше. На одном сайте загрузка может подвиснуть и 'заморозить' скрипт, на другом никогда не виснет. Так что тут сам протестируй и поймешь какая функция будет у тебя быстрее работать.



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

Вот замеры того, как эти функции у меня скачивают страницы: (c msdn работают обе, c pinvoke.net - только InetGet())
Код:
начинает InetRead()
Старт=0.00351081836737291
Чтение первой страницы msdn =1313.06055152323
Pattern [1]=<a href="(http://msdn.microsoft.com/en-us/library/windows/desktop/.+?)"
ссылка[1]=http://msdn.microsoft.com/en-us/library/windows/desktop/dd162719(v=vs.85).aspx
Поиск в первой странице msdn закончен=1313.6130665638
далее работает InetGet()
Скачиваем страницу описания с http://msdn.microsoft.com/en-us/library/windows/desktop/dd162719(v=vs.85).aspx
Загрузка страницы=3128.47093766498
Открытие файла =3129.5882556104
Чтение из файла =3135.17352878059
Поиск в найденном =3138.57112325562
Запись найденного =3142.4251241184
----------------------------------
работает только InetGet()
Старт=0.0030719660714513
Скачиваем страницу описания с http://www.pinvoke.net/default.aspx/USER32.FillRect
Загрузка страницы=257.680024891702
Открытие файла =258.547197028443
Чтение из файла =261.113605254993
$sHREFs=<a href="http://www.pinvoke.net/default.aspx/Structures/RECT.html">RECT</a>
  
Поиск в найденном =268.217746221372
Запись найденного =272.354367962729
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
erlik, вот именно InetGet() и не "подвисает". Верно? У меня там где InetRead() подвисал, там InetGet() - нет.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
dream.reckless
Вот здесь у меня как раз наоборот. Подвисает загрузка с msdn - и именно когда идет очередь работы InetGet(). Хотя именно она и не должна подвисать, так как включен асинхронный режим загрузки. Почему так - сам не пойму.
Хотя может быть я InetGet() не совсем правильно использую - поэтому и появляются фризы.
Но в любом случае есть большая зависимость от сайта с которого качаешь.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
erlik, не знаю как у тебя, но я также использую таймер при InetGet(). Просто не уточнил. А так это наверно не зависание - а большой обьем данных, или к этому "зависанию" приводит разве что-то кроме обьема полученных данных? Вот я и использую таймер. По истечению 30 секунд, загрузка прерывается.
 
Верх