Получить данные с Интернет

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Получить данные с Интернет

Сообщение alibek » 16.04.2003 (Ср) 10:07

Народ, помогите примером. Сам с IE никогда не работал и не знаю даже, как подступиться.

Вот адрес: http://www.cbr.ru/currency_base/D_print.asp?date_req=01/01/2003

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

Начало должно быть такое
Код: Выделить всё
Set inet = CreateObject("InternetExplorer.Application")

но что дальше для меня темный лес.

Если кто сталкивался, выложите подобный пример.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение RayShade » 16.04.2003 (Ср) 10:25

Я бы начал немного не так:



set obj = createobject("Excel.Application")



и потом с помощью Web Query вытащил бы нужные данные а потом делал бы с ними все что угодно ;)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 10:48

У меня не установлен Web Query. Да и не хочу я его использовать, лучше использовать непосредственно то, что нужно (InternetExplorer).

Пока, чтобы упростить себе жизнь, я подключил в References объект ShDocVw и использую раннее связывание (Dim inet As InternetExplorer), потом я эту библиотеку отключу и заменю InternetExplorer на Object.
Я дошел до сюда:
Код: Выделить всё
Set inet = New InternetExplorer
inet.Navigate "http:\\..."
Do While inet.Busy:DoEvents:Loop
With inet.Document.All.Tags("TABLE")
  ...
End With
inet.Quit
Set inet = Nothing

Но я не знаю, как извлечь содержимое <TD>. Есть свойство Title, но оно отражает не содержимое, а подсказку (Tooltip).
Надо знать структуру объектной модели, но я никогда не работал с HTMLDocument и поиски в MSDN проходят со скрипом.
Lasciate ogni speranza, voi ch'entrate.

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 16.04.2003 (Ср) 11:25

Может проще взять и пропарсить HTML?
Или конечно можно с помощью MSHTML инфы полно в MSDN.
Это более системно, но сложнее в понятии.

Если в этой таблице меняются только данные то IMHO проще парсер накатать..
Moderator VBStreets
---------------------------

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 11:33

Э... Парсер-то конечно намного проще, но неправильно это. Страничку придется вначале скачать, т.е. устанавливать соединение (напрямую или через прокси), писать код для приема данных и т.п.
По уму надо почитать MSDN, там все написано. Проблема в том, что там слишком много всего написано :)
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение RayShade » 16.04.2003 (Ср) 11:39

Ну в общем у меня получилось достучаться вот так:



inet.Document.All.tags("TABLE").Item(1).cells.Item(1).innerhtml



Вытащило из первой клетки то что там было написано. По аналогии, думаю, догадаешься ;)



Если вопросы будут то пиши:)

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 16.04.2003 (Ср) 11:45

А так ты страничку не скачиваешь :lol:
Вот RayShade показал как через MSHTML сделать.
Но опять будет работать только если в страницу не запихнут еще таблицу.
Moderator VBStreets
---------------------------

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 14:30

Спасибо, оно самое :)
Lasciate ogni speranza, voi ch'entrate.

Edward
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 14.08.2002 (Ср) 11:54
Откуда: Москва

Сообщение Edward » 16.04.2003 (Ср) 14:44

Так как здесь пишут одни только многозвездчатые :lol: :lol: :lol:
Позвольте встрять имеющему одну звездочку :D (вдруг потом зачтется :D :D :D )
я получив документ в Webbroser
Получал коллекцию таблиц.
Ну ты это умеешь.
Дальше.
У каждой таблицы есть коллекция Rows!!!
то есть есть это строки.
Потом можем из коллекции обратиться по индексу (т.е к какой по счету) к конкретной строке.
А каждая строка имеет коллекцию Cells !!!
а достучаться до каждого поля можно по индексу!!!
Ну если нужен код пиши.

У меня тоже вопрос к многозвездчатым!
я в основном работал только с Microsoft Internet Controls

А где бы простое описание и пример по работе InternetExplorer.Application найти, подскажите плиз , это все таки лучше чем использовать Webrowser
Большой Сенькс.
Удачи.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 15:40

Edward, ну ты меня прямо совсем за неграмотного держишь :)
Прошу
Код: Выделить всё
Public Function GetInetCBRRates(ByVal CurrencyID As String, Optional ByVal RateDate) As Currency
Dim inet As Object, itbl As Object, U As String
Dim curID As String, curCode As String, curName As String, curK As Long, curRate As Currency
Dim R As Long, C As Long, Z As String, fFind As Boolean
Const URL As String = "http://www.cbr.ru/currency_base/D_print.asp?date_req=#D#/#M#/#Y#"
Const READYSTATE_UNINITIALIZED As Long = 0&
Const READYSTATE_LOADING As Long = 1&
Const READYSTATE_LOADED As Long = 2&
Const READYSTATE_INTERACTIVE As Long = 3&
Const READYSTATE_COMPLETE As Long = 4&
If IsMissing(RateDate) Then RateDate = Now Else RateDate = CDate(RateDate)
U = URL
U = Replace(U, "#D#", Format$(RateDate, "DD"))
U = Replace(U, "#M#", Format$(RateDate, "MM"))
U = Replace(U, "#Y#", Format$(RateDate, "YYYY"))
Set inet = CreateObject("InternetExplorer.Application")
inet.Navigate U
Do Until inet.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
Set itbl = inet.Document.All.Tags("TABLE").Item(2)
For R = 1 To itbl.Rows.Length - 1
  For C = 1 To itbl.Rows(R).Cells.Length
    Z = Trim$(itbl.Rows(R).Cells(C - 1).InnerText)
    Select Case C
      Case 1
        curID = Z
      Case 2
        curCode = Z
      Case 3
        Z = Replace(Z, " ", "")
        Z = Replace(Z, ",", ".")
        curK = CLng(Z)
        If curK = 0 Then curK = 1
      Case 4
        curName = Z
      Case 5
        Z = Replace(Z, " ", "")
        Z = Replace(Z, ",", ".")
        curRate = CCur(Z)
    End Select
    If C = 5 Then
      If CurrencyID = curID Then fFind = True
      If UCase$(CurrencyID) = UCase$(curCode) Then fFind = True
    End If
    If fFind Then Exit For
  Next C
  If fFind Then Exit For
Next R
Set itbl = Nothing
inet.Quit
Set inet = Nothing
If fFind Then GetInetCBRRates = curRate / curK
End Function


Все работает замечательно, но... Но я опять здесь.
Дело в том, что мне надо определить средний курс доллара за месяц. Формула: C=(GetInetCBRRates("840",D1)+GetInetCBRRates("840",D2))/2
Так вот, когда функция вызывается два раза подряд, то на второй раз случаются жуткие глюки и процедура не может создать объект inet. Думаю, дело в том, что экземпляр эксплорера не успевает выгрузиться после inet.Quit.
Подскажите способ, как проверить, что inet выгружен? Я пробовал так:
Код: Выделить всё
Do Until inet Is Nothing
DoEvents
Loop

но не помогает.
Последний раз редактировалось alibek 16.04.2003 (Ср) 16:40, всего редактировалось 1 раз.
Lasciate ogni speranza, voi ch'entrate.

Edward
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 14.08.2002 (Ср) 11:54
Откуда: Москва

Сообщение Edward » 16.04.2003 (Ср) 15:57

Ну ты сам писал :
-Сам с IE никогда не работал и не знаю даже, как подступиться
-Как можно получить доступ к ячейкам этой таблице из программы?
:D :D :D
ВОт я и влез .
Ну извини тогда :lol: :lol: :lol: :lol: :lol:
вот и отвечай потом на такие вопросы :( :( :(
:lol: :lol: :lol:

alexshm
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 27.12.2002 (Пт) 17:53

Доступ к журналу IE

Сообщение alexshm » 23.12.2003 (Вт) 4:49

Братцы, а не подскажете, как запретить IE.Aplication записывать в журнал открываемые документы или как стереть последнюю запись?

elsen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 05.04.2004 (Пн) 0:23
Откуда: Где то Далеко идут Дожди

Сообщение elsen » 14.11.2005 (Пн) 0:24

alibek
не могу разобраться по теме, поясни пож-та подробнеи

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 14.11.2005 (Пн) 6:20

Все работает замечательно, но... Но я опять здесь.
Дело в том, что мне надо определить средний курс доллара за месяц


может один раз скачать все данные в массив, а оттуда работать с ними? Тогда уже не нужно будет заново создавать никаких объектов.
ХЎ

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.11.2005 (Пн) 9:59

d3drm писал(а):может один раз скачать все данные в массив, а оттуда работать с ними? Тогда уже не нужно будет заново создавать никаких объектов.

ЦБ дает список валют на определенную дату.
Если нужно взять курс доллара за две разные даты, то одним запросом их не получить, надо два подряд.

elsen, а что непонятного?
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.11.2005 (Пн) 14:36

Так вот, когда функция вызывается два раза подряд, то на второй раз случаются жуткие глюки и процедура не может создать объект inet.

Старые грабли. Внимательно прочитай последние посты топика "Хук на IE" и вместо CreateObject("InternetExplorer.Application") лучше все-таки использовать WebBrowser.
Лучший способ понять что-то самому — объяснить это другому.

elsen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 05.04.2004 (Пн) 0:23
Откуда: Где то Далеко идут Дожди

Сообщение elsen » 14.11.2005 (Пн) 15:49

alibek

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

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

Сообщение ALX_2002 » 14.11.2005 (Пн) 17:38

Вот. Сляпал на скорую руку.

Получает все ячейки таблицы со всеми её свойствами.

Перебирает их, выводит их значение и закрашивает их красным цветом.

Принимай :)
Вложения
TABLE.rar
(1.59 Кб) Скачиваний: 134

elsen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 05.04.2004 (Пн) 0:23
Откуда: Где то Далеко идут Дожди

Сообщение elsen » 14.11.2005 (Пн) 23:05

ALX_2002
спасибо. но
и радость его была недолгой .
не работает выводит ошибку доходя до
For Each TR In TABLE.rows
пишет
Object variable or with block variable not set
:oops: :roll:
извени что достаю вопросом в инете код пока не нашел,кроме твоего

elsen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 05.04.2004 (Пн) 0:23
Откуда: Где то Далеко идут Дожди

Сообщение elsen » 14.11.2005 (Пн) 23:08

ALX_2002

sorry
ошибку дает сдесь
Set TABLE = DOCUMENT.getElementsByTagName("TABLE")(2)

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

Сообщение ALX_2002 » 15.11.2005 (Вт) 20:13

О как ! Действительно ! :shock: :shock:

А у меня вчера работала. Сейчас тестю - НИ В КАКУЮ !


БРЕД ПОЛНЫЙ :shock: :shock: :shock: :oops:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.11.2005 (Вт) 20:17

Архив не качал - но ждёте ли вы полной прогрузки документа там?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

elsen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 05.04.2004 (Пн) 0:23
Откуда: Где то Далеко идут Дожди

Сообщение elsen » 15.11.2005 (Вт) 20:43

GSerg

он до загрузки не доходит,выдает ошибку

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 16.11.2005 (Ср) 10:06

мля я же писал Внимательно прочитай последние посты топика "Хук на IE"
Надо было дать ссылку тем, кто в танке.
Несмотря на на срабатывание WB_DocumentComplete, IE не успевает создать объект document, если бы вы прошлись по WB_DocumentComplete пошагово, то это бросилось бы в глаза.
Рекомендации:
1. Не производить никаких действий в событии DocumentComplete, использовать его только для установления флажка о том, что документ загружен.
2. Ждать этого флажка с дуэвентсами, а потом подождать еще немного, например по таймеру. Это потому, что, хотя сам document будет не nothing, возможны ошибки доступа к его деткам.
3. Чтобы все работало, форма с броузером должна быть видима. Пока она невидима, навигация не начинается.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 16.11.2005 (Ср) 10:18

Наслаждайтесь
Вложения
table.rar
(5.87 Кб) Скачиваний: 146
Лучший способ понять что-то самому — объяснить это другому.

elsen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 05.04.2004 (Пн) 0:23
Откуда: Где то Далеко идут Дожди

Сообщение elsen » 16.11.2005 (Ср) 17:06

примногоблагодарен,то что надо
Danke !. :lol: :!: :D

Firestorm
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 946
Зарегистрирован: 02.05.2002 (Чт) 14:36
Откуда: Russia

Сообщение Firestorm » 17.11.2005 (Чт) 1:12

у меня есть недавний код, где разбирается подобная таблица... только там автоматически скачивается файл на диск, потом "обрабатывается" :lol:
...просто гламурный падонак...
_________________
reborn! v.2 :twisted:
_________________

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

Сообщение ALX_2002 » 17.11.2005 (Чт) 13:59

http://bbs.vbstreets.ru/viewtopic.php?t=20917

Я тож разобрался как сделать. Решил проверять Document.ReadyState в ProgressChange.

Кому интересно - взгляните в топике пример. :wink:


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

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

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

    TopList