Получить HTML код с невидимого WebBrowser (IE7)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 23.03.2009 (Пн) 4:22

Здравствуйте, нужно получить html код страницы с помощью контрола WebBrowser, причем чтобы он был невидимым.
Проблема заключается в том, что невидимый контрол не генерит событие WebBrowser1_DocumentComplete, а при использования цикла с проверкой READYSTATE вызывает ошибку Automation error.. Подскажите, есть ли человеческие способы это обойти, не делая размер контрола 1х1 пиксел и т.д.?
Заранее спасибо!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение MIT » 23.03.2009 (Пн) 8:06

Mihail_ писал(а):не делая размер контрола 1х1 пиксел
Задвинуть на позицию (-500; -500) :mrgreen:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 23.03.2009 (Пн) 12:11

Другого способа кроме предложенных неизвестно, однако возникает вопрос о конечной цели -- для чего планируется использовать невидимый WebBrowser, что надо сделать?
Salus populi suprema lex

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение RayShade » 23.03.2009 (Пн) 14:49

Сделать ему zorder=-1 и положить под какой нибудь groupbox или чего то типа.
I don't understand. Sorry.

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 23.03.2009 (Пн) 19:16

ну я пока и положил его с минимальным размером под кнопку, но это ж через задницу..

И можно ли вообще реализовать получение html кода в одной функции?
Я пробовал в цикле Do While WebBrowser1.ReadyState <> READYSTATE_COMPLETE вместо DoEvents использовать sleep, но тогда функция тупо зависает, не передавая управление WebBrowser1_DocumentComplete

dr.MIG приходиться реализовывать именно так из-за этой темы, на сайт, с которого грабится информация поставили защиту (как минимум кукис) и простые функции получения кода теперь не работают.. а ie проходит все проверки

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение RayShade » 23.03.2009 (Пн) 19:22

Достаточно просто повесить нужный тебе код в WebBrowser1_DocumentComplete, и не надо никаких циклов с Do While WebBrowser1.ReadyState <> READYSTATE_COMPLETE.

Механика такова - ты вызвал Navigate, WB пошел грузит страницу. Все - не надо ничего ждать. Когда он ее получит, будет событие и вызовется его обработчик.
I don't understand. Sorry.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 23.03.2009 (Пн) 23:14

RayShade писал(а):Достаточно просто повесить нужный тебе код в WebBrowser1_DocumentComplete, и не надо никаких циклов с Do While WebBrowser1.ReadyState <> READYSTATE_COMPLETE.

Механика такова - ты вызвал Navigate, WB пошел грузит страницу. Все - не надо ничего ждать. Когда он ее получит, будет событие и вызовется его обработчик.


Ничего подобного, надо ждать и именно в цикле. Код в событии DocumentComplete в зависимости от конкретной страницы, загружаемой в него, может выполниться произвольное количество раз. Причем первое событие произойдёт необязательно на READYSTATE_COMPLETE.

Mihail_, я так и не понял, зачем тебе событие DocumentComplete? Код который должен находиться у тебя там может быть спокойно размещен сразу за циклом с DoEvents.
Salus populi suprema lex

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Amed » 24.03.2009 (Вт) 0:05

dr.MIG, надо делать так, как Рей говорит.

Но в событии DocumentComplete() надо первым делом проверить состояние документа:
Код: Выделить всё
If WebBrowser1.ReadyState = READYSTATE_COMPLETE Then ' документ загружен полностью

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 24.03.2009 (Вт) 0:14

И тогда вдобавок надо будет устанавливать флаг выполнения кода. Потому что этот READYSTATE_COMPLETE может произойти несколько раз.
Salus populi suprema lex

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Amed » 24.03.2009 (Вт) 0:22

И в каких же случаях это событие происходит более одного раза?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 24.03.2009 (Вт) 0:33

Код: Выделить всё
Private Sub Form_Load()
    WebBrowser1.Navigate "http://yandex.ru"
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    If WebBrowser1.ReadyState = READYSTATE_COMPLETE Then
        MsgBox "Ой..."
    End If
End Sub
Salus populi suprema lex

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение RayShade » 24.03.2009 (Вт) 11:23

Так и где тут, ожидание в цикле? :)
I don't understand. Sorry.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 24.03.2009 (Вт) 12:00

Так это как раз без цикла. Это пример, который просил Amed постом выше.
Salus populi suprema lex

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение VBTerminator » 24.03.2009 (Вт) 16:23

Mihail_ писал(а):Здравствуйте, нужно получить html код страницы с помощью контрола WebBrowser, причем чтобы он был невидимым/ ... Подскажите, есть ли человеческие способы это обойти, не делая размер контрола 1х1 пиксел и т.д.?

Есть. Юзать компонент Inet из библиотеки Microsoft Internet Transfer Control.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 24.03.2009 (Вт) 18:42

VBTerminator писал(а):Есть. Юзать компонент Inet из библиотеки Microsoft Internet Transfer Control.

Исходя из постановки вопроса не думаю, что автору нужно это. Если надо просто получить HTML-код, то тогда и Microsdoft WinHTTP Services использовать можно. Но тут автору скорее всего необходимо иметь невидимый WebBrowser с загруженной в него страницей, видимо для возможности мгновенно отобразить его без ожидания загрузки или ещё для чего...
Salus populi suprema lex

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Amed » 24.03.2009 (Вт) 18:55

dr.MIG, ну и все-таки уточню, что READYSTATE_COMPLETE происходит только один раз :)

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 24.03.2009 (Вт) 19:13

Ну значит у меня WebBrowser такой :lol: . Объясните тогда с точки зрения банальной эрудиции это:
Вложения
24.03.png
24.03.png (19.88 Кб) Просмотров: 3891
Salus populi suprema lex

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение iGrok » 24.03.2009 (Вт) 19:14

Amed писал(а):dr.MIG, ну и все-таки уточню, что READYSTATE_COMPLETE происходит только один раз :)

У кого как..
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
    WebBrowser1.Navigate "http://yandex.ru"
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    Debug.Print "WB_DC: " & WebBrowser1.ReadyState
    If WebBrowser1.ReadyState = READYSTATE_COMPLETE Then
        MsgBox "Îé..."
        Debug.Print "READYSTATE_COMPLETE"
    End If
End Sub


Код: Выделить всё
WB_DC: 3
WB_DC: 4
READYSTATE_COMPLETE
WB_DC: 4
READYSTATE_COMPLETE
label:
cli
jmp label

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение dr.MIG » 24.03.2009 (Вт) 19:40

iGrok писал(а):У кого как..

Что и требовалось доказать :D .
Salus populi suprema lex

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Amed » 24.03.2009 (Вт) 20:17

Я был неправ.
Намотал на ус и плюнул в кипу разработчикам WebBrowser. Подлецы!

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 25.03.2009 (Ср) 0:29

Попытаюсь объяснить еще раз:

Нужно сделать функцию которая бы открывала заданную страницу и возвращала ее html код (который впоследствие будет сложно обработан другими функциями и помещать код обработки в DocumentComplete - не рационально), используя при этом элемент WebBrowser (т.к. другие способы, которые не поддерживают кукис например и т.д. блокируются сайтом) - это реально?

-
Функция DocumentComplete действительно будет вызываться несколько раз если на сайте грузятся всякие банеры и т.д., но у нее есть параметр URL, который можно сравнивать со своей url-кой, дело в другом.

Заранее спасибо!

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение djalex777 » 25.03.2009 (Ср) 12:33

Можно использовать XmlHTTP или WinHTTP. Принимаешь cookies с помощью заголовка Set-Cookies и Set-Cookie2, а отправляешь с помощью Cookies

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 25.03.2009 (Ср) 19:30

Спасибо! Будем надеиться что пока не забанят по UserAgent'у.. больно он палевный у WinHttp "Mozilla/4.0 (cоmpatible; Win32; WinHttp.WinHttpRequest.5)"

Для тех кто не в теме:

Project -> References -> Microsoft WinHTTP Services
C:\WINDOWS\system32\WINHTTP.dll

Код: Выделить всё
Dim http_req As New WinHttpRequest, results As String
http_req.Open "GET", "http://ya.ru/"
http_req.Send
     If http_req.Status = 200 Then
          results = http_req.ResponseText
          Clipboard.SetText results
          'Debug.Print results
          Beep
     End If

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 27.03.2009 (Пт) 0:54

djalex777 писал(а):Можно использовать XmlHTTP или WinHTTP. Принимаешь cookies с помощью заголовка Set-Cookies и Set-Cookie2, а отправляешь с помощью Cookies

а можно по-подробнее про WinHTTP и Cookies?
Заранее спасибо!

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение SSecurity » 27.03.2009 (Пт) 1:09

вообще если исходить из того, что все это TCP-IP протокол.... так почему же не заюзать сокеты, туда какой хочешь можешь заголовок впихнуть а кукисы можешь записывать куда удобно ... - что самое полезное - ты получаешь чистый HTML код ... :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 27.03.2009 (Пт) 20:44

ну сюда тоже можно заголовок воткнуть, полезная функция оказалась, но как быть с кукис?

-заголовок
Код: Выделить всё
Private Sub Form_Load()
Dim http_req As New WinHttpRequest, results As String
http_req.Open "GET", "http://lafox.net/utils/userinfo/"


http_req.SetRequestHeader "Accept-Language", "ru"
http_req.SetRequestHeader "Accept-Charset", "Windows-1251"
http_req.SetRequestHeader "Accept-Encoding", "gzip, deflate"

http_req.SetRequestHeader "Content-Language", "ru"
http_req.SetRequestHeader "Content-Charset", "Windows-1251"
http_req.SetRequestHeader "Content-Encoding", "gzip, deflate"
http_req.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=Windows-1251"

http_req.SetRequestHeader "CACHE-CONTROL", "no-cache"
http_req.SetRequestHeader "CONNECTION", "Keep-Alive"
http_req.SetRequestHeader "USER-AGENT", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"

http_req.Send
     If http_req.Status = 200 Then
          results = http_req.ResponseText
          'Clipboard.SetText results
          'Debug.Print results
          Beep
     End If
End Sub

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение djalex777 » 27.03.2009 (Пт) 21:08

Так я же написал выше - для записи используется заголовок Cookie.
Т.е. применительно к твоему коду
Код: Выделить всё
...
http_req.SetRequestHeader "Cookie", "тут текст твоего Cookie"
...

Mihail_
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 31.03.2008 (Пн) 20:57

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение Mihail_ » 31.03.2009 (Вт) 16:21

Спасибо большое!

Только единственное, как показала практика - не все сервера соблюдают стандарты, чтобы именовать заголовки Set-Cookies, Set-Cookie2 и т.д. - поэтому надежнее получать весь вывод сервера а его уже парсить, пример кода:

Код: Выделить всё
Private Sub Form_Load()
Dim http_req As New WinHttpRequest, results As String
http_req.Open "GET", "http://ya.ru/"
http_req.Send

     If http_req.Status = 200 Then
          results = http_req.GetAllResponseHeaders
          Debug.Print results
          Beep
     End If
End Sub



На сервере, котором я тестил - заголовок выглядел так:
Server: HrenDogonish/0.9
Date: Tue, 31 Mar 2009 12:44:48 GMT
Connection: Close
Content-Type: text/html; charset=windows-1251
Expires: Sun, 30 Mar 2008 20:00:00 GMT
Pragma: no-cache
Cache-control: no-cache
P3P: policyref="/w3c/p3p.xml", CP="UNI"
Set-Cookie: phpbb2_data=[вырезано]; expires=Wed, 31 Mar 2010 12:44:47 GMT; path=/phpBB/; domain=[вырезано]
cache-control: private, pre-check=0, post-check=0, max-age=0
set-cookie: phpbb2_sid=[вырезано]; path=/phpBB/; domain=[вырезано]
pragma: no-cache


Передавать значения кукис надо через точку с запятой, тоесть http_req.SetRequestHeader "Cookie", "param1=value; param2=value" и т.д.

djalex777 еще раз спасибо, вы очень помогли!

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение trash » 02.04.2009 (Чт) 14:09

Amed писал(а):Я был неправ.
Намотал на ус и плюнул в кипу разработчикам WebBrowser. Подлецы!

Они не виноваты в, мягко скажем, недалекости отдельных пользователей. Намек:
Debug.Print "READYSTATE_COMPLETE", URL

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Получить HTML код с невидимого WebBrowser (IE7)

Сообщение djalex777 » 02.04.2009 (Чт) 16:56

trash писал(а):Они не виноваты в, мягко скажем, недалекости отдельных пользователей. Намек:
Debug.Print "READYSTATE_COMPLETE", URL


Ты видно не любишь читать полностью, что люди пишут...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 42

    TopList  
cron