Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Получение HTML кода страницы


Автор: grazir555 22.4.2015, 03:40
Добрый день.
Написал программу:
Код

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.

 Подскажите как это победить

Автор: Akina 22.4.2015, 08:51
Перевести проблемные символы (диез и восклицательный знак) в хексы:
Код

https://www.mql5.com/en/signals/48366%23%21tab=trading&page=2

Автор: grazir555 23.4.2015, 01:36
Пробовал - не канает.

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

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

Автор: Akina 23.4.2015, 09:26
Цитата(grazir555 @  23.4.2015,  02:36 Найти цитируемый пост)
содержимое страницы полностью не влазиет в переменную String!

Нет такой буквы! Максимальный размер переменной типа String составляет около 2 Гбайт, и я не верю, что этого недостаточно для помещения в неё кода страницы.
Скорее просто не вся страница загружается. Либо ты её начинаешь выгребать, не дождавшись окончания загрузки (см. navigate2 event, readystate property).

Добавлено через 3 минуты и 40 секунд
Можешь попробовать Internet Transfer Control, методы OpenURL или Execute. При асинхронном вызове - не забывай про State Event и GetChunk Method.

Автор: grazir555 27.4.2015, 04:13
Вот - наглядный пример:

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

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

Автор: Akina 27.4.2015, 09:05
Это не феномен, это по-другому называется. Как - не скажу, ты обидишься.

Код

Private Sub Command2_Click()
Text1.Text = WebBrowser1.Document.Body.InnerHtml
MsgBox "HTML length = " & CStr(Len(WebBrowser1.Document.Body.InnerHtml)) & vbNewLine & _
       "Max String property length = " & CStr(Len(Text1.Text))
End Sub


Автор: grazir555 6.5.2015, 08:02
Умник чтоли??? Пост назад ты говорил "Максимальный размер переменной типа String составляет около 2 Гбайт, и я не верю, что этого недостаточно для помещения в неё кода страницы".

Так что не надо съезжать с темы и тыкать меня носом в текстбокс. Отвечай за свои слова и выполняй "Command4_Click".

А что касается текстбокса, то я в курсе что там лимит симболов 65 тыщ.

Автор: Akina 6.5.2015, 09:08
Господи, как же я не люблю самоуверенных дилетантов...

Цитата(grazir555 @  6.5.2015,  09:02 Найти цитируемый пост)
не надо съезжать с темы и тыкать меня носом в текстбокс.

Да? а кто тут возмущался, что 
Цитата(grazir555 @  23.4.2015,  02:36 Найти цитируемый пост)
Тут косяк другой - содержимое страницы полностью не влазиет в переменную String!

Я, что ли? 
Код

Private Sub Command5_Click()
textstring = WebBrowser1.Document.Body.InnerHtml
MsgBox "String length = " & CStr(Len(textstring))
End Sub

В переменную влезает всё. 

А что касается кода в проекте, где ты не находишь подстроки "</html>"... не поверишь, но это опять-таки твоё нежелание пользоваться мозгом.
Сделай вот так:
Код

Private Sub Command5_Click()
textstring = WebBrowser1.Document.Body.InnerHtml
MsgBox "String length = " & CStr(Len(textstring))
Open "b:\text.txt" For Output As #1 ' Тут есссно подставь свой путь 
Print #1, WebBrowser1.Document.Body.InnerHtml
Close
End Sub


Открой полученный файл - да хоть в блокноте. Теперь открой этот же УРЛ в браузере, попроси исходный код страницы. И сравни с сохранённым файлом. А потом обрати внимание, что ты тащишь из контрола. А тащишь ты из него WebBrowser1.Document.Body.InnerHtml ! Вот стОит ли удивляться, что он отдал тебе не весь текст, а только секцию <body>, а? в которой, это даже дураку ясно, искать тег </html> - по меньшей мере странное занятие...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)