Страницы: 1
RSS
Парсер котировок цен, Вариант простейшего парсера на vba
 
Добрый вечер! Баловался с попыткой вытащить котировки цен на золото в реальном времени, может кому будет интересен результат. Автоматический запрос делать не стал, запускается кнопкой, так как практической ценности не имеет, просто делал для тренировки. Также не стал включать в результаты алюминий и всякие другие вещи, типа урана. На сайте данные обновляются каждые несколько минут.
Работает через Internet Explorer, так что его наличие обязательно в системе. Иногда "задумывается" секунд на 15 при открытии страницы.
Скрытый текст
Изменено: aequit - 04.03.2020 10:55:32 (Немного исправил неверное определение цвета текста в зависимости от "+" или "-".)
 
Что-то в Вашем файле ни той самой кнопки, ни примера выводимого результата нет.
При попытке запустить макрос ничего не происходит у меня.

Я могу ошибаться, так как не вижу результата, но мне кажется, что код Power Query буквально из двух строк- даст примерно тот же результат и без заморочек с браузером.

Код
let
    Source = Web.Page(Web.Contents("https://www.kitco.com/mining/")),
    Headers = Table.PromoteHeaders(Source{1}[Data], [PromoteAllScalars=true])
in
   Headers
Изменено: Dyroff - 04.03.2020 00:35:53
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
Dyroff написал:
При попытке запустить макрос ничего не происходит
Макрос запускается из формы, которая, соответственно, запускается из модуля книги при загрузке файла:
Код
Private Sub Workbook_Open()
    UserForm1.Show 0
End Sub

Странно, что у Вас форма при открытии файла не запустилась, если макросы разрешены...
Цитата
Dyroff написал:
код Power Query буквально из двух строк
Спасибо за вариант, даже не предполагал, что PQ можно использовать для парсинга сайтов, обязательно изучу эту возможность.
Я в своём варианте больше практиковался с написанием паттернов регулярных выражений, которые наиболее однозначно вытаскивали нужные группы символов из большого и довольно сложного текста (спарсенного из веб-страницы).
 
Да и через VBA куда быстрее и проще без IE вытаскивать такую инф-цию:
Код
Function Get_MetallRate()
    Dim res, response As String
    Dim oXMLHTTP As Object
    Dim lp As Long, le As Long
    Dim sfnd As String

    On Error Resume Next
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
    If oXMLHTTP Is Nothing Then
        Exit Function
    End If
    With oXMLHTTP
        .Open "GET", "https://www.kitco.com/mining/", False
        .send
        Do While .readyState <> 4
          DoEvents
        Loop
        response = .responseText
    End With
    On Error GoTo 0
    If Len(response) Then
        response = LCase(Trim(Replace(Replace(Replace(response, vbTab, ""), vbNewLine, ""), " ", "")))
        lp = InStr(1, response, "<td><h4>Gold</h4></td>", 1)
        If lp > 0 Then
            sfnd = "<td>Bid/Ask</td><td>"
            If lp > 0 Then
                lp = InStr(lp, response, sfnd, 1)
                le = InStr(lp + Len(sfnd), response, "</td>", 1)
                res = Mid(response, lp + Len(sfnd), le - lp - Len(sfnd))
            End If
        End If
    End If
    res = Val(Replace(Replace(res, " ", ""), ",", "."))
    Get_MetallRate = res
End Function
Change и Low/High можно прям здесь же вытягивать без проблем, как и использовать вместо статичного Gold передаваемый в функцию параметр.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо, забрал вариант решения получения текста сайта из объекта MSXML2.XMLHTTP (командой oXMLHTTP.responseText) "в закрома". Перепробовал множество примеров получения кода html страницы, к сожалению, на многих сайтах спарсенный html не содержит нужных данных, которые можно получить, только сохранив именно текст web-страницы. Найденный единственный пример использовал для сохранения текста открытие в фоне Internet Explorer. Оказывается, можно всё сделать проще.
 
IE используется именно в тех случаях, когда доступа к HTML коду нет или нужные данные формируются скриптом(в этом случае сформированные данные внутри разметки не отображаются - только текст скрипта). Тогда бывает проще использовать InnerText из IE, чтобы получить именно отображаемый на странице текст, а не текст разметки.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх