Получение HTML кода страницы

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

Получение HTML кода страницы

Сообщение grazir555 » 22.04.2015 (Ср) 3:53

Добрый день.
Написал программу:
Код: Выделить всё
Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Const INTERNET_OPEN_TYPE_DIRECT = 1
Const INTERNET_OPEN_TYPE_PROXY = 3
Const INTERNET_FLAG_RELOAD = &H80000000
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hOpen As Long, ByVal sURL As String, ByVal sHeaders As String, ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer



Private Sub Command1_Click()
Dim hInternetSession As Long
Dim hURL As Long
Dim bResult As Boolean
Dim cBuffer As String * 30000 '4096

'Make internet connection.
hInternetSession = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)

'Make connection to desired page.
hURL = InternetOpenUrl(hInternetSession, Text2, vbNullString, 0, 0, 0)

'Read page into memory buffer.
bResult = InternetReadFile(hURL, cBuffer, 30000, dwBytesRead)
Text1 = cBuffer
'Close down connections.
InternetCloseHandle (hURL)
InternetCloseHandle (hInternetSession)
End Sub


При открытии "https://www.site.com/4366" всё проходит гладко, но
при открытии "https://www.site.com/4366#!tab=din&page=2" возникает ошибка 400 - не правильный URL.

Подскажите как это победить
Последний раз редактировалось grazir555 23.04.2015 (Чт) 2:49, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение HTML кода страницы

Сообщение Хакер » 22.04.2015 (Ср) 11:43

Вообще-то WinInet — глючная библиотека, и стоит отказаться от её использования в пользу WinHTTP.

Во-вторых, стоит смириться, что второй URL действительно неправильный с точки зрения протокола HTTP.

Вся часть, которая стоит после символа «#» в запросе к серверу никогда не участвует, сервер её никогда не обрабатывает, никогда не видит. Эта часть обрабатывается браузером, JavaScript-кодом, в нём загруженным. Так что ни WinInet, ни WinHTTP тут ничем не помогут.

Тебе придётся либо написать свой собственный браузерный движок с поддержкой JS (можешь в этом деле пользоваться WinInet/WinHTTP для загрузки с сервера данных), либо воспользоваться одним из готовых движков.

Либо, если тебе очень повезёт, и веб-сайт поддерживает дуальную обработку URL, можешь «#!» в своём URL заменить на символ «?», в надежде на то, что сам веб-сервер правильно обработает такой URL и даст то, что тебе нужно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.04.2015 (Ср) 22:25

Хакер писал(а):можешь «#!» в своём URL заменить на символ «?»

Вообще-то должно быть как-то так:
Код: Выделить всё
https://www.mql5.com/en/signals/48366?_escaped_fragment_=tab%3Dtrading%26page%3D2
только не пойму, надо энкодить символы или нет...

grazir555
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.04.2015 (Ср) 3:51

Re: Получение HTML кода страницы

Сообщение grazir555 » 23.04.2015 (Чт) 1:33

Спасибо за детальное объяснение.
Замена #! не привела ни к чему хорошему.


В принципе, я пробовал использовать контролл WebBrowser. Открывал первый URL, находил в нём ссылку перехода на следующую страницу, программно нажимал на неё, WebBrowser переходил на второй URL. Затем с помощью WebBrowser.Document.Body.InnerHtml получал нужный мне HTML код второй страницы. А ннет! Тут косяк другой - содержимое страницы полностью не влазиет в переменную String!

Может знаете как WebBrowser.Document.Body.InnerHtml распихать хотя-бы в массив из строк?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение HTML кода страницы

Сообщение Хакер » 23.04.2015 (Чт) 1:42

grazir555 писал(а):Тут косяк другой - содержимое страницы полностью не влазиет в переменную String!

Глупости.

grazir555 писал(а):Может знаете как WebBrowser.Document.Body.InnerHtml распихать хотя-бы в массив из строк?

Зачем это вообще нужно? Что планируется делать с HTML-представлением, помещённым в строку? Опять разбирать в дерево? Так и работай сразу с деревом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.04.2015 (Чт) 10:03

grazir555 писал(а):Тут косяк другой - содержимое страницы полностью не влазиет в переменную String!

В смысле, в textbox?
Или в watch?
Выводи в Immediate.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Получение HTML кода страницы

Сообщение Debugger » 23.04.2015 (Чт) 15:55

(на правах оффтопика)
grazir555 писал(а):Тут косяк другой - содержимое страницы полностью не влазиет в переменную String!

Интересно, из каких наблюдений делаются такие потрясные выводы.

grazir555
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.04.2015 (Ср) 3:51

Re: Получение HTML кода страницы

Сообщение grazir555 » 27.04.2015 (Пн) 4:14

Вот - наглядный пример:

https://cloud.mail.ru/public/32JEUdfULEPE/test.zip

Как объясните этот феномен???

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение HTML кода страницы

Сообщение Хакер » 27.04.2015 (Пн) 4:20

grazir555 писал(а):Вот - наглядный пример:
https://cloud.mail.ru/public/32JEUdfULEPE/test.zip

О боже, облако Мэил Ру... Что мешает загружать файлы прямо на форум?

grazir555 писал(а):Как объясните этот феномен???

В чём заключается феномен-то? На что смотреть там? На что обращать внимание?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Получение HTML кода страницы

Сообщение ALX_2002 » 27.04.2015 (Пн) 10:31

Хм. Действительно феномен. Все кнопки понажимал - программа об ошибках не сообщила. :shock: ФЕНОМЕН !

grazir555
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.04.2015 (Ср) 3:51

Re: Получение HTML кода страницы

Сообщение grazir555 » 06.05.2015 (Ср) 8:21

Цензура, маты вырезаны. alibek.
Гнев на темную сторону приведет тебя. С постоянным баном. Китайское предупреждение.


Инструкция:
1. Нажать кнопку "Открыть URL"
2. Подождать загрузки страницы (будет видно в верхней части окна)
3. Нажать "Засунуть HTML в String"
4. Дождаться сообщения с текстом "засунул"
5. Нажать кнопку "Найти позицию закрывающего тэга </html> в String"
6. Если выскочит сообщение с цифрой больше нуля, значит я дурак, Если сообщение - цифра ноль, значит читай ВОПРОС.

Итак, ВОПРОС:
При нажатии на кнопку "Найти позицию закрывающего тэга </html> в String" программа ищет в переменной типа String, в которую заблаговременно помещён HTML код открытой ранее страницы, позицию закрывающего тэга "</html>", который обязательно должен присутствовать там если данный код загружен полностью. Но т.к возвращаемая позиция = 0, значит такого тэга там нет, значит почему-то HTML код страницы загружен не полностью. Вопрос: почему он загружен в переменную String не полностью?

P.S. Удостовериться в наличии этого тэга непосредственно в странице вы можете нажав правой кнопкой мыши на окне браузера и выбрав пункт "Просмотр HTML-кода", а затем прокрутить до конца вниз.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.05.2015 (Чт) 19:17

grazir555 писал(а):При нажатии на кнопку "Найти позицию закрывающего тэга </html> в String"

А если подумать?

Код: Выделить всё
Text1 = WebBrowser1.Document.Body.InnerHtml

Код: Выделить всё
<!doctype html>
<html>
  <head>
    <title>Что такое body?</title>
  </head>
  <body>
    <p>Всё что находится внутри тега body - это innerHTML для body.</p>
    <p>Ты видишь где-то тут закрывающий тег для html?</p>
  </body>
</html>


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList